zoukankan      html  css  js  c++  java
  • 20.混合使用match和近似匹配实现召回率与精准度的平衡

    主要知识点:

    • 召回率的慨念
    • 精准度的慨念
    • match和近似匹配混合使用方法

       

       

    召回率(recall:比如你搜索一个java spark,总共有100doc,能返回多少个doc作为结果,就是召回率。

    精准度(precision:比如你搜索一个java spark,能不能尽可能让包含java spark,或者是javaspark离的很近的doc的分数越高排在最前面。

    直接用match_phrase短语搜索,会导致必须所有term都在doc field中出现,而且距离在slop限定范围内,才能匹配上。如果某一个doc可能就只一有某一个term没有包含到,也是无法作为结果返回。比如:

    java spark --> hello world java --> 就不能返回了

    java spark --> hello world, java spark --> 才可以返回

       

    近似匹配的时候,召回率比较低,精准度太高了

    直接用match进行查询时召回率较高,但是精准度太低了。

       

    很多时候我们可能希望有部分term被匹配也能做为结果返回,并且返回的结果集中,以近似匹配的方式进行排序。这时就要混合使用match和近似匹配实现召回率与精准度的平衡。此时可以用bool组合match querymatch_phrase query一起,来实现上述效果。

       

    一、先执行macth查询:

       

    GET /forum/article/_search

    {

    "query": {

    "match": {

    "content": "java spark"

    }

    }

    }

    查出4条数据,最大数据的分数是

       

    二、再进行match_phrase查询:

    GET /forum/article/_search

    {

    "query": {

    "match_phrase": {

    "content": {

    "query": "java spark",

    "slop":50

    }

    }

    }

    }

    查询出一条结果,可以和上边作分数比较,本次查询分数较低。

    三、混合查询

       

    GET /forum/article/_search

    {

    "query": {

    "bool": {

    "must": [

    {"match": {

    "content": "java spark"

    }}

    ],

    "should": [

    {"match_phrase": {

    "content": {

    "query": "java spark",

    "slop":50

    }

    }}

    ]

    }

    }

    }

    也查出两条结果,但是两条结果的分数和上两次查询都不同,满足了我们的需求,

  • 相关阅读:
    Golang :索引值对的数组
    MySql-BlackHole:黑洞引擎
    golang fmt 中的 Sprintf、Fprintf和 Printf函数
    golang 中的 rune 和 byte
    mysql 全文索引
    Python 原始字符串
    如何给博客园(或者CSDN)设置域名访问
    CPU、内存、磁盘三者的关系
    018.redis 阶段性总结:1T 以上海量数据+10 万以上 QPS 高并发+ 99.99% 高可用
    017.redis 在实践中的一些常见问题以及优化思路(包含 linux 内核参数优化)
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8526467.html
Copyright © 2011-2022 走看看