一說到全文搜尋,大家都可能會想到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 」,免費領取
推薦閱讀
覺得好看 點個在看👇