使用邻近度提高相关度
虽然邻近查询很有用, 但是所有词条都出现在文档的要求过于严格了。我们讨论 full-text-search 一章的 match-precision 也是同样的问题: 如果七个词条中有六个匹配, 那么这个文档对用户而言就已经足够相关了, 但是 match_phrase
查询可能会将它排除在外。
相比将使用邻近匹配作为绝对要求, 我们可以将它作为 信号— 使用, 作为许多潜在查询中的一个, 会对每个文档的最终分值做出贡献 (参考 most-fields
)。
实际上我们想将多个查询的分数累计起来意味着我们应该用 bool
查询将它们合并。
我们可以将一个简单的 match
查询作为一个 must
子句。 这个查询将决定哪些文档需要被包含到结果集中。 我们可以用 minimum_should_match
参数去除长尾。 然后我们可以以 should
子句的形式添加更多特定查询。 每一个匹配成功的都会增加匹配文档的相关度。
GET /my_index/my_type/_search
{
"query": {
"bool": {
"must": {
"match": { <1>
"title": {
"query": "quick brown fox",
"minimum_should_match": "30%"
}
}
},
"should": {
"match_phrase": { <2>
"title": {
"query": "quick brown fox",
"slop": 50
}
}
}
}
}
}
<1> must
子句从结果集中包含或者排除文档。
<2> should
子句增加了匹配到文档的相关度评分。
我们当然可以在 should
子句里面添加其它的查询, 其中每一个查询只针对某一特定方面的相关度。