一尘不染

Elasticsearch:精确匹配的排名如何?

elasticsearch

我想在一个字段中搜索“ vision”项目,但是通过在DSL中使用match / match_phrace / term,我只得到了“ vision
A”,“ vision B”,“ xx版本”,“ vision”等结果。

我想要的是精确匹配“视觉”应该获得最高分,而包含“视觉”的项目应该排在精确匹配之后。排名应该是:

vision > vision A > vision B > xx version

我检查了Elasticsearch匹配精确术语其中识别出将“索引”更改为“not_analyzed”即可实现精确匹配。但是在我的情况下,不仅需要完全匹配,还需要包含匹配。

在这种情况下我该怎么办?谢谢!


阅读 298

收藏
2020-06-22

共1个答案

一尘不染

您可以做到的是在q bool/should查询中包含一些约束以控制排名。

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "name": "vision"                  <--- match on vision
        }
      },
      "should": [
        {
          "term": {
            "name.keyword": {               <--- boost exact matches on keyword field (i.e. "vision")
              "value": "vision",
              "boost": 3
            }
          }
        },
        {
          "prefix": {
            "name.keyword": {               <--- boost prefix matches on keyword field (i.e. "vision A" and "vision B"
              "value": "vision",
              "boost": 2
            }
          }
        }
      ]
    }
  }
}
  • 第一个子句将匹配visionname字段中包含的所有文档。
  • 第二个子句将进一步提高其name.keyword字段精确包含的文档visionname.keyword通常是一个keyword字段(以前是一个not_analyzed string字段)。
  • 第三子句将对name.keyword字段以开头的文档提供更高的提升vision
2020-06-22