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


    前言

    因为最近在做一个检索数据的工具。最开始用的Mysql8自带的全文检索功能。但是发现这货数据量超过百万之后,检索速度直线下降。
    于是想到Lucene.net。花了一晚上时间做了简单的封装。可以直接用于博客网站站内搜索等简单使用场景。

    目前做了几个简单的封装

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

    如何使用?

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

    img

    创建模型

     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

    关注我

    欢迎大家关注我的公众号【网上冲浪程序员】,不定时和你分享

    img

  • 相关阅读:
    Secret-field团队 Alpha冲刺阶段博客记录
    alpha阶段测试报告
    第七周会议记录
    第六周会议记录
    《Secret—field团队》第一次作业:公课网课程评价系统
    linux下用hadoop streaming 跑php总是jobs fail!
    php请求nginx服务器返回403
    Linux达人养成计划I——文件搜索命令
    Linux达人养成计划I——链接命令
    Linux达人养成计划I——常见目录作用
  • 原文地址:https://www.cnblogs.com/boxrice/p/15878038.html
Copyright © 2020-2023  润新知