NEWS

[C#] Tìm kiếm gần đúng Full Text Search sử dụng thư viện Lucene.NET

[C#] Tìm kiếm gần đúng Full Text Search sử dụng thư viện Lucene.NET
Đăng bởi: Thảo Meo - Lượt xem: 3439 10:42:47, 31/03/2023DEVEXPRESS   In bài viết

Xin chào các bạn, bài viết hôm nay mình tiếp tục giới thiệu các bạn thư viện Lucene.NET dùng để tìm kiếm gần đúng (Full Text Search) tìm kiếm trên đoạn văn bản.

[C#] How to use Lucene.NET Full Text Search Engine

Lucene.NET là gì?

lucence_thumb

Lucene là một thư viện mã nguồn mở, được sử dụng để tạo chỉ mục và tìm kiếm văn bản trong các ứng dụng máy tính.

Thư viện Lucene được viết bằng ngôn ngữ Java và được phát hành dưới giấy phép Apache, có thể sử dụng miễn phí cho các mục đích thương mại.

Lucene cung cấp các tính năng cho phép tạo và quản lý chỉ mục văn bản, bao gồm cả việc tìm kiếm các từ khóa trong tài liệu, sắp xếp các kết quả tìm kiếm theo mức độ phù hợp, tìm kiếm thông qua các trường cụ thể trong tài liệu, tìm kiếm từ tương đồng và các tính năng khác.

Lucene đã trở thành một phần quan trọng trong việc xây dựng các ứng dụng tìm kiếm văn bản, bao gồm các hệ thống quản lý nội dung, các công cụ tìm kiếm trên website và các ứng dụng di động.

Lucene đã được đưa vào sử dụng rộng rãi bởi các công ty lớn như IBM, Yahoo, và LinkedIn.

Video hướng dẫn sử dụng thư viện Lucene.NET C#:

Cài đặt thư viện từ Nuget:

HƯỚNG DẪN TÌM KIẾM FULL TEXT SEARCH (Tìm kiếm toàn văn bản) USING LUCENE.NET


NuGetInstall-Package Lucene.Net -Version 4.8.0-beta00016

NuGetInstall-Package Lucene.Net.Analysis.Common -Version 4.8.0-beta00016

NuGetInstall-Package Lucene.Net.QueryParser -Version 4.8.0-beta00016

This library read *.docx => text string

NuGetInstall-Package IFilterTextReader -Version 1.7.10

Source code c#:

using Lucene.Net.Analysis.Core;
using Lucene.Net.Analysis.Miscellaneous;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Analysis;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Lucene.Net.Index;
using Lucene.Net.Store;
using Lucene.Net.Util;
using Lucene.Net.Documents;
using Lucene.Net.Search;
using Lucene.Net.QueryParsers.Classic;

namespace FullTextSearch_Lucene
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            if (!System.IO.Directory.Exists(DBINDEX)) { 
                System.IO.Directory.CreateDirectory(DBINDEX);
            }
            // nếu folder chưa tồn tại thì chúng ta tạo ra
        }
        private string DBINDEX = Application.StartupPath + @"db";
        private void btnIndexData_Click(object sender, EventArgs e)
        {
            var jsonData = new WebClient().DownloadString("https://raw.githubusercontent.com/dinhtona/api-mssql-dapper/main/db.json");

            // install newtonsoft json 
            var dataEmployees = JsonConvert.DeserializeObject<List<Employee>>(jsonData);

            var indexDir = FSDirectory.Open(new DirectoryInfo(DBINDEX));
            var analyzer = new NonUnicodeVietnameseAnalyzer(LuceneVersion.LUCENE_48);
            var indexConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);
            var indexWriter = new IndexWriter(indexDir, indexConfig);

            foreach (var employee in dataEmployees)
            {
                // richTextBox1.AppendText(employee.SearchData + Environment.NewLine);
                var document = new Document();               
              
                document.Add(new TextField("data", employee.SearchData, Field.Store.YES));
                document.Add(new StringField("name", employee.Name, Field.Store.YES)); // => tí tìm kiếm có kết quả mình show tên người đó
                indexWriter.AddDocument(document);

            }

            indexWriter.Commit();
            indexWriter.Dispose();

            MessageBox.Show("Tạo index hoàn tất.");
        }

        private void txtQuery_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) { 
                // bắt đầu tìm kiếm khi nhấn nút enter
                var keywords= txtQuery.Text;
                if(keywords.Length > 0)
                {
                    var indexDir = FSDirectory.Open(new DirectoryInfo(DBINDEX));
                    var analyzer = new NonUnicodeVietnameseAnalyzer(LuceneVersion.LUCENE_48);                  
                    var reader = DirectoryReader.Open(indexDir);
                    var searcher = new IndexSearcher(reader);
                    var parser = new QueryParser(LuceneVersion.LUCENE_48, "data", analyzer); // tìm kiếm ở phần data 
                    var query = parser.Parse(keywords); // từ khóa tìm kiếm                    
                    var topDocs = searcher.Search(query, 10); // 10 show 10 top result
                    richTextBox1.Text = "";
                    int i = 0;
                    foreach (var scoreDoc in topDocs.ScoreDocs)
                    {
                        i++;
                        var document = searcher.Doc(scoreDoc.Doc);
                        var name = document.Get("name");
                        richTextBox1.AppendText($"{i}. {name}
");

                    }
                }
            }
        }
    }

    public class Employee
    {
        public int Id { get; set; }
        public string Code { get; set; }
        public string Name { get; set; }
        public string BirthDay { get; set; }
        public string Gender { get; set; }
        public string BirthPlace { get; set; }
        public int Age { get; set; }
        public string Address { get; set; }

        public string SearchData {
            get {
                return $"{Name} {BirthDay} {Address}";// gom thông tin 3 trường vào 1 để tí mình index
            }
        }
    }

    public class NonUnicodeVietnameseAnalyzer : Analyzer
    {
        private readonly Lucene.Net.Util.LuceneVersion _version;


        public NonUnicodeVietnameseAnalyzer(Lucene.Net.Util.LuceneVersion version)
        {
            _version = version;

        }

        protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader)
        {
            var tokenizer = new StandardTokenizer(_version, reader);

            TokenStream stream = new StandardFilter(_version, tokenizer);
            stream = new LowerCaseFilter(_version, stream);
            stream = new StopFilter(_version, stream, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
            stream = new ASCIIFoldingFilter(stream);

            return new TokenStreamComponents(tokenizer, stream);
        }
    }
}

