2019独角兽企业重金招聘Python工程师标准>>>

邻近匹配(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:

 
  1. Pos 1 Pos 2 Pos 3

  2. -----------------------------------------------

  3. Doc: quick brown fox

  4. -----------------------------------------------

  5. Query: quick fox

  6. Slop 1: quick ↳ fox

尽管在使用了slop的短语匹配中,所有的单词都需要出现,但是单词的出现顺序可以不同。如果slop的值足够大,那么单词的顺序可以是任意的。

为了让fox quick查询能够匹配我们的文档,需要slop的值为3:

 
  1. Pos 1 Pos 2 Pos 3

  2. -----------------------------------------------

  3. Doc: quick brown fox

  4. -----------------------------------------------

  5. Query: fox quick

  6. Slop 1: fox|quick ↵

  7. Slop 2: quick ↳ fox

  8. Slop 3: quick ↳ fox

转载于:https://my.oschina.net/u/926115/blog/3019040

[Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop参数相关推荐

  1. 百度竞价中的精确匹配,短语匹配,广泛匹配有什么区别。

    这里我们举例说明 假设我们设置了一个关键词 "福特福克斯改造" 1.精确匹配: 福特福克斯改造(与关键词字面完全相同的搜索词) 2.短语匹配: 精确包含--福特福克斯改造.北京福特 ...

  2. [Elasticsearch] 邻近匹配 (二) - 多值字段,邻近程度与相关度

    多值字段(Multivalue Fields) 在多值字段上使用短语匹配会产生古怪的行为: PUT /my_index/groups/1 {"names": [ "Joh ...

  3. [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles

    提高性能 短语和邻近度查询比简单的match查询在性能上更昂贵.match查询只是查看词条是否存在于倒排索引(Inverted Index)中,而match_phrase查询则需要计算和比较多个可能重 ...

  4. ElasticSearch系列 - SpringBoot整合ES:短语匹配查询 match_phrase

    文章目录 1. ElasticSearch match_phrase查询是什么?它与match查询有什么区别? 2. ElasticSearch match_phrase 查询的语法是什么? 3. E ...

  5. Elasticsearch--进阶-match_phrase短语匹配---全文检索引擎ElasticSearch工作笔记012

    然后我们再来看这个 match_phrase,短语匹配 通过这个match_phrase,我们可以实现,比如查询mill lane的时候,就只查询,包含 mill lane的短语, 不会把包含,mil ...

  6. 白话Elasticsearch17-深度探秘搜索技术之match_phrase query 短语匹配搜索

    文章目录 概述 官网 近似匹配 例子 match query match phrase query term position match_phrase的基本原理 概述 继续跟中华石杉老师学习ES,第 ...

  7. match_phrase短语匹配和近似匹配

    在上一篇match query讨论了全文检索 比如,有如下查询 {     "match": {         "content": "java s ...

  8. elasticsearch代码中如何处理搜索匹配空字符串

    使用java代码搜索ES直接匹配""并不能匹配到空字符串,如: BoolQueryBuilder mustNot = QueryBuilders.boolQuery().must( ...

  9. Elasticsearch:如何实现短语建议 - phrase suggester

    词组建议者(phrase suggester)是术语建议者(term suggester)的高级版本. 短语建议者使用的功能是选择整个校正后的短语而不是单个单词. 这是基于 ngram 语言建模的,短 ...

  10. C#正则表达式的完全匹配、部分匹配及忽略大小写的问题

    原文:C#正则表达式的完全匹配.部分匹配及忽略大小写的问题 问题的提出 根据用户给定表达式,里面含有各种数学函数,如求绝对值,三角函数,平方.开方等,分别以类似ABS(表达式),Sin(表达式),AS ...

最新文章

  1. ECshop--搜索模块细究
  2. SAP 采购订单进项税VOFM 例程增强
  3. MySql学习19-----用户管理
  4. oracle spm使用1
  5. 第三十四天 how can I 坚持
  6. lcs文本相似度_具有LCS方法的通用文本比较工具
  7. PowerDesigner生成sql语句时自动导出注释
  8. 跨考计算机报班,考研跨考的经验总结与分享
  9. 移动游戏开发图书推荐
  10. cacti配置流量汇总
  11. How to get the android resolution
  12. 官网下载mysql安装包
  13. xv6 Traps, interrupts, and drivers
  14. 数据库事务特性学习笔记
  15. 怎样在线将图片转换成icon图标
  16. PHOTOSHOP 小技巧
  17. 蓝桥杯精选赛题系列——统计数字
  18. CreateFont()函数的MSDN翻译
  19. 石墨笔记,Onenote,Effie哪个更适合评论家?
  20. LeetCode题解:矩阵中战斗力最弱的 K 行

热门文章

  1. 桂林电子科技大学校园网登录数据包抓取教程实现路由器每天自动登录
  2. 计算机读不出来u盘装系统,细说电脑重装系统u盘读不出怎么办
  3. u盘在电脑上读不出来,修复u盘插入电脑无法读取
  4. 谈谈我对普通莫队和带修莫队的拙见
  5. Unity中控制物体运动
  6. 山峰和山谷 Ridges and Valleys
  7. C++ limits头文件的用法(numeric_limits)
  8. 虚幻引擎4学习途径汇总
  9. 社区角色(Kubernetes社区Maintainer是什么角色?)
  10. 直播预告:Envoy Core Maintainer 跨洋解读 Envoy 技术(中文)