【问题标题】:How can I prioritize documents in Elasticsearch query如何在 Elasticsearch 查询中优先考虑文档
【发布时间】:2021-07-13 19:32:05
【问题描述】:

我的索引中有产品。文档的结构基本上是这样的:

{
    "_id": "product",
    "_source": {
      ...
      "type": "product",
      "id": 1,
      "mainTaxon": {
        "name": "T-SHIRT",
      },
      "attributes": [
        {
          "code": "name",
          "name": "Name",
          "value": [
            "BANANA T-SHIRT"
          ],
          "score": 50
        },
      ]
    }
  },
  {
    "_id": "product",
    "_source": {
      ...
      "type": "product",
      "id": 2,
      "mainTaxon": {
        "name": "JEANS",
      },
      "attributes": [
        {
          "code": "name",
          "name": "Name",
          "value": [
            "BANANA JEANS"
          ],
          "score": 50
        },
      ]
    }
  }
}

当我搜索“BANANA”时,我会优先考虑 mainTaxonJEANS 不同的产品。因此,每个带有 mainTaxon 名称 T_SHIRT 或其他名称的产品都会在带有 mainTaxon JEANS 的产品之前列出。

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl elasticsearch-query elasticsearch-7 elasticsearch-php


    【解决方案1】:

    您可以使用boosting query 对文档进行优先排序

     {
      "query": {
        "boosting": {
          "positive": {
            "match": {
              "attributes.value": "banana"
            }
          },
          "negative": {
            "match": {
              "mainTaxon.name": "JEANS"
            }
          },
          "negative_boost": 0.5
        }
      }
    }
    

    搜索结果将是

    "hits": [
          {
            "_index": "67164768",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.5364054,
            "_source": {
              "type": "product",
              "id": 1,
              "mainTaxon": {
                "name": "T-SHIRT"
              },
              "attributes": [
                {
                  "code": "name",
                  "name": "Name",
                  "value": [
                    "BANANA T-SHIRT"
                  ],
                  "score": 50
                }
              ]
            }
          },
          {
            "_index": "67164768",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.32743764,
            "_source": {
              "type": "product",
              "id": 2,
              "mainTaxon": {
                "name": "JEANS"
              },
              "attributes": [
                {
                  "code": "name",
                  "name": "Name",
                  "value": [
                    "BANANA JEANS"
                  ],
                  "score": 50
                }
              ]
            }
          }
        ]
    

    【讨论】:

    • 嗨@ESCoder。抱歉耽搁了。您的解决方案部分正确。我不得不使用嵌套查询。使用您的解决方案,相关分数没有改变。
    猜你喜欢
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多