基于match_phrase搜索的分词优化

2023-11-05 12:20

本文主要是介绍基于match_phrase搜索的分词优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ES 的match_phrase 搜索需要完整匹配输入的内容,比如我们搜索 ‘中国人民’ ,要保证的是doc中必须有 ‘中国人民’ 的内容出现。再比如我们搜索 ‘国人民’ 时,结果集中的 doc 中就要有 ‘国人民’ 的内容。一般在使用match 或 term 搜索的时候会引入词库,比如 ik 、 jieba 都利用词库来分词,之后按照分词粒度搜索。

然而match_phrase 的搜索背景下,搜索的内容有可能不是一段被完整分词的内容比如上面的例子 ‘国人民’。所以无法利用分词召回内容。取而代之的是使用 standard 或 ngram-1 先对 doc 进行最细粒度分词,搜索的时候也是按照最细粒度的单字进行匹配搜索。

下面以入库文档内容:'应付项目的增加' 为例

执行查询:

由于搜索text中的四个token 以及它们之间的相对位置和document中一样,所以能够搜索到入库的document。

这样做的原因是在短语搜索时,由于无法预判用于执行搜索的query文本,所以为了支持短语搜索,现有的技术将会在索引入库文档时,将文档中的每一个字当成一个独立的term,之后再存储到倒排索引中。而在搜索的时候,使用相同的逻辑将query文本的每一个字当成一个独立的term,然后从库中找同时包含所有query term的文档,接着在初步筛出来的文档中找出满足在文档中出现的顺序和query中的一致的文档作为最后结果。

当我们输入的搜索内容较多的时候,需要处理的单字也是成线性增长,性能也会有显著的下降;对此提出使用新的分词策略,修正了ik 、jieba等主流的分词器的分词缺点;

以下是新分词器的分词原理:主要特征是在index时将文本进行穷举式分词,也就是首先对于单个字的处理成一个term,之后处理多字词,并且这些多字词使用的position为第一个字(或最后一个字,通过参数控制)对应的term的position,然后将这些分词的结果全部放到倒排索引中,供后续query查找。在search时将搜索内容按照同样的position处理逻辑处理为一段无重复的分词,使用search分词器分词好的term进行搜索。

继续使用上面的例子,但是分词使用优化后的index分词器:

执行查询,这时使用search分词器:

连接关系:index 分词器 和 search 分词器是ES内的两个分词组件,没有直接的连接关系,通过框架内的流程顺序建立关系。逻辑上的关联关系无论其分词粒度不同,但是得到的分词term的position都是一样的。以上面为例:search text 分词结果(目的:0,增加:2) 能够匹配到index (目的:3,增加:5)。这也是search 分词器解析的短语搜索时能够匹配index 分词器分解的文档的原因。

github: GitHub - muhao1020/elasticsearch-analysis-maxword at master

这篇关于基于match_phrase搜索的分词优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/349815

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k