Ưu điểm của Lucene:

  1. Hiệu suất tìm kiếm nhanh: Lucene sử dụng các cấu trúc dữ liệu nhanh và hiệu quả để tìm kiếm các từ khóa trong chỉ mục văn bản, do đó, thời gian tìm kiếm của Lucene rất nhanh.

  2. Hỗ trợ nhiều tính năng tìm kiếm: Lucene cung cấp nhiều tính năng để tìm kiếm các từ khóa trong các tài liệu, bao gồm cả tìm kiếm thông qua các trường cụ thể, tìm kiếm các từ đồng nghĩa và các tính năng khác.

  3. Dễ sử dụng: Lucene được thiết kế để dễ sử dụng và tích hợp vào các ứng dụng máy tính.

  4. Được hỗ trợ bởi cộng đồng: Lucene là một dự án mã nguồn mở, do đó, nó được hỗ trợ bởi một cộng đồng lớn các nhà phát triển, và có sẵn nhiều tài liệu và hướng dẫn trực tuyến.

Nhược điểm của Lucene:

  1. Khó sử dụng cho các ứng dụng lớn: Khi số lượng tài liệu và từ khóa trong chỉ mục tăng lên, việc sử dụng Lucene để tìm kiếm có thể trở nên khó khăn và tốn nhiều thời gian.

  2. Không hỗ trợ tính năng tìm kiếm phân tán: Lucene không hỗ trợ các tính năng tìm kiếm phân tán, do đó, khi áp dụng cho các ứng dụng lớn, việc tìm kiếm phân tán có thể trở nên khó khăn.

  3. Không hỗ trợ việc chỉnh sửa tài liệu: Khi tài liệu trong chỉ mục của Lucene đã được tạo, chúng không thể được chỉnh sửa trực tiếp, mà thay vào đó phải xóa tài liệu cũ và thêm tài liệu mới vào chỉ mục.

 

Các bạn có thể tham khảo thêm Full Text Search trên SQLSERVER.

https://laptrinhvb.net/bai-viet/chuyen-de-vb-net/--SQLSERVER---Huong-dan-su-dung-chuc-nang-tim-kiem-Full-Text-Search-SQL-SERVER-2016/13142194bda3c869.html

 

Thanks for waching!

DOWNLOAD SOURCE

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[C#] Tìm kiếm gần đúng Full Text Search sử dụng thư viện Lucene.NET
Đăng bởi: Thảo Meo - Lượt xem: 3439 10:42:47, 31/03/2023DEVEXPRESS   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.