Elasticsearch:如何使精确匹配排名靠前?

2024-04-08

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

我想要的是精确匹配“vision”应该具有最高分数,并且包含“vision”的项目应该排名在精确匹配之后。排名应该是:

vision > vision A > vision B > xx version

我检查了Elasticsearch 精确匹配术语 https://stackoverflow.com/questions/37529851/elasticsearch-match-exact-term其中将“index”更改为“not_analyzed”被识别以实现精确匹配。但就我而言,不仅需要精确匹配,还需要包含匹配。

对于这个案子我能做什么?谢谢!


要实现这一点,您可以做的是在 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
            }
          }
        }
      ]
    }
  }
}
  • 第一个子句将匹配包含以下内容的所有文档vision在他们的name field.
  • 第二个条款将为以下文件提供更高的推动力:name.keyword字段恰好包含vision. name.keyword通常是一个keyword场(以前是not_analyzed string field).
  • 第三个子句将为以下文档提供稍高的提升:name.keyword字段开头为vision.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch:如何使精确匹配排名靠前? 的相关文章

随机推荐