首先需要了解两个概念,召回率和精准度
召回率
比如搜索一个java spark,总共有100个document,能返回多少个document作为结果,这个就是召回率(recall)
精准度
比如搜索一个java spark,能不能尽可能让包含java spark这个短语的,或者是java和spark离的很近的document,排在最前面,这个就是精准度(precision)
混合使用match和近似匹配
直接使用match phrase短语搜索,会导致所有term都在document的filed中出现,而且距离要在slop规定的范围内,才能匹配的到
近似匹配的时候,召回率比较低,因为精准度太高了.
但是有时候我们可能希望是匹配到几个term中的部分,就可以作为返回结果返回回来,这样可以提高召回率,同时我们也希望用上match_phrase根据距离提升分数的功能,让几个term距离越近分数就越高,优先返回,也就是优先满足召回率
比如说,优先提升召回率就是:搜索java spark,包含java的也返回,包含spark的也返回,包含java和spark的也返回.
同时兼顾精准度:就是说包含java和spark,同时java和spark离得越近的document排在前面
此时,我们可以使用bool组合match query和match_phrase query一起,来实现上述效果
实战案例
构建一个搜索请求
1 | GET /forum/article/_search |
看一下上面这个请求,must里面可能返回的是包含java或spark或java spark,同时包含java spark的靠前,但是没法区分距离,也许距离很近但是排在了后面
should里面呢,在slop以内,如果java spark能匹配上一个doc,那么就会对doc贡献自己的relevance score,如果java和spark靠的越近,那么分数就越高
先来试一下不加近似匹配的搜索
1 | GET /forum/article/_search |
返回值:
1 | { |
id是2的doc排在了id是5的前面.
然后再加上近似匹配
1 | GET /forum/article/_search |
返回值:
1 | { |
可以看到id是5的doc排在了id是2的doc的前面