elasticsearch中基于slop参数实现近似匹配
参考:https://www.phpmianshi.com/?id=248
slop的含义
query string,搜索文本,中的几个term,要经过几次移动才能与一个document匹配,这个移动的次数,就是slop
词条位置
当一个字符串被分析时,分析器不仅只返回一个词条列表,它同时也返回原始字符串的每个词条的位置、或者顺序信息:
例如:
POST /_analyze {"analyzer": "standard","text": "区块链比特币" }
结果:
{"tokens" : [{"token" : "区","start_offset" : 0,"end_offset" : 1,"type" : "<IDEOGRAPHIC>","position" : 0},{"token" : "块","start_offset" : 1,"end_offset" : 2,"type" : "<IDEOGRAPHIC>","position" : 1},{"token" : "链","start_offset" : 2,"end_offset" : 3,"type" : "<IDEOGRAPHIC>","position" : 2},{"token" : "比","start_offset" : 3,"end_offset" : 4,"type" : "<IDEOGRAPHIC>","position" : 3},{"token" : "特","start_offset" : 4,"end_offset" : 5,"type" : "<IDEOGRAPHIC>","position" : 4},{"token" : "币","start_offset" : 5,"end_offset" : 6,"type" : "<IDEOGRAPHIC>","position" : 5}] }
示例
假设我们有个theme字段,存储的 “区块链,新能源,比特币,军工,医疗保健,医药”,标准分词后结果如下
POST /_analyze {"analyzer": "standard","text": "区块链,新能源,比特币,军工,医疗保健,医药" }
结果:
{"tokens" : [{"token" : "区","start_offset" : 0,"end_offset" : 1,"type" : "<IDEOGRAPHIC>","position" : 0},{"token" : "块","start_offset" : 1,"end_offset" : 2,"type" : "<IDEOGRAPHIC>","position" : 1},{"token" : "链","start_offset" : 2,"end_offset" : 3,"type" : "<IDEOGRAPHIC>","position" : 2},{"token" : "新","start_offset" : 4,"end_offset" : 5,"type" : "<IDEOGRAPHIC>","position" : 3},{"token" : "能","start_offset" : 5,"end_offset" : 6,"type" : "<IDEOGRAPHIC>","position" : 4},{"token" : "源","start_offset" : 6,"end_offset" : 7,"type" : "<IDEOGRAPHIC>","position" : 5},{"token" : "比","start_offset" : 8,"end_offset" : 9,"type" : "<IDEOGRAPHIC>","position" : 6},{"token" : "特","start_offset" : 9,"end_offset" : 10,"type" : "<IDEOGRAPHIC>","position" : 7},{"token" : "币","start_offset" : 10,"end_offset" : 11,"type" : "<IDEOGRAPHIC>","position" : 8},{"token" : "军","start_offset" : 12,"end_offset" : 13,"type" : "<IDEOGRAPHIC>","position" : 9},{"token" : "工","start_offset" : 13,"end_offset" : 14,"type" : "<IDEOGRAPHIC>","position" : 10},{"token" : "医","start_offset" : 15,"end_offset" : 16,"type" : "<IDEOGRAPHIC>","position" : 11},{"token" : "疗","start_offset" : 16,"end_offset" : 17,"type" : "<IDEOGRAPHIC>","position" : 12},{"token" : "保","start_offset" : 17,"end_offset" : 18,"type" : "<IDEOGRAPHIC>","position" : 13},{"token" : "健","start_offset" : 18,"end_offset" : 19,"type" : "<IDEOGRAPHIC>","position" : 14},{"token" : "医","start_offset" : 20,"end_offset" : 21,"type" : "<IDEOGRAPHIC>","position" : 15},{"token" : "药","start_offset" : 21,"end_offset" : 22,"type" : "<IDEOGRAPHIC>","position" : 16}] }
查询我们使用如下命令
GET my_index/_search {"query": {"bool": {"must": [{"match_phrase":{"theme":{"query":"区块链比特币","slop":0}}}]}},"from": 0,"size": 20 }
我们可以看到查询不到结果
原因分析
和match查询类似,match_phrase查询首先解析查询字符串来产生一个词条列表。然后会搜索所有的词条,但只保留包含了所有搜索词条的文档,并且词条的位置要邻接。
“区块链比特币” 标准分词后都是单个字,如上结果
“区块链,新能源,比特币,军工,医疗保健,医药”标准分词后,也都是单个字,如上结果
我们发现 ,其他关键字都紧邻着,但是“链”的postion=2 和 “比”的positon=6 之间的 position 差了4,但是我们设置的slop为0,要求分词后的位置必须紧邻(不用挪动位置),所以没有搜索到,根据我们刚才的分析,我们试着把slop逐渐增加,发现一直增大到3,才能搜到,也就是需要挪动3次,2挪动3次到5,就跟6紧挨着了,也就匹配到了
总结
1.位置信息可以被保存在倒排索引(Inverted Index)中,像match_phrase这样位置感知(Position-aware)的查询能够使用位置信息来匹配那些含有正确单词出现顺序的文档,且在这些单词之间没有插入别的单词。 我们可以在短语匹配使用slop参数来引入一些灵活性,slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配。相隔多远的意思是,你需要移动一个词条多少次来让查询和文档匹配
2.slop的含义,不仅仅是说一个query string terms移动几次,跟一个doc匹配上。一个query string terms,最多可以移动几次去尝试跟一个doc匹配上
3.slop搜索下,关键词离的越近,relevance score就会越高
elasticsearch中基于slop参数实现近似匹配相关推荐
- 18_ElasticSearch 基于slop参数实现近似匹配
18_ElasticSearch 基于slop参数实现近似匹配 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) ...
- 白话Elasticsearch18-深度探秘搜索技术之基于slop参数实现近似匹配以及原理剖析
文章目录 概述 官网 slop 含义 例子 示例一 示例二 示例三 概述 继续跟中华石杉老师学习ES,第18篇 课程地址: https://www.roncoo.com/view/55 接上篇博客 白 ...
- 高效管理 Elasticsearch 中基于时间的索引——本质是在利用滚动模式做数据的冷热分离,热索引可以用ssd...
高效管理 Elasticsearch 中基于时间的索引 转自:http://stormluke.me/es-managing-time-based-indices-efficiently/ 用 Ela ...
- Elasticsearch中基于词项的搜索
为了方便我们学习,我们导入kibana为我们提供的范例数据. 目前为止,我们已经探索了如何将数据放入Elasticsearch,现在来讨论下如何将数据从Elasticsearch中拿出来,那就是通过搜 ...
- dbscan算法中 参数的意义_基于变参数的DBSCAN算法
安全模型.算法与编程 |34| 基于变参数的 DBSCAN 算法 ◆付泽强 王晓锋 (江南大学物联网工程学院 江苏 214122) 摘要:DBSCAN 算法是一种常用的基于密度的聚类算法,其优点在于性 ...
- pandas使用drop_duplicates函数基于subset参数指定的数据列子集删除重复行、并设置keep参数保留重复行中的最后一个数据行
pandas使用drop_duplicates函数基于subset参数指定的数据列子集删除重复行.并设置keep参数保留重复行中的最后一个数据行 目录
- 图解Elasticsearch中的_source、_all、store和index属性
为什么80%的码农都做不了架构师?>>> Elasticsearch中有几个关键属性容易混淆,很多人搞不清楚_source字段里存储的是什么?store属性的true或fals ...
- 在Elasticsearch中查询Term Vectors词条向量信息
这篇文章有点深度,可能需要一些Lucene或者全文检索的背景.由于我也很久没有看过Lucene了,有些地方理解的不对还请多多指正. 更多内容还请参考整理的ELK教程 关于Term Vectors 额, ...
- 【Elasticsearch】Elasticsearch中数据是如何存储的
1.概述 转载:Elasticsearch中数据是如何存储的 前言 很多使用Elasticsearch的同学会关心数据存储在ES中的存储容量,会有这样的疑问:xxTB的数据入到ES会使用多少存储空间. ...
- 【Elasticsearch】Elasticsearch中的相似度评分介绍
1.概述 转载:Elasticsearch中的相似度评分介绍 本文要点 相关性得分是一个搜索引擎的核心,了解它的工作原理对创建一个好的搜索引擎至关重要. Elasticsearch 使用了两种相似度评 ...
最新文章
- 日期NSDate的使用
- 在ABAP XSLT中调用ABAP类的方法
- jQuery实现判断li的个数从而实现其他功能
- datatable如何生成级联数据_如何把Excel表数据批量生成条形码
- sqlite4java下载_使用sqlite4java的UnsatisfiedLinkError,没有sqlite4java-osx-amd64
- 怎么看vray渲染进度_3dmax如何渲染光子,为什么会卡光子呢?
- TreeView中丢失的图标
- 【待填坑】js构造函数和内置对象的区别
- 专注于分享,米狗网!
- bzoj1854 [Scoi2010]游戏【构图 并查集】
- 2021电工杯数学建模B题代码与思路(Python)
- 天地图卫星地图_一起看地图谷歌地图高清卫星地图在线_世界这么大,用地图去看看!...
- 各自然带代表植被_植被带气候
- STM32串口通信程序模拟超市打印机工作-使用接收中断、空闲中断、校验中断
- 快手Android一面复盘
- 2022到2023基于java+微信小程序毕业设计课题参考
- Marshmallow 库
- 比游戏还有意思的事情是什么(有自己坚持和梦想的不要看,这篇就是水文)
- Eclipse改成中文版本
- 【原】 POJ 2388 Who's in the Middle 中位数 解题报告