19 使用match和近似匹配实现召回率(recall)与精准度(precision)的平衡

召回率recall

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

精准度 precision

  比如搜索一个java spark,能不能尽可能让包含java spark,或者是java和spark离的很近的doc,排在最前面,precision直接用match_phrase短语搜索,会导致必须所有term都在doc field中出现,而且距离在slop限定范围内,才能匹配上

  match phrase,proximity match,要求doc必须包含所有的term,才能作为结果返回;如果某一个doc可能就是有某个term没有包含,那么就无法作为结果返回

  比如:
  java spark --> hello world java --> 就不能返回了
  java spark --> hello world, java spark --> 才可以返回

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

  但是有时可能希望的是匹配到几个term中的部分,就可以作为结果出来,这样可以提高召回率。同时也希望用上match_phrase根据距离提升分数的功能,让几个term距离越近分数就越高,优先返回

  就是优先满足召回率,意思,java spark,包含java的也返回,包含spark的也返回,包含java和spark的也返回;同时兼顾精准度,就是包含java和spark,同时java和spark离的越近的doc排在最前面 .

方案:

  可以用bool组合match query和match_phrase query一起,来实现上述效果

GET /forum/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "java spark"
          }
        }
      ]
    }
  }
}

  

   bool组合match query和match_phrase query的情况

GET /forum/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "java spark"
          }
        }
      ],
      "should": [
        {
          "match_phrase": {
            "content": {
              "query": "java spark",
              "slop": 50
            }
          }
        }
      ]
    }
  }
}

  

 

 

 

 

 

 

 

posted on 2020-11-10 23:16  溪水静幽  阅读(257)  评论(0)    收藏  举报