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

简介: 这是一个仅70KB的、轻量级的全文检索搜索引擎、基于Lucene实现的。

一说到全文搜索,大家都可能会想到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<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>
/// <param name="post"></param>
[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);// 单纯的更新索引库
}

搜索

/// <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);
}
项目地址: https://github.com/ldqk/Masuit.LuceneEFCore.SearchEngine

- End -

专注分享编程知识、热门有用有趣的开源项目

相关文章
|
7月前
|
自然语言处理 搜索推荐 算法
基于Lucene的搜索引擎的设计与实现
基于Lucene的搜索引擎的设计与实现
67 0
|
自然语言处理 算法 搜索推荐
给全文搜索引擎Manticore (Sphinx) search 增加中文分词
Sphinx search 是一款非常棒的开源全文搜索引擎,它使用C++开发,索引和搜索的速度非常快,我使用sphinx的时间也有好多年了。最初使用的是coreseek,一个国人在sphinxsearch基础上添加了mmseg分词的搜索引擎,可惜后来不再更新,sphinxsearch的版本太低,bug也会出现;后来也使用最新的sphinxsearch,它可以支持几乎所有语言,通过其内置的ngram tokenizer对中文进行索引和搜索。
4095 0
|
3月前
|
存储 搜索推荐 Oracle
什么是全文搜索引擎
什么是全文搜索引擎
|
2月前
|
开发框架 监控 搜索推荐
GoFly快速开发框架集成ZincSearch全文搜索引擎 - Elasticsearch轻量级替代为ZincSearch全文搜索引擎
本文介绍了在项目开发中使用ZincSearch作为全文搜索引擎的优势,包括其轻量级、易于安装和使用、资源占用低等特点,以及如何在GoFly快速开发框架中集成和使用ZincSearch,提供了详细的开发文档和实例代码,帮助开发者高效地实现搜索功能。
193 0
|
存储 搜索推荐 Java
全文搜索引擎 Lucene Solr ElasticSearch 关系?
全文搜索引擎是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
全文搜索引擎 Lucene Solr ElasticSearch 关系?
|
存储 自然语言处理 搜索推荐
|
自然语言处理 Java 数据库
这么说吧,Lucene很简单,其实就是个框架,用于全文检索用的
我是风月连城,喜欢用简单的语言阐述知识点 长期分享原创java文章,分享进阶架构师学习笔记及学习资料 喜欢的大屌们可以关注下,共同学习,一起进步 ps:由于工资迟迟不发,影响心情,好几天没写文章.... Lucene是什么? 0 ) 关键词:Lucene ,搜索,全文检索 1)本质:一个Jar包,一个用于全文检索的框架 2)作用:Lucene不是一个完整的全文索引应用,而是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。