lucene ElasticSearch查询应返回10.000个结果,但没有匹配项

odopli94  于 2022-11-07  发布在  Lucene
关注(0)|答案(2)|浏览(233)

因此,我有一个约60GB数据的索引,基本上我想进行查询,以检索1个特定的产品的基础上,其参考编号。
下面是我疑问:

GET myindex/_search
{
  "_source": [
    "product.ref",
    "product.urls.*",
    "product.i18ns.*.title",
    "product_sale_elements.quantity",
    "product_sale_elements.prices.*.price",
    "product_sale_elements.listen_price.*",
    "product.images.image_url",
    "product.image_count",
    "product.images.visible",
    "product.images.position"
  ],
  "size": "6",
  "from": "0",
  "query": {
    "function_score": {
      "functions": [
        {
          "field_value_factor": {
            "field": "product.sales_count",
            "missing": 0,
            "modifier": "log1p"
          }
        },
        {
          "field_value_factor": {
            "field": "product.image_count",
            "missing": 0,
            "modifier": "log1p"
          }
        },
        {
          "field_value_factor": {
            "field": "featureCount",
            "missing": 0,
            "modifier": "log1p"
          }
        }
      ],
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "product.is_visible": true
              }
            }
          ],
          "should": [
            {
              "query_string": {
                "default_field": "product.ref",
                "query": "13141000",
                "boost": 2
              }
            }
          ]
        }
      }
    }
  },
  "aggs": {
    "by_categories": {
      "terms": {
        "field": "categories.i18ns.de_DE.title.raw",
        "size": 100
      }
    }
  }
}

因此,我的问题是,为什么这个查询给予了10k个结果,而我只需要具有该参考编号的1个产品。
如果我这样做:

GET my-index/_search
{
  "query": {
    "match": {
      "product.ref": "13141000"
    }
  }
}

should与普通的match查询有什么不同?

dtcbnfnu

dtcbnfnu1#

如果您有mustfilter子句,那么任何不匹配mustfilter的内容都不必匹配您的should子句,因为它被认为是“可选的”
您可以将should子句中的query_string移动到filter,也可以将minimum_should_match设置为1,如下所示

...
"should": [
  {
    "query_string": {
      "default_field": "product.ref",
      "query": "13141000",
      "boost": 2
    }
  }
],
"minimum_should_match" : 1,
...
mcdcgff0

mcdcgff02#

必须-条件必须相符。
Should -如果条件匹配,则将提高非筛选器上下文中的分数。(如果未显式声明minimum_should_match)
正如你所看到的,must和filter类似,但也提供评分。Filter将不提供任何评分。
您可以将此子句放在新的must子句中:

{
              "query_string": {
                "default_field": "product.ref",
                "query": "13141000",
                "boost": 2
              }
            }

如果您将上述内容放在filter子句中,则Boost不会影响评分。
阅读有关布尔查询的更多信息here

相关问题