一说到全文搜索,大家都可能会想到ES中间件,毕竟ES非常强大。对于复杂全文搜索场景ES非常好用,但是对于一些简单业务场景的,比如实现通过关键字检索文章,使用ES就显得比较重。今天就给大家推荐一个基于EntityFrameworkCore+Lucene.Net实现的全文搜素引擎库,主要面向简单全文搜索场景的。
项目简介**这是一个仅70KB的、轻量级的全文检索搜索引擎、基于Lucene实现的。**可轻松实现全文搜索、自定义同义词和同音词、自定义词库,与EntityFrameworkCore实体框架无缝对接,通过简单的配置,就可以轻松接入项目。
该项目主要用于简单搜索场景,针对分布式应用、关联查询等一些复杂的查询,需要考虑其他支持方式,比如采用ES中间件。
技术架构1、跨平台:这是基于.Net Core开发的系统,可以部署在Docker, Windows, Linux, Mac。
2、基于Net5.0+EntityFrameworkCore+Lucene.Net开发。
项目结构Masuit.LuceneEFCore.SearchEngine为全文搜索引擎库项目,WebSearchDemo简单Demo项目。
使用方法搜索引擎配置
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(db =>
{
db.UseInMemoryDatabase("test");
//db.UseSqlServer("Data Source=.;Initial Catalog=MyBlogs;Integrated Security=True");
});
services.AddSearchEngine(new LuceneIndexerOptions()
{
Path = "lucene"
});
...
}
创建索引、导入自定义词库
public void Configure(IApplicationBuilder app, IHostingEnvironment env, DataContext db, ISearchEngine searchEngine)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
new JiebaSegmenter().AddWord("会声会影"); //添加自定义词库
new JiebaSegmenter().AddWord("思杰马克丁"); //添加自定义词库
new JiebaSegmenter().AddWord("TeamViewer"); //添加自定义词库
db.Post.AddRange(JsonConvert.DeserializeObject(File.ReadAllText(AppContext.BaseDirectory + "Posts.json")));
db.SaveChanges();
searchEngine.DeleteIndex();
searchEngine.CreateIndex(new List()
{
nameof(Post)
});
...
}
创建索引
///
/// 创建索引
///
[HttpGet]
public void CreateIndex()
{
//_searchEngine.CreateIndex();//扫描所有数据表,创建符合条件的库的索引
_searchEngine.CreateIndex(new List() { nameof(Post) });//创建指定的数据表的索引
}
添加索引
///
/// 添加索引
///
[HttpPost]
public void AddIndex(Post p)
{
// 添加到数据库并更新索引
_searchEngine.Context.Post.Add(p);
_searchEngine.SaveChanges();
//_luceneIndexer.Add(p); //单纯的只添加索引库
}
删除索引
///
/// 删除索引
///
[HttpDelete]
public void DeleteIndex(Post post)
{
//从数据库删除并更新索引库
Post p = _searchEngine.Context.Post.Find(post.Id);
_searchEngine.Context.Post.Remove(p);
_searchEngine.SaveChanges();
//_luceneIndexer.Delete(p);// 单纯的从索引库移除
}
更新索引
///
/// 更新索引库
///
///
[HttpPatch]
public void UpdateIndex(Post post)
{
//从数据库更新并同步索引库
Post p = _searchEngine.Context.Post.Find(post.Id);
// update...
_searchEngine.Context.Post.Update(p);
_searchEngine.SaveChanges();
//_luceneIndexer.Update(p);// 单纯的更新索引库
}
搜索
///
/// 搜索
///
/// 关键词
/// 第几页
/// 页大小
///
[HttpGet]
public IActionResult Index(string s, int page, int size)
{
var result = _searchEngine.ScoredSearch(new SearchOptions(s, page, size, typeof(Post)));
return Ok(result);
}
项目地址:https://github.com/ldqk/Masuit.LuceneEFCore.SearchEngine
- End -
推荐阅读
-
一套.Net6可落地的微服务、分布式开源项目
-
一个基于.NetCore开发、模块化、跨平台、多语言商城系统
-
.Net开发的跨平台Word模板引擎
-
基于.Net+SWEBUI开发的开源WMS仓库管理系统
-
阿里、腾讯、百度大厂的程序员编程指南规范
专注分享编程知识、热门有用有趣的开源项目