首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一个基于EFCore+Lucene实现的全文搜索引擎库

一说到全文搜索,大家都可能会想到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

使用方法

搜索引擎配置

public void 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" });...}

创建索引、导入自定义词库

public void Configure(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]public void CreateIndex(){ //_searchEngine.CreateIndex();//扫描所有数据表,创建符合条件的库的索引 _searchEngine.CreateIndex(new List<string>() { nameof(Post) });//创建指定的数据表的索引}

添加索引

/// <summary>/// 添加索引/// </summary>[HttpPost]public void AddIndex(Post p){ // 添加到数据库并更新索引 _searchEngine.Context.Post.Add(p); _searchEngine.SaveChanges();

//_luceneIndexer.Add(p); //单纯的只添加索引库}

删除索引

/// <summary>/// 删除索引/// </summary>[HttpDelete]public void DeleteIndex(Post post){ //从数据库删除并更新索引库 Post p = _searchEngine.Context.Post.Find(post.Id); _searchEngine.Context.Post.Remove(p); _searchEngine.SaveChanges();

//_luceneIndexer.Delete(p);// 单纯的从索引库移除}

更新索引

/// <summary>/// 删除索引/// </summary>[HttpDelete]public void DeleteIndex(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

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OmpMqwEuIlUZKPtMWZfp_RiQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券