1

我想基于使用术语查询了解唯一字段值来进行简单查询。例如:

{
  "query": {
    "term": {
      "products.product_id": {
        "value": "Ubsdf-234kjasdf"
      }
    }
  }
}

关于term queries,Elasticsearch 文档指出:

返回在提供的字段中包含确切术语的文档。您可以使用术语查询根据价格、产品 ID 或用户名等精确值查找文档。

另一方面,文档还建议_score计算相关性很重要的查询(而不是涉及精确匹配的过滤器上下文的情况)。

我觉得有点混乱。为什么 Elasticsearch 会计算_score应该关注精确匹配而不是相关性的术语查询?

4

2 回答 2

2

过滤上下文意味着您需要将术语查询包装在bool/filter查询中,如下所示:

{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "products.product_id": {
            "value": "Ubsdf-234kjasdf"
          }
        }
      }
    }
  }
}

上述查询不会计算分数。

于 2020-03-02T12:54:00.400 回答
2

术语查询不被分析,因此它们不会进入分析阶段,因此用于精确匹配,但在查询上下文中使用时仍会计算它们的分数

当您在过滤器上下文中使用术语查询时,这意味着您不是在搜索它们,而是对它们进行过滤,因此没有为它们计算分数。

官方 ES 文档中有关查询和过滤上下文的更多信息。

下面的示例中显示了过滤器和查询上下文中的术语查询示例

查询上下文中的术语查询

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "title": "c"
                    }
                }
            ]
        }
    },
    "size": 10
}

结果得分

"hits": [
            {
                "_index": "cpp",
                "_type": "_doc",
                "_id": "4",
                "_score": 0.2876821, --> notice score is calculated
                "_source": {
                    "title": "c"
                }
            }
        ]

过滤上下文中的词条查询

{
    "query": {
        "bool": {
            "filter": [ --> prev cluase replaced by `filter`
                {
                    "term": {
                        "title": "c"
                    }
                }
            ]
        }
    },
    "size": 10
}

以及带有过滤上下文的搜索结果

 "hits": [
            {
                "_index": "cpp",
                "_type": "_doc",
                "_id": "4",
                "_score": 0.0, --> notice score is 0.
                "_source": {
                    "title": "c"
                }
            }
        ]
于 2020-03-02T12:54:24.880 回答