在上一篇match query讨论了全文检索

比如,有如下查询

{
    "match": {
        "content": "java spark"
    }
}

match query,只能搜索到包含java和spark的document,但是不知道java和spark是不是离的很近。

如果希望搜索java spark,中间不能插入任何其他的字符,那这个时候match去做全文检索是无法做到的,此时需要使用match_phrase

一、match_phrase(短语匹配)

GET /forum/_search
{
    "query": {
        "match_phrase": {
            "content": "java spark"
        }
    }
}

doc中只有content包含java spark的文档才会返回来

1、term position(分词后的position)

GET _analyze
{
  "text": "hello world, java spark",
  "analyzer": "standard"
}

查看text内容经过standard分词器之后的position情况

2、match_phrase的基本原理

假设有如下两个doc
doc1:hello world, java spark        
doc2:hi, spark java

那么分完词之后的position如下:

hello         doc1(0)        
wolrd        doc1(1)
java          doc1(2) doc2(2)
spark        doc1(3) doc2(1)

当使用match_phrase查询java spark时:

java 匹配到: doc1(2) doc2(2)
spark 匹配到:doc1(3) doc2(1)

一个doc,必须包含每个term,才能拿出来继续计算

对于doc1:

spark position恰巧比java大1 ,恰好满足条件

对于doc2:

spark position比java position小1,而不是大1,不符合条件

最终将doc1返回

3、slop

要经过几次移动才能与一个document的field中的匹配,这个移动的次数,就是slop

举例:

hello world, java is very good, spark is also very good.

使用match_phrase检索java spark,遗憾的检索不到,此时es提供了slop,允许java spark进行移动,来尝试与doc进行匹配

java        is        very        good        spark        is

java       spark                                                               slop=0
java                   spark                                                   slop=1
java                                spark                                      slop=2
java                                                 spark                     slop=3

spark移动了3次,和匹配到了文档

GET /forum/_search
{
    "query": {
        "match_phrase": {
            "title": {
                "query": "java spark",
                "slop":  3   //最多移动3次
            }
        }
    }
}

4、召回率和精准度

召回率:搜索一个java spark,总共有100个doc,能返回多少个doc作为结果

精准度:搜索一个java spark,尽可能让包含java spark,或者是java和spark离的很近的doc,排在最前面

match_phrase短语搜索必须所有term都在doc field中出现,如果某一个doc可能就是有某个term没有包含,那么就无法作为结果返回,导致召回率比较低,精准度高

java spark 匹配:hello world java    (不能被召回)
java spark 匹配:hello world, java spark    (能被召回)

如果想提高召回率,同时也兼顾精准度

可以使用如下方式:

GET /forum/article/_search
{
  "query": {
    "bool": {
      "must": {
        "match": { 
          "title": {
            "query": "java spark"    //单纯的match是没法区分java和spark的距离,所以要配合match_phrase
          }
        }
      },
      "should": {
        "match_phrase": {
          "title": {
            "query": "java spark",
            "slop":  50
          }
        }
      }
    }
  }
}

在slop以内,如果java spark能匹配上一个doc,那么就会对doc贡献自己的relevance score,如果java和spark靠的越近,那么就分数越高

5、重打分

match query比phrase match的性能要高10倍,比proximity match(phrase match+slop)的性能要高20倍。

优化proximity match的性能,一般就是减少要进行proximity match搜索的document数量。

用match query先过滤出需要的数据,然后再用proximity match来根据term距离提高doc的分数,同时proximity match只针对每个shard的分数排名前n个doc起作用,来重新调整它们的分数,这个过程称之为rescoring,重计分。因为一般会分页查询,只会看到前几页的数据,所以不需要对所有结果进行proximity match操作。此种方式叫做重打分。
默认情况下,match匹配了1000个doc,使用proximity match会对每个doc进行一遍运算,判断能否slop移动匹配上,然后去贡献自己的分数,这样性能太低。

GET /forum/_search 
{
  "query": {
    "match": {
      "content": "java spark"
    }
  },
  "rescore": {
    "window_size": 50,    //只对match检索出来的前50条数据重新打分
    "query": {
      "rescore_query": {
        "match_phrase": {
          "content": {
            "query": "java spark",
            "slop": 50
          }
        }
      }
    }
  }
}

match_phrase短语匹配和近似匹配相关推荐

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

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

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

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

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

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

  4. Excel中VLOOKUP函数简易使用——精确匹配或近似匹配数据

    一.问题描述 在我们使用Excel的过程中,会遇到已经有一份完整的信息记录表,而业务经常需要从完整记录表中获取对应内容到业务表中,这时我们又不希望使用手动查找办法一个个查找匹配,而是希望能够一下就能精 ...

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

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

  6. php es 短语精确搜索,ES中文分词器之精确短语匹配(解决了match_phrase匹配不全的问题)...

    分词器选择 调研了几种分词器,例如IK分词器,ansj分词器,mmseg分词器,发现IK的分词效果最好.举个例子: 词:<>哈撒多撒ئۇيغۇر تىلى王者荣耀sdsd@4342啊啊啊 ...

  7. 白话Elasticsearch20-深度探秘搜索技术之使用rescoring机制优化近似匹配搜索的性能

    文章目录 概述 官网 match和phrase match(proximity match)区别 优化proximity match的性能 概述 继续跟中华石杉老师学习ES,第19篇 课程地址: ht ...

  8. ElasticSearch教程——proximity match 近似匹配

    ElasticSearch汇总请查看:ElasticSearch教程--汇总篇 1.什么是近似匹配 两个句子 java is my favourite programming language, an ...

  9. Elasticsearch 之(20)proximity match 近似匹配

    1.什么是近似匹配 两个句子 java is my favourite programming language, and I also think spark is a very good big ...

最新文章

  1. c/c++的内存四区
  2. 怎么在python下载网站内容-Python下载网页的几种方法
  3. 【荐】说说CSS Hack 和向后兼容
  4. 乡村振兴谋定齐鲁道路-农业大健康·李昌平:放权改革创新
  5. Git - 回滚到指定版本
  6. java与android https,java – Https连接Android
  7. python计算小数点后有几位_python的数字类型
  8. 擦地机器人测评_iRobot擦地机器人测评:一机在手,脏污不再有!
  9. Python导函数的一些相关
  10. 香农编码用matlab实验报告,香农编码实验报告
  11. SVN版本库备份和恢复
  12. 兵法三十六计第一计-瞒天过海。
  13. reactinput聚焦事件_React中的事件
  14. SIFT(尺度不变特征变换)的原理分析
  15. 茂名天源石化宣传“世界急救日”活动 普及急救知识
  16. Vue开发实例(15)之动态路由
  17. VirtualBox导入虚拟电脑
  18. 沪江易未来:沪江网校前端架构漫谈
  19. 历经5年,一次业余网页游戏项目惨痛的失败经历
  20. 程序员不一定要进大厂,但是算法一定要学

热门文章

  1. python双等号是什么意思_python中等号是什么意思?
  2. ArcGIS地物分类专题图制作
  3. 软件测试qa的工作职责,现场QA检查员岗位职责
  4. 产品经理:销售、协作和产品
  5. 2015年3月10日
  6. 这是第二篇情感故事------------------也是本人自己的亲身体验,也会聊一些追女孩子的注意事项,仅表示本人自己观点
  7. Installing Zune software on Windows Server 2003 SP2 (x86)
  8. AcWing每日一题
  9. Task 05 Python 爬虫入门
  10. VulnHub靶场之FirstBlood:1