NET 6全文检索引擎Lucene.NET 4.8简单封装

简介: NET 6全文检索引擎Lucene.NET 4.8简单封装

前言

因为最近在做一个检索数据的工具。最开始用的Mysql8自带的全文检索功能。但是发现这货数据量超过百万之后,检索速度直线下降。

于是想到Lucene.net。花了一晚上时间做了简单的封装。可以直接用于博客网站站内搜索等简单使用场景。

目前做了几个简单的封装

  • 创建索引
  • jiba.net分词检索
  • 检索分页
  • 按字段检索
  • 字段排序
  • 索引删除

如何使用?

已经封装成了nuget包,并上传到nuget上,可以直接安装 dotnet add package EasyLuceneNET 也可以直接在vs里面搜索

创建模型

public class Article
    {
        [Lucene(FieldStore = Field.Store.YES, IsUnique = true, type = LuceneFieldType.Int32)]
        public int Id { get; set; }
        [Lucene(FieldStore = Field.Store.YES, IsUnique = false, type = LuceneFieldType.Text)]
        public string Title { get; set; }
        [Lucene(FieldStore = Field.Store.YES, IsUnique = false, type = LuceneFieldType.Text)]
        public string Content { get; set; }
    }

依赖注入

var service = new ServiceCollection();
service.AddLogging();
service.AddEasyLuceneNet();
var serviceProvider = service.BuildServiceProvider();
var easy = serviceProvider.GetService<IEasyLuceneNet>();

创建索引

var list = new List<Article>();
for (int i = 0; i < 100; i++)
{
    list.Add(new Article()
    {
        Id = i,
        Title = i + "使用Xamarin开发移动应用示例——数独游戏(八)使用MVVM实现完成游戏列表页面",
        Content = @"前面我们已经完成了游戏的大部分功能,玩家可以玩预制的数独游戏,也可以自己添加新的游戏。现在我们实现展示已完成游戏列表页面,显示用户已经完成的游戏列表,从这个列表可以进入详细的复盘页面。
前面的页面我们采用的是传统的事件驱动模型,在XAML文件中定义页面,在后台的cs文件中编写事件响应代码。采用这种模型是因为很多页面需要动态生成控件,然后动态改变这些控件的属性,事件驱动模型在这种场景下比较好理解。现在我们采用MVVM方式编写完成游戏列表页面。
MVVM是将页面绑定到视图模型,所有的操作和事件响应通过视图模型完成。视图模型中没有页面控件的定义,因此和页面是解耦的,可以独立进行测试。在视图模型中我们只关心数据,而不关心展示数据的控件。
首先,我们定义一个视图模型的基类,下一步在改造其它页面时,会用到这个基类:"
    });
}
easy!.AddIndex(list);

检索数据

var result = easy!.Search<Article>(new SearchRequest()
{
    keyword = "事件模型",
    index = 1,
    size = 20,
    fields = new string[] { "Title", "Content" },
    OrderByField = "Id",
});
Console.WriteLine("一共:" + result.Total);
foreach (var item in result.list)
{
    Console.WriteLine($"id:{item.Id} title:{item.Title}");
}
Console.WriteLine($"分词:{string.Join(" ", result.cutKeys)}");
Console.WriteLine("完成");

删除索引

传递一个文档对应的模型,只需要给主键赋值即可

easy.Delete(new Article { Id = 1 });

基本的检索就差不多到这里结束了,如果需要自己更新词库,可以下载源码自己编译,或者我后面有时间把词库单独弄出来

源码

https://github.com/coolqingcheng/EasyLuceneNET

点击直接跳到github

目录
相关文章
|
5月前
|
Unix Java C#
记一次对Pdfium .Net包装器的跨平台封装
PDFium 是一个开源的 PDF 渲染引擎,最初由 Google 和 Foxit Software 合作开发,并且使用 BSD 3-Clause 许可协议发布。它被设计用于在各种平台上渲染 PDF 文件,包括 Windows、macOS 和 Linux。
276 3
|
3月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
4月前
|
开发框架 前端开发 JavaScript
基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
|
4月前
|
开发框架 缓存 NoSQL
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
|
6月前
|
开发框架 安全 .NET
【专栏】.NET 技术:推动开发进步的引擎
【4月更文挑战第29天】本文探讨了.NET技术在软件开发中的重要性,强调其跨平台兼容性、丰富的开发工具和框架、高效性能及强安全稳定性。.NET的特性加速了应用开发,提升了质量和可靠性,并促进了创新和业务发展,同时培育了专业人才和技术社区。随着未来的发展,.NET将持续创新,为软件开发和数字化转型贡献力量,成为行业前进的关键驱动力。
40 0
|
6月前
|
安全 数据库 数据安全/隐私保护
七天.NET 8操作SQLite入门到实战 - 第五天引入SQLite-net ORM并封装常用方法
七天.NET 8操作SQLite入门到实战 - 第五天引入SQLite-net ORM并封装常用方法
192 0
|
11月前
|
存储 文字识别 C#
一个基于百度飞桨封装的.NET版本OCR工具类库 - PaddleOCRSharp
一个基于百度飞桨封装的.NET版本OCR工具类库 - PaddleOCRSharp
406 0
|
消息中间件 存储 Docker
.Net Core对于`RabbitMQ`封装分布式事件总线
.Net Core对于`RabbitMQ`封装分布式事件总线
223 1
.Net Core对于`RabbitMQ`封装分布式事件总线
|
开发框架 前端开发 网络协议
服务器开发- Asp.Net Core中的websocket,并封装一个简单的中间件
服务器开发- Asp.Net Core中的websocket,并封装一个简单的中间件
488 7
|
编解码 分布式计算 Java
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]