使用邻近度提高相关度

虽然邻近查询很有用, 但是所有词条都出现在文档的要求过于严格了。我们讨论 full-text-search 一章的 match-precision 也是同样的问题: 如果七个词条中有六个匹配, 那么这个文档对用户而言就已经足够相关了, 但是 match_phrase 查询可能会将它排除在外。

相比将使用邻近匹配作为绝对要求, 我们可以将它作为 信号— 使用, 作为许多潜在查询中的一个, 会对每个文档的最终分值做出贡献 (参考 most-fields)。

实际上我们想将多个查询的分数累计起来意味着我们应该用 bool 查询将它们合并。

我们可以将一个简单的 match 查询作为一个 must 子句。 这个查询将决定哪些文档需要被包含到结果集中。 我们可以用 minimum_should_match 参数去除长尾。 然后我们可以以 should 子句的形式添加更多特定查询。 每一个匹配成功的都会增加匹配文档的相关度。

  1. GET /my_index/my_type/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match": { <1>
  7. "title": {
  8. "query": "quick brown fox",
  9. "minimum_should_match": "30%"
  10. }
  11. }
  12. },
  13. "should": {
  14. "match_phrase": { <2>
  15. "title": {
  16. "query": "quick brown fox",
  17. "slop": 50
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }

<1> must 子句从结果集中包含或者排除文档。

<2> should 子句增加了匹配到文档的相关度评分。

我们当然可以在 should 子句里面添加其它的查询, 其中每一个查询只针对某一特定方面的相关度。