Elasticsearch中的邻近匹配【proximity Matching】
来源:互联网 发布:c语言中如何调用函数 编辑:程序博客网 时间:2024/06/06 00:31
考虑以下这些句子的区别:
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)。
短语匹配:
就像一提到全文搜索首先会想到match查询一样,当需要查询短语的时候,应该想到match_phrase查询。
和match查询类似,match_phrase查询首先解析查询字符串来产生一个词条列表。然后会搜索所有的词条,但只保留含有了所有搜索词条的文档,并且词条的位置要邻接。一个针对短语quick fox的查询不会匹配我们的任何文档,因为没有文档含有邻接在一起的quick和box词条。
TIPmatch_phrase查询也可以写成类型为phrase的match查询:
"match": {
"title": {
"query":"quick brown fox",
"type":"phrase"
}
}
GET /_analyze?analyzer=standardQuick 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 foxSlop 1: quick ↳ fox
尽管在使用了slop的短语匹配中,所有的单词都需要出现,但是单词的出现顺序可以不同。如果slop的值足够大,那么单词的顺序可以是任意的。
为了让fox quick查询能够匹配我们的文档,需要slop的值为3:
Pos 1 Pos 2 Pos 3-----------------------------------------------Doc: quick brown fox-----------------------------------------------Query: fox quickSlop 1: fox|quick ↵ Slop 2: quick ↳ foxSlop 3: quick ↳ fox
- Elasticsearch中的邻近匹配【proximity Matching】
- elasticsearch---search in depth之Proximity matching
- [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop参数
- [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop参数
- 邻近搜索(proximity search)中的两个倒排记录表
- [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles
- [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles
- [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles
- 邻近匹配中的多值字段查询
- [Elasticsearch] 邻近匹配 (二) - 多值字段,邻近程度与相关度
- [Elasticsearch] 邻近匹配 (二) - 多值字段,邻近程度与相关度
- Elasticsearch搜索中的部分匹配
- elasticsearch中的精准文本位置匹配
- Lucene 查询中的距离查询(proximity query)
- 字符串匹配(String Matching)
- DNA matching匹配问题
- Wildcard Matching 通配符匹配
- Swift-匹配-Matching
- 机器学习实战-第2章(k-近邻算法)
- JAV中一些基本概念:构造函数、方法重载、继承、方法重写、多态。
- 黑马程序员------Java基础(IO(二))
- Android 软键盘监听事件
- poll
- Elasticsearch中的邻近匹配【proximity Matching】
- wifi驱动分析文档
- MySQL触发器
- java虚拟机内存管理机制:JVM内存管理总结
- 使用python将ppm格式转换成jpg
- C语言不定长参数的实现 va_list
- 关于ExpandableListView用法的一个简单小例子
- java虚拟机内存管理机制(二):了解JVM的内存管理与垃圾回收
- mongodb java driver3.0初探