當前位置: 妍妍網 > 碼農

一個基於EFCore+Lucene實作的全文搜尋引擎庫

2024-03-29碼農

一說到全文搜尋,大家都可能會想到ES中介軟體,畢竟ES非常強大。對於復雜全文搜尋場景ES非常好用,但是對於一些簡單業務場景的,比如實作透過關鍵字檢索文章,使用ES就顯得比較重。今天就給大家推薦一個基於EntityFrameworkCore+Lucene.Net實作的全文搜素引擎庫,主要面向簡單全文搜尋場景的。

01

計畫簡介

這是一個僅70KB的、輕量級的全文檢索搜尋引擎、基於 Lucene實作的 可輕松實作全文搜尋、自訂同義詞和同音詞、自訂詞庫,與EntityFrameworkCore實體框架無縫對接,透過簡單的配置,就可以輕松接入計畫。

該計畫主要用於簡單搜尋場景 ,針對分布式套用、關聯查詢等一些復雜的查詢,需要考慮其他支持方式,比如采用ES中介軟體。

02

技術架構

1、跨平台:這是基於.Net Core開發的系統,可以部署在Docker, Windows, Linux, Mac。

2、基於Net5.0+EntityFrameworkCore+Lucene.Net開發。

Masuit.LuceneEFCore.SearchEngine為全文搜尋引擎庫計畫,WebSearchDemo簡單Demo計畫。

03

使用方法

搜尋引擎配置

publicvoid ConfigureServices(IServiceCollection services){ services.AddDbContext<DataContext>(db => { db.UseInMemoryDatabase("test");//db.UseSqlServer("Data Source=.;Initial Catalog=MyBlogs;Integrated Security=True"); }); services.AddSearchEngine<DataContext>(new LuceneIndexerOptions() { Path = "lucene" });...}

建立索引、匯入自訂詞庫

publicvoidConfigure(IApplicationBuilder app, IHostingEnvironment env, DataContext db, ISearchEngine<DataContext> searchEngine){if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); }new JiebaSegmenter().AddWord("會聲會影"); //添加自訂詞庫new JiebaSegmenter().AddWord("思傑馬克丁"); //添加自訂詞庫new JiebaSegmenter().AddWord("TeamViewer"); //添加自訂詞庫 db.Post.AddRange(JsonConvert.DeserializeObject<List<Post>>(File.ReadAllText(AppContext.BaseDirectory + "Posts.json"))); db.SaveChanges(); searchEngine.DeleteIndex(); searchEngine.CreateIndex(new List<string>() {nameof(Post) }); ...}

建立索引

///<summary>/// 建立索引///</summary>[HttpGet]publicvoidCreateIndex(){//_searchEngine.CreateIndex();//掃描所有數據表,建立符合條件的庫的索引 _searchEngine.CreateIndex(new List<string>() { nameof(Post) });//建立指定的數據表的索引}

添加索引

///<summary>/// 添加索引///</summary>[HttpPost]publicvoidAddIndex(Post p){// 添加到資料庫並更新索引 _searchEngine.Context.Post.Add(p); _searchEngine.SaveChanges();//_luceneIndexer.Add(p); //單純的只添加索引庫}

刪除索引

///<summary>/// 刪除索引///</summary>[HttpDelete]publicvoidDeleteIndex(Post post){//從資料庫刪除並更新索引庫 Post p = _searchEngine.Context.Post.Find(post.Id); _searchEngine.Context.Post.Remove(p); _searchEngine.SaveChanges();//_luceneIndexer.Delete(p);// 單純的從索引庫移除}

更新索引

///<summary>/// 刪除索引///</summary>[HttpDelete]publicvoidDeleteIndex(Post post){//從資料庫刪除並更新索引庫 Post p = _searchEngine.Context.Post.Find(post.Id); _searchEngine.Context.Post.Remove(p); _searchEngine.SaveChanges();//_luceneIndexer.Delete(p);// 單純的從索引庫移除}

搜尋

///<summary>/// 搜尋///</summary>///<param name="s">關鍵詞</param>///<param name="page">第幾頁</param>///<param name="size">頁大小</param>///<returns></returns>[HttpGet]public IActionResult Index(string s, int page, int size){var result = _searchEngine.ScoredSearch<Post>(new SearchOptions(s, page, size, typeof(Post)));return Ok(result);}

04

計畫地址

https://github.com/ldqk/Masuit.LuceneEFCore.SearchEngine

最後推薦加入我的 裏麵包含7個教程,其中有:【 三層架構教程 】與【 領域驅動設計架構教程 】,還有現在正在編寫的【動態Web API】教程。

- End -

分享一套.NetCore從入門到精通視訊教程

點選下方公眾號卡片,關註我

回復「 888 」,免費領取

推薦閱讀

覺得好看 點個在看👇