[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的配置有三种,分别是完全路径匹配.目录匹配.扩展名匹配 其优先级分别为:完全路径匹配>目录匹配>扩展名匹配: 一.三种路径印射的区别 ...
随机推荐
- 【转】window.scroll 浏览器滚动条的参数总结
如内容超出单元格,则隐藏style="TABLE-LAYOUT: fixed" 让弹出窗口总是在最上面: <body onblur="this.focus();&q ...
- 8、Cocos2dx 3.0三,找一个小游戏开发3.0存储器管理的版本号
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十 ...
- Java并发编程之ConcurrentHashMap(转)
ConcurrentHashMap ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法.Concurrent ...
- Oracle 常见函数使用汇总
INSTR用法:INSTR(string,subString,position,ocurrence)解释:string:源字符串 subString:要查找的子字符串 positi ...
- Hadoop0.20.2 Bloom filter应用演示样例
1. 简单介绍 參见<Hadoop in Action>P102 以及 <Hadoop实战(第2版)>(陆嘉恒)P69 2. 案例 网上大部分的说明不过依照<Hadoop ...
- 关于 pthread_cond_wait 和 pthread_cond_signal , signal 无效的问题
关于一个消费者模式,,,引起的问题.. 我在io线程里不断的把一个函数调用放到队列里 然后ruby线程就不断的从这个队列里取出函数之争并运行. 典型的 消费者模式. 我曾经以为是这样... 这是wor ...
- java 面试题汇总(未完成)
版权声明:本文博客原创文章,博客,未经同意,不得转载.
- linux内核包转发过程(三)NIC帧接收分析
[版权声明:转载请保留源:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 每一个cpu都有队列来处理接收到的帧.都有其数据结构来处理入口和出口流量,因此.不同 ...
- 開始开发 Dashboard Widgets,第2章,读书笔记
文件夹:http://blog.csdn.net/wide288/article/details/40298693 主要内容: widgets 的组成是什么. 怎么创建 info.plist 文件 怎 ...
- about greenplum collection tool
three collection tool for greenplum:pstack.strace.gcore. ...