5/14/2012

ASP.NET: Tạo bộ tìm kiếm gần đúng (tương đối) giống như tamtay.vn, google.com

Default.aspx

<form id="form1" runat="server">
    <div style="text-align: center">
        <span style="color: #ff6600"><strong>TÌM KIẾM TƯƠNG ĐỐI</strong></span><br />
        <span style="font-size: 10pt; font-family: Verdana">
        Nhập từ cần tìm:</span>
        <asp:TextBox ID="TextBox1" runat="server" Width="421px"></asp:TextBox>
        <asp:Button ID="btnSeach" runat="server" Text="Seach" OnClick="btnSeach_Click" /><br />
        <br />
        <hr />
        <asp:Label ID="lblSQL" Text="" runat="server"></asp:Label>
    </div>
    </form>

Default.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
/// Author: Trương Đức Tài
/// 09/11/2009 (dd/mm/yyy)
/// Phone: 0979.116118
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using TimKiemGanDung.Utilities;

namespace TimKiemGanDung
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnSeach_Click(object sender, EventArgs e)
        {
            string keyWord = TextBox1.Text;
            string sql = string.Empty;
               
            sql = SearchApproximate.ApproximateSearch(keyWord);
            lblSQL.Text = sql;

            // Khi có được chuỗi sql như trên các bạn biết phải làm gì rồi chứ?
            // Thanks!
        }
    }
}

SearchApproximate.cs

using System;
using System.Data;
using System.Configuration;
/// Author: Trương Đức Tài
/// 09/11/2009 (dd/mm/yyy)
/// Phone: 0979.116118
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;

namespace TimKiemGanDung.Utilities
{
    public class SearchApproximate
    {
        // Phương thức trả về câu lệnh SQL dùng truy vấn dữ liệu
        public static string ApproximateSearch(string keyWord)
        {
            string sql = "SELECT * FROM Employer WHERE FullName LIKE ";
            return sql + "N'" + Exec(keyWord) + "' OR FullName LIKE N'" + Exec(ConvertVN.Convert(keyWord)) + "'";
        }

        // Phương thức chuyển đổi một chuỗi ký tự: Nếu chuỗi đó có ký tự " " sẽ thay thế bằng "%"
        public static string Exec(string keyWord)
        {
            string[] arrWord = keyWord.Split(' ');
            StringBuilder str = new StringBuilder("%");
            for (int i = 0; i < arrWord.Length; i++)
            {
                str.Append(arrWord[i] + "%");
            }
            return str.ToString();
        }
    }
}

ConvertVN.cs

/// Author: Trương Đức Tài
/// 09/11/2009 (dd/mm/yyy)
/// Phone: 0979.116118
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace TimKiemGanDung.Utilities
{
    public class ConvertVN
    {
        // Phương thức Convert một chuỗi ký tự Có dấu sang Không dấu
        public static string Convert(string chucodau)
        {
            const string FindText = "áàảãạâấầẩẫậăắằẳẵặđéèẻẽẹêếềểễệíìỉĩịóòỏõọôốồổỗộơớờởỡợúùủũụưứừửữựýỳỷỹỵÁÀẢÃẠÂẤẦẨẪẬĂẮẰẲẴẶĐÉÈẺẼẸÊẾỀỂỄỆÍÌỈĨỊÓÒỎÕỌÔỐỒỔỖỘƠỚỜỞỠỢÚÙỦŨỤƯỨỪỬỮỰÝỲỶỸỴ";
            const string ReplText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyyAAAAAAAAAAAAAAAAADEEEEEEEEEEEIIIIIOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYY";
            int index = -1;
            char[] arrChar = FindText.ToCharArray();
            while ((index = chucodau.IndexOfAny(arrChar)) != -1)
            {
                int index2 = FindText.IndexOf(chucodau[index]);
                chucodau = chucodau.Replace(chucodau[index], ReplText[index2]);
            }
            return chucodau;
        }
    }
}

Mã nguồn tải tại đây

(Đã hoàn thành 99%, các bạn hãy chạy thử và hoàn thành tiếp bộ tìm kiếm với kết nối CSDL nhé)
Author: Trương Đức Tài

Categories:
If You Enjoyed This Post Please Take 5 Seconds To Share It.

2 comments:

Hay....nhung hoi thieu chut xiu... doi minh lam not roi post len tiep

bạn ơi cho mình hỏi cái code like N'%st%' Nếu st là những từ có âm ô or ò thì nó lại search ko ra kết quả
ví dụ: chuỗi mẹ: ... nhờ pha lập công của abc trong vòng 16m ...
st=nhờ pha lập -> ra kết quả
st=nhờ pha lập công --> ko ra kết quả
st=công --> không ra kết quả
st=ô -->không ra kết quả
st=vòng --> không ra kết quả
st=ò -->không ra kết quả
st=của abc --> ra kết quả

Mong được bạn giúp đỡ

Post a Comment

 
  • Followers