【问题标题】:Elasticsearch: how to rank-high the exact match?Elasticsearch:如何排名高的完全匹配?
【发布时间】:2018-10-26 12:00:59
【问题描述】:

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

我想要的是完全匹配“视觉”应该有最高分,包含“视觉”的项目应该排在完全匹配之后。排名应该是:

vision > vision A > vision B > xx version

我检查了Elasticsearch match exact term,其中将“index”更改为“not_analyzed”被识别为实现精确匹配。但在我的情况下,不仅需要完全匹配,还需要包含匹配。

我可以为这种情况做些什么?谢谢!

【问题讨论】:

    标签: elasticsearch


    【解决方案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
                }
              }
            }
          ]
        }
      }
    }
    
    • 第一个子句将匹配所有在其name 字段中包含vision 的文档。
    • 第二个子句将对name.keyword 字段正好包含vision 的文档给予更高的提升。 name.keyword 通常是 keyword 字段(以前是 not_analyzed string 字段)。
    • 第三个子句将对name.keyword 字段以vision 开头的文档提供稍高的提升。

    【讨论】:

    • 你速度超快
    • 非常感谢瓦尔!完美解决问题!
    • 太棒了,很高兴它有帮助!
    • @Val 我们如何在query_string 中提升精确匹配,其中字段可以是任意的,在这种情况下有没有办法提升。
    • @NeerajJain 随时根据您的确切需求提出新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多