Xử lý tìm kiếm trong website Asp.Net

Trong bài này mình sẽ làm môt ví dụ nhỏ về tìm kiếm trong website Asp.net. Tìm kiếm chuyên sâu với CSDL khổng lồ đòi hỏi rất nhiều thuật toán và kỹ thuật xử lý dữ liệu rất phức tạp, tuy nhiên để làm một chức năng tìm kiếm nhỏ áp dụng cho website với dữ liệu vừa phải thì không khó...

Ví dụ này thực hiện tìm kiếm dữ liệu từ một table đơn giản trong SQL. Mình thiết kế table chỉ gồm 3 trường như hình dưới.

1. Query tìm kiếm trong SQL

- Bản chất của việc tìm kiếm là việc chúng ta sẽ lập trình để thực thi một câu lệnh SQL với keyword được nhập từ người dùng, cấu trúc lệnh SQL cho việc tìm kiếm trong ví dụ này như dưới đây. Trong trường hợp này mình cho phép tìm từ khóa trong cả tiêu đề "Title" và nội dung "Content"

select * from [Articles] 
where ([Title] like '%keyword%' or [Content] like '%keyword%')

- Đối với dữ liệu tìm kiếm là Tiếng Việt, kiểu dữ liệu nvarchar hay ntext trong SQL, chúng ta cần thêm tiền tố N trước keyword

select * from [Articles] 
where ([Title] like N'%Võ Khánh Thụy%' or [Content] like N'%Võ Khánh Thụy%')

- Đối với câu lệnh trên khi thực hiện tìm kiếm, nếu người dùng gõ "Võ Thụy" thì sẽ không ra. Vậy để xử lý vấn đề này chúng ta cần tách chuỗi từ khóa ra và tìm riêng từng từ một, sẽ cho kết quả tốt hơn.

select * from [Articles] 
where ([Title] like N'%Võ%' or [Content] like N'%Võ%') 
and ([Title] like N'%Khánh%' or [Content] like N'%Khánh%') 
and ([Title] like N'%Thụy%' or [Content] like N'%Thụy%')

2. Xử lý từ khóa người dùng nhập vào

- Với yêu cầu tìm kiếm mà người dùng nhập vào từ form tìm kiếm sẽ phải qua một số bước xử lý dữ liệu như loại bỏ các ký tự cấm trong SQL, xử lý tiếng việt không dấu...Tuy nhiên trong phần này mình chỉ muốn nói qua về cách tách chuỗi từ khóa được nhập vào để tăng kết quả tìm kiếm như mình đã đề cập ở trên. Mình sử dụng đoạn code dưới đây để tách chuỗi từ khóa người dùng nhập vào thành 1 mảng các từ khóa độc lập

// Turn user input to a list of keywords.
string[] keywords = txtKeyWord.Text.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

- Với mảng từ khóa được tách ra chúng ta cần lập trình vòng lặp để tạo được câu Query SQL như ý đồ ở trên. Mình sử dụng hàm dưới đây để tạo truy vấn và lấy kết quả trả về.

/// <summary>
/// Search records from database.
/// </summary>
/// <param name="keywords">the list of keywords</param>
/// <returns>all found records</returns>
public List<Article> Search(List<string> keywords)
{
// Generate a complex Sql command.
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.Append("select * from [Articles] where ");
foreach (string item in keywords)
{
   sqlBuilder.AppendFormat("([Title] like '%{0}%' or [Content] like '%{0}%') and ", item);
}

// Remove unnecessary string " and " at the end of the command.
string sql = sqlBuilder.ToString(0, sqlBuilder.Length - 5);

return QueryList(sql);
}

/// <summary>
/// Excute a Sql command.
/// </summary>
/// <param name="cmdText">Command text</param>
protected List<Article> QueryList(string cmdText)
{
     List<Article> articles = new List<Article>();
     SqlCommand cmd = GenerateSqlCommand(cmdText);
            using (cmd.Connection)
            {
                SqlDataReader reader = cmd.ExecuteReader();
                // Transform records to a list.
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        articles.Add(ReadArticle(reader));
                    }
                }
            }
     return articles;
}

3. Hightlight Keyword

- Sau khi hoàn thành các bước ở phần 1 & 2, chúng ta đã có thể lấy được kết quả tìm kiếm trả về, và các bạn có thể bind dữ liệu vào repeate, listview hay datalist... thì tùy vào mục đích sử dụng. Phần này mình muốn nói thêm về cách đánh dấu từ khóa tìm kiếm trên danh sách kết quả tìm kiếm trả về trên giao diện người dùng.

- Đầu tiên mình sẽ viết css cho phân hightlight keyword của mình

<style type="text/css">
        span.keyHightLight{
            background-color:yellow !important;
            display:inline !important;
        }
</style>

- Việc còn lại bây giờ sẽ là lập trình 1 vòng lặp để thay thế các từ khóa có trong nội dung trả về (ở đây kết quả tìm kiếm trả về là 1 danh sách List<Article>) theo dạng như sau:

 keyword thay thế bằng <span class='keyHightLight'>keyword</span>. 

- Chắc mình viết đến đây các bạn đã hiểu cách mình làm ở đây. Đoạn code phần này như sau:

//hight light keyword
foreach (string keyItems in keyList)
{
  foreach (Article items in _ls)
     {
       items.Title = items.Title.Replace(keyItems, "<span class='keyHightLight'>" + keyItems   + "</span>");
       items.Content = items.Content.Replace(keyItems, "<span class='keyHightLight'>" +   keyItems + "</span>");
     }
 }

4. Kết luận.

- Sau khi thực hiện hightlight kết quả tìm kiếm sẽ có dạng như hình dưới.

- Với cách làm trên mình thấy chạy khá ổn khi tìm kiếm với lượng dữ liêu vừa phải, tuy nhiên nếu xử lý với dữ liệu lớn sẽ không được tối ưu. Bạn nào có cách xử lý hay hơn thì góp ý cho mình nhé.

- Ví dụ đầy đủ download ở file đính kèm.

 

 

Download Source

Related Post


Cải thiện tốc độ và hiệu suất web ASP.NET-phần 3
Thursday, March 13, 2014
Hai phần trước mình đã giới thiệu cho các bạn một số cách để tăng tốc và cải thiện hiệu suất cho web ASP.NET. Hôm nay mình xin tiếp tục giới thiệu một số các thủ thuật khác khi code và sử dụng tài nguyên trên web ASP.NET
Cải thiện tốc độ và hiệu suất web ASP.NET-phần 2
Tuesday, March 11, 2014
Nhiều bạn cho rằng web aspnet có tốc độ xử lý dữ liệu chậm hơn so với web làm bằng các công nghệ khác như php hay jsp nhưng thực tế không phải hoàn toàn như vậy. Nếu biết cách tối ưu code bạn sẽ thấy điều đó là không chính xác.  
Search

Đăng ký nhận bài mới


Category

Blog Archive