[Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop參数
本文翻译自Elasticsearch官方指南的Proximity Matching一章。
邻近匹配(Proximity Matching)
使用了TF/IDF的标准全文搜索将文档,或者至少文档中的每一个字段,视作"一大袋的单词"(Big bag of Words)。match查询可以告诉我们这个袋子中是否包括了我们的搜索词条,可是这仅仅是一个方面。它不能告诉我们关于单词间关系的不论什么信息。
考虑下面这些句子的差别:
- Sue ate the alligator.
- The alligator ate Sue.
- Sue never goes anywhere without her alligator-skin purse.
一个使用了sue alligator的match查询会匹配以上全部文档,可是它无法告诉我们这两个词是否表达了部分原文的部分意义,或者是表达了完整的意义。
理解单词间的联系是一个复杂的问题,我们也无法只依靠还有一类查询就解决问题,可是我们至少能够通过单词间的距离来推断单词间可能的关系。
真实的文档或许比上面几个样例要长的多:Sue和alligator或许相隔了几个段落。或许我们仍然希望包括这种文档,可是我们会给那些Sue和alligator出现的较近的文档更高的相关度分值。
这就是短语匹配(Phrase Matching),或者邻近度匹配(Proximity Matching)。
TIP
本章中,我们仍然会使用match查询中使用的演示样例文档。
短语匹配(Phrase Matching)
就像一提到全文搜索会首先想到match查询一样,当你须要寻找邻近的几个单词时,你会使用match_phrase查询:
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": "quick brown fox"
}
}
}
和match查询类似,match_phrase查询首先解析查询字符串来产生一个词条列表。然后会搜索全部的词条,但仅仅保留含有了全部搜索词条的文档,而且词条的位置要邻接。一个针对短语quick fox的查询不会匹配我们的不论什么文档,由于没有文档含有邻接在一起的quick和box词条。
TIP
match_phrase查询也能够写成类型为phrase的match查询:
"match": {
"title": {
"query": "quick brown fox",
"type": "phrase"
}
}
词条位置
当一个字符串被解析时,解析器不仅仅仅返回一个词条列表,它同一时候也返回每一个词条的位置,或者顺序信息:
GET /_analyze?analyzer=standard
Quick brown fox
会返回下面的结果:
{
"tokens": [
{
"token": "quick",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "brown",
"start_offset": 6,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "fox",
"start_offset": 12,
"end_offset": 15,
"type": "<ALPHANUM>",
"position": 3
}
]
}
位置信息可以被保存在倒排索引(Inverted Index)中,像match_phrase这样位置感知(Position-aware)的查询可以使用位置信息来匹配那些含有正确单词出现顺序的文档,在这些单词间没有插入别的单词。
短语是什么
对于匹配了短语"quick brown fox"的文档,以下的条件必须为true:
- quick,brown和fox必须所有出如今某个字段中。
- brown的位置必须比quick的位置大1。
- fox的位置必须比quick的位置大2。
假设以上的不论什么条件没有被满足,那么文档就不能被匹配。
TIP
在内部,match_phrase查询使用了低级的span查询族(Query Family)来运行位置感知的查询。span查询是词条级别的查询,因此它们没有解析阶段(Analysis Phase);它们直接搜索精确的词条。
幸运的是,大多数用户差点儿不须要直接使用span查询,由于match_phrase查询通常已经够好了。可是,对于某些特别的字段,比方专利搜索(Patent Search),会使用这些低级查询来运行拥有很特别构造的位置搜索。
混合起来(Mixing it up)
精确短语(Exact-phrase)匹配或许太过于严格了。或许我们希望含有"quick brown fox"的文档也可以匹配"quick fox"查询,即使位置并非全然相等的。
我们能够在短语匹配使用slop參数来引入一些灵活性:
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": {
"query": "quick fox",
"slop": 1
}
}
}
}
slop參数告诉match_phrase查询词条可以相隔多远时仍然将文档视为匹配。相隔多远的意思是,你须要移动一个词条多少次来让查询和文档匹配?
我们以一个简单的样例来阐述这个概念。为了让查询quick fox可以匹配含有quick brown fox的文档,我们须要slop的值为1:
Pos 1 Pos 2 Pos 3
-----------------------------------------------
Doc: quick brown fox
-----------------------------------------------
Query: quick fox
Slop 1: quick ↳ fox
虽然在使用了slop的短语匹配中,全部的单词都须要出现,可是单词的出现顺序能够不同。假设slop的值足够大,那么单词的顺序能够是随意的。
为了让fox quick查询可以匹配我们的文档,须要slop的值为3:
Pos 1 Pos 2 Pos 3
-----------------------------------------------
Doc: quick brown fox
-----------------------------------------------
Query: fox quick
Slop 1: fox|quick ↵
Slop 2: quick ↳ fox
Slop 3: quick ↳ fox
[Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop參数的更多相关文章
- [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles
提高性能 短语和邻近度查询比简单的match查询在性能上更昂贵.match查询仅仅是查看词条是否存在于倒排索引(Inverted Index)中,而match_phrase查询则须要计算和比較多个可能 ...
- ElasticSearch 学习记录之ES短语匹配基本用法
短语匹配 短语匹配故名思意就是对分词后的短语就是匹配,而不是仅仅对单独的单词进行匹配 下面就是根据下面的脚本例子来看整个短语匹配的有哪些作用和优点 GET /my_index/my_type/_sea ...
- [Elasticsearch] 邻近匹配 (二) - 多值字段,邻近程度与相关度
多值字段(Multivalue Fields) 在多值字段上使用短语匹配会产生古怪的行为: PUT /my_index/groups/1 { "names": [ "Jo ...
- Elasticsearch 邻近查询示例
Elasticsearch 邻近查询示例(全切分分词) JAVA API方式: SpanNearQueryBuilder span = QueryBuilders.spanNearQuery(); s ...
- 二分图带权匹配、最佳匹配与KM算法
---------------------以上转自ByVoid神牛博客,并有所省略. [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和 ...
- 二分图匹配之最佳匹配——KM算法
今天也大致学了下KM算法,用于求二分图匹配的最佳匹配. 何为最佳?我们能用匈牙利算法对二分图进行最大匹配,但匹配的方式不唯一,如果我们假设每条边有权值,那么一定会存在一个最大权值的匹配情况,但对于KM ...
- 【转】fnmatch模块的使用——主要作用是文件名称的匹配,并且匹配的模式使用的unix shell风格
[转]fnmatch模块的使用 fnmatch模块的使用 此模块的主要作用是文件名称的匹配,并且匹配的模式使用的unix shell风格.fnmatch比较简单就4个方法分别是:fnmatch,fnm ...
- (转载)常用正则表达式大全!(例如:匹配中文、匹配html)
正则匹配java注意点: 如果加 ^[\n]* 表示替换遇到 \n 的前后内容,如果加[\n]表示替换\n本处内容 原文地址:http://blog.csdn.net/dl020840504/arti ...
- servlet路径映射中的完全路径匹配、目录匹配、扩展名匹配
在servlet路径映射中,关于url-pattern的配置有三种,分别是完全路径匹配.目录匹配.扩展名匹配 其优先级分别为:完全路径匹配>目录匹配>扩展名匹配: 一.三种路径印射的区别 ...
随机推荐
- 移动端 像素渲染流水线与GPU Hack
什么是 像素渲染流水线 web页面你所写的页面代码是如何被转换成屏幕上显示的像素的.这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤: 1.JavaScript:一般来说,我们会使用JavaS ...
- SQL Server中tempdb的管理
原文:SQL Server中tempdb的管理 资料来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/ ht ...
- OpenNMS在安装”我找不到jrrd.dll“错误的解决方法
在Windows 2003 Server(虚拟机)安装OpenNMS.找不到jrrd.dll错误.尝试从学习OpenNMS官网下载jrrd-1.0.7.tar.gz,我们没有发现标dll文件,编译需要 ...
- web自定义炫酷字体
电脑有已经安装好的字体,但是如果你有特殊需要而要选择其他字体,则需要以下几个步骤 1.寻找适合你的字体 有下面几个站点提供字体下载: www.theleagueofmoveabletype.com w ...
- transform:translateZ() 字体模糊问题 父类重返Z轴平面
translateZ()变糊 第一种情况: 当translateZ(m)中的 m设置为 非整数,1.5px 之类的,字体会模糊,但是不明显;和浏览器渲染,字体格式,或者操作系统有关, 这个 css中 ...
- Run Book Automation - RBA系统介绍
什么是RBA系统? 介绍这个系统之前, 先介绍一下开发这个系统的公司. BMC BMC软件公司是全球率先的业务服务管理解决方式的开发及供应商,现为全球第六大独立软件公司. 通过帮助用户主动提升服务.降 ...
- 轻狂写的桌面日历秀NSIS脚本供大家参考学习
原文 轻狂写的桌面日历秀NSIS脚本供大家参考学习 现在共享桌面日历秀的NSIS脚本,以便交流学习.此脚本实现的功能如下: 7-Zip打开看不到内容.自动读取原安装路径,如果有则不允许更改.取得编译日 ...
- CSV文件格式分析器执行:从字符串Split至FSM
本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee/article/details/38309147 本文分为5小节,基本上就是我刚接触C ...
- java通用抹去魔,在边界行动,擦除补偿
java通用抹去魔 package org.rui.generics.erasure; public class HasF { public void f(){ System.out.println( ...
- ASP.NET MVC应用程序展示RDLC报表
原文:ASP.NET MVC应用程序展示RDLC报表 学习ASP.NET MVC这样久,在学习,练习与应用过程中,觉得很多知识与以前的ASP.NET多有区别,但是实现操作起来,细处又有许多相近的地方. ...