- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[C#] Tìm kiếm gần đúng Full Text Search sử dụng thư viện Lucene.NET
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ì?
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:
-
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.
-
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.
-
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.
-
Đượ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:
-
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.
-
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.
-
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.
Thanks for waching!