架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 769|回复: 2

[资料] 【实战】使用 Lucene.Net + Jieba.NET 搭建轻量级站内搜索

[复制链接]
发表于 2023-10-29 18:05:43 | 显示全部楼层 |阅读模式
需求:站内全文搜索是一个常用的功能,常用的有基于 ElasticSearchSolr 进行部署开发,现在又新出了两个 RedisSearchMeiliSearch 搜索引擎,前两个比较重,后两个虽然没有前两个重,但是还是需要部署依赖服务,本文使用 Lucene.Net + Jieba.NET 来搭建轻量级站内搜索。

Lucene.Net

Lucene.Net 是 Lucene 的 .NET 移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。

网站:https://lucenenet.apache.org/
GitHub 地址:https://github.com/apache/lucenenet

Jieba.NET

Jieba.NET 是 jieba 中文分词的.NET版本(C#实现)。可以对中文文本进行分词、词性标注、关键词抽取等功能,并且支持自定义词典。

GitHub 地址:https://github.com/anderscui/jieba.NET

首先,先看效果图:

QQ截图20231029172538.jpg QQ截图20231029172613.jpg QQ截图20231029172634.jpg


自定义 Analyzer 分析器

Lucene 分词器中的Analyzer,TokenStream,Tokenizer,TokenFilterTokenStream:分词器做好处理之后得到的一个流。这个流中存储了分词的各种信息,可以通过TokenStream有效的获取到分词单元。以下是把文件流转换成分词流(TokenStream)的过程首先,通过Tokenizer来进行分词,不同分词器有着不同的Tokenzier,Tokenzier分完词后,通过TokenFilter对已经分好词的数据进行过滤,比如停止词。过滤完之后,把所有的数据组合成一个TokenStream。

参考:

https://github.com/anderscui/jiebaForLuceneNet/blob/master/Integration.LuceneNet/JiebaAnalyzer.cs
https://github.com/SilentCC/JIEba-netcore/blob/master/jieba.NET/JieBaAnalyzer.cs
https://github.com/apache/lucenenet/blob/master/src/Lucene.Net.Analysis.SmartCn/SmartChineseAnalyzer.cs


基于 Jieba.NET 来自定义 Lucene 分析器,首先引用如下:



直接引用 Lucene.Net.Analysis.Common 包,因为 Lucene.Net.Analysis.Common 会依赖 Lucene.Net 包,自动下载。

新建 JiebaTokenizer.cs,代码如下:

新建 JiebaAnalyzer.cs,代码如下:



Lucene.Net 新建文档和搜索

将网站的数据定时或者触发新增到 Lucene 中,Lucene 通过分析器将文档存储到物理磁盘中,然后,就可以调用搜索接口进行查找。

LuceneHelper 帮助类代码如下:



Store 存储

Store.YES:既会索引数据,也会保存数据,方便搜索结果返回字段信息;
Store.NO:只会索引数据,并不会保存数据,搜索结果无法获取此字段信息,能够节省磁盘空间

如下图:

QQ截图20231029175852.jpg


Field 字段类型

Lucene.Net 中的字段类型有 Int32Field、Int64Field、SingleField、DoubleField、BinaryDocValuesField、NumericDocValuesField、SortedDocValuesField、StringField、TextField、StoredField,请根据自己实际情况使用合适的数据类型。

TextField 与 StringField 对比

TextField肯定会进行语汇化,StringField 不会对存入doc的内容进行语汇分析,参考:https://cloud.tencent.com/developer/article/1966559

Occur 复合搜索


有以下 6 种组合:

1.MUST和MUST:取得连个查询子句的交集。
2.MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。
3.SHOULD与MUST_NOT:连用时,功能同MUST和MUST_NOT。
4.SHOULD与MUST连用时,结果为MUST子句的检索结果,但是SHOULD可影响排序。
5.SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。
6.MUST_NOT和MUST_NOT:无意义,检索无结果。


运行项目

至此,可以启动项目,来新增、更新、搜索搜索了,接口代码如下:


可能会报错如下:

An unhandled exception occurred while processing the request.
DirectoryNotFoundException: Could not find a part of the path 'C:\Users\itsvse_nuc11\source\repos\DiscuzSearch\DiscuzSearch\bin\Debug\net6.0\Resources\prob_trans.json'.
Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(string fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)

TypeInitializationException: The type initializer for 'JiebaNet.Segmenter.JiebaSegmenter' threw an exception.

jieba.net 安装之后,在packages\jieba.NET目录下可以看到Resources目录,这里面是jieba.NET运行所需的词典及其它数据文件,最简单的配置方法是将整个Resources目录拷贝到程序集所在目录,这样jieba.NET会使用内置的默认配置值。

C:\Users\%USERPROFILE%\.nuget\packages\jieba.net\0.42.2\Resources

JiebaNet 需要添加配置文件夹,代码如下:

测试新建了 500 个文档(和自己实际情况有关系,仅供参考),磁盘占用 119KB,如下图:

QQ截图20231029180456.jpg

(完)




上一篇:关注公众号,免费获取“邀请码”
下一篇:.NET 将数据库 varbinary 字符串转换成 byte[] 数组
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-10-29 18:10:40 | 显示全部楼层
Elasticsearch(ES)无法写入数据故障解决方案
https://www.itsvse.com/thread-10568-1-1.html

【实战】Elasticsearch 自动清理索引释放磁盘空间
https://www.itsvse.com/thread-10273-1-1.html

【实战】Elasticsearch-7.x 使用 xpack 进行安全认证
https://www.itsvse.com/thread-10206-1-1.html

【实战】使用 Docker 部署 Elasticsearch 服务
https://www.itsvse.com/thread-10148-1-1.html

【实战】Elasticsearch 使用 elasticdump 数据备份和迁移
https://www.itsvse.com/thread-10143-1-1.html

Windows 下安装单机版 elasticsearch 7.10.2 教程
https://www.itsvse.com/thread-9962-1-1.html

Elasticsearch 搜索 highlight 高亮配置介绍
https://www.itsvse.com/thread-9562-1-1.html

.NET/C# 使用 Elasticsearch 调试查看请求和响应信息
https://www.itsvse.com/thread-9561-1-1.html

ASP.NET Core 链路追踪(五)Jaeger 数据持久化到 elasticsearch
https://www.itsvse.com/thread-9553-1-1.html

Elasticsearch(ES)复制克隆索引
https://www.itsvse.com/thread-9545-1-1.html

【实战】Elasticsearch(ES)集群健康值: yellow (6 of 7) 状态
https://www.itsvse.com/thread-9544-1-1.html

【实战】Elasticsearch(ES)集群健康值: red 故障分析
https://www.itsvse.com/thread-9543-1-1.html

ElasticSearch中Java操作地理位置信息(geo_point)
https://www.itsvse.com/thread-6444-1-1.html

ElasticsearchParseException[field must be either [lat], [lon] or [geohash]]
https://www.itsvse.com/thread-6442-1-1.html

elasticsearch-mapping字段类型
https://www.itsvse.com/thread-6436-1-1.html

Elasticsearch:No handler for type [string] declared on field[XX]的解决办法
https://www.itsvse.com/thread-6420-1-1.html

【实战】Elasticsearch之Kibana安装教程
https://www.itsvse.com/thread-6400-1-1.html

elasticsearch高级功能系列之geo地理坐标
https://www.itsvse.com/thread-6399-1-1.html

ElasticSearch 复合查询must、should、must_not使用
https://www.itsvse.com/thread-6334-1-1.html

【实战】Elasticsearch删除索引所有文档数据
https://www.itsvse.com/thread-6321-1-1.html

【实战】.net/c# 通过NEST调用elasticsearch搜索[附源码]
https://www.itsvse.com/thread-6294-1-1.html

单节点Elasticsearch出现unassigned_shards原因及解决办法
https://www.itsvse.com/thread-6193-1-1.html

【实战】elasticsearch-6.5.2安装elasticsearch-analysis-ik教程
https://www.itsvse.com/thread-6191-1-1.html

【实战】elasticsearch-6.5.2安装elasticsearch-head插件
https://www.itsvse.com/thread-6190-1-1.html

【实战】Centos 7 安装部署elasticsearch-6.5.2教程
https://www.itsvse.com/thread-6173-1-1.html

搜索引擎选择: Elasticsearch与Solr
https://www.itsvse.com/thread-6168-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-11-5 21:27:45 | 显示全部楼层
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-27 15:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表