elasticsearch中highlight的“假匹配”

2023-11-03 06:45

本文主要是介绍elasticsearch中highlight的“假匹配”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

elasticsearch中highlight的“假匹配”

一个highlight的假高亮现象:

/company_meta_info/_search?rest_total_hits_as_int=true

{"_source": {"includes": ["name","address"]},"query": {"bool": {"should": [{"match": {"address": {"query": "新疆蓝天七色建材有限公司","operator": "and"}}}]}},"highlight": {"fields": {"name": {},"address": {}}},"from": 0,"size": 10
}

返回结果:可以发现通过地址是没有匹配到任何结果

{"took": 2,"timed_out": false,"_shards": {"total": 6,"successful": 6,"skipped": 0,"failed": 0},"hits": {"total": 0,"max_score": null,"hits": []}
}

换一种方式:先设法把文档召回

{"_source": {"includes": ["name","address"]},"query": {"bool": {"should": [{"match": {"address": {"query": "新疆蓝天七色建材有限公司","operator": "and"}}},{"match": {"org_id": "Q0000D2AC1" //此处匹配目标}}]}},"highlight": {"fields": {"name": {},"address": {}}},"from": 0,"size": 10
}

返回结果:可以发现,结果并不是由于address字段命中召回的,但是highlight却有address,so 这是为什么尼

{"took": 2,"timed_out": false,"_shards": {"total": 6,"successful": 6,"skipped": 0,"failed": 0},"hits": {"total": 1,"max_score": 8.805375,"hits": [{"_index": "company_meta_info_v6","_type": "_doc","_id": "Q0000D2AC1","_score": 8.805375,"_source": {"address": "新疆五家渠市北一东街1299号","name": "新疆蓝天七色建材有限公司"},"highlight": {"address": ["<em>新疆</em>五家渠市北一东街1299号"]}}]}
}

这就需要了解elasticsearch中的高亮处理方式了。在elasticsearch中有三种高亮处理方式:highlighter, fast-vector-highlighter, postings-highlighter。默认使用的是highlighter方式。

highlighter 高亮也叫plain高亮,highlighter方式高亮是个实时分析处理高亮器。即用户在查询的时候,搜索引擎查询到了目标数据后,将需要高亮的字段数据提取到内存,再调用该字段的分析器进行处理,分析器对文本进行分析处理,分析完成后采用相似度算法计算得分最高的前n组并高亮段返回数据。

fast-vector-highlighter(fvh)高亮器利用建索引时候保存好的词项向量(term vector)来直接计算高亮段落,在高亮过程中比plain高亮方式少了实时分析过程,取而代之的是直接从磁盘中将分词结果直接读取到内存中进行计算。故要使用fvh的前置条件就是在建索引时候,需要配置存储词项向量,词向量需要包含词位置信息、词偏移量信息。

配置选项描述
no不启用term vector,默认值
yes启用term vector,但是仅仅记录分词
with_positions启用term vector, 记录分词及分词在字符串中的位置
with_offsets启用term vector, 记录分词在字符串中的起始字符位置
with_positions_offsets启用term vector, 记录分词在字符串中的位置及起始的字符位置
with_positions_payloads启用term vector, 记录分词在字符串中的位置及payloads
with_positions_offsets_payloads启用term vector, 记录分词在字符串中的位置、起始字符位置及payloads

fvh在高亮时候的逻辑如下:

1.分析高亮查询语法,提取表达式中的高亮词集合
2.从磁盘上读取该文档字段下的词向量集合
3.遍历词向量集合,提取自表达式中出现的词向量
4.根据提取到目标词向量读取词频信息,根据词频获取每个位置信息、偏移量
5.通过相似度算法获取得分较高的前n组高亮信息
6.读取字段内容(多字段用空格隔开),根据提取的词向量直接定位截取高亮字段

postings-highlighter(postings)。postings 高亮方式与fvh相似,采用词量向量的方式进行高亮,与fvh高亮不同的是postings高亮只存储了词向量的位置信息,并未存储词向量的偏移量,故中大字段存储中,postings其比fvh节省约20-30%的存储空间,速度与fvh基本相当。

so 由上述的表述我们就知道了,plain类型高亮方式,是首先召回文档,然后对文档进行高亮处理,在高亮处理的过程中并不会参考我们query中的配置条件(“operator”: “and”);所以才会出现我们上面例子中的现象。单靠address条件并不会召回目标文档;当我们用其他条件召回了目标文档时,会进行高亮处理。

我们并不能单纯的将highlight的结果当成文档的匹配原由,想要了解匹配原理还是要通过explain

这篇关于elasticsearch中highlight的“假匹配”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter