.NET 6全文檢索引擎Lucene.NET 4.8簡單封裝

前言

因為最近在做一個檢索數據的工具。最開始用的Mysql8自帶的全文檢索功能。但是發現這貨數據量超過百萬之後,檢索速度直線下降。
於是想到Lucene.net。花了一晚上時間做了簡單的封裝。可以直接用於博客網站站內搜索等簡單使用場景。

目前做了幾個簡單的封裝

  • 創建索引
  • jiba.net分詞檢索
  • 檢索分頁
  • 按字段檢索
  • 字段排序
  • 索引刪除

如何使用?

已經封裝成了nuget包,並上傳到nuget上,可以直接安裝 dotnet add package EasyLuceneNET 也可以直接在vs裏面搜索

img

創建模型

 public class Article
    {
        [Lucene(FieldStore = Field.Store.YES, IsUnique = true, type = LuceneFieldType.Int32)]
        public int Id { get; set; }
        [Lucene(FieldStore = Field.Store.YES, IsUnique = false, type = LuceneFieldType.Text)]
        public string Title { get; set; }


        [Lucene(FieldStore = Field.Store.YES, IsUnique = false, type = LuceneFieldType.Text)]
        public string Content { get; set; }
    }

依賴注入

var service = new ServiceCollection();
service.AddLogging();
service.AddEasyLuceneNet();
var serviceProvider = service.BuildServiceProvider();
var easy = serviceProvider.GetService<IEasyLuceneNet>();

創建索引

var list = new List<Article>();
for (int i = 0; i < 100; i++)
{
    list.Add(new Article()
    {
        Id = i,
        Title = i + "使用Xamarin開發移動應用示例——數獨遊戲(八)使用MVVM實現完成遊戲列表頁面",
        Content = @"前面我們已經完成了遊戲的大部分功能,玩家可以玩預製的數獨遊戲,也可以自己添加新的遊戲。現在我們實現展示已完成遊戲列表頁面,顯示用戶已經完成的遊戲列表,從這個列表可以進入詳細的復盤頁面。

前面的頁面我們採用的是傳統的事件驅動模型,在XAML文件中定義頁面,在後台的cs文件中編寫事件響應代碼。採用這種模型是因為很多頁面需要動態生成控件,然後動態改變這些控件的屬性,事件驅動模型在這種場景下比較好理解。現在我們採用MVVM方式編寫完成遊戲列表頁面。

MVVM是將頁面綁定到視圖模型,所有的操作和事件響應通過視圖模型完成。視圖模型中沒有頁面控件的定義,因此和頁面是解耦的,可以獨立進行測試。在視圖模型中我們只關心數據,而不關心展示數據的控件。

首先,我們定義一個視圖模型的基類,下一步在改造其它頁面時,會用到這個基類:"
    });
}
easy!.AddIndex(list);

檢索數據


var result = easy!.Search<Article>(new SearchRequest()
{
    keyword = "事件模型",
    index = 1,
    size = 20,
    fields = new string[] { "Title", "Content" },
    OrderByField = "Id",
});
Console.WriteLine("一共:" + result.Total);
foreach (var item in result.list)
{
    Console.WriteLine($"id:{item.Id} title:{item.Title}");
}
Console.WriteLine($"分詞:{string.Join(" ", result.cutKeys)}");
Console.WriteLine("完成");

刪除索引

傳遞一個文檔對應的模型,只需要給主鍵賦值即可

easy.Delete(new Article { Id = 1 });

基本的檢索就差不多到這裡結束了,如果需要自己更新詞庫,可以下載源碼自己編譯,或者我後面有時間把詞庫單獨弄出來

源碼

//github.com/coolqingcheng/EasyLuceneNET

點擊直接跳到github

關注我

歡迎大家關注我的公眾號【網上衝浪程序員】,不定時和你分享

img

Tags: