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

}

}}

]

}

}

}

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

posted @ 2018-03-08 09:02  outback123  阅读(450)  评论(0编辑  收藏  举报