带有常量分数包装器的弹性搜索布尔查询



当使用elasticsearch-7时,我对es复合查询语法感到困惑。

虽然反复阅读 es 文档,但我只是分别找到布尔或常量分数的标准语法。

正如它所阐明的那样,我了解什么是"查询上下文"和什么是"过滤器上下文"。但是当将这两种查询类型组合在一个查询中时,我不知道这意味着什么。

让我们看一个例子:

GET /classes_test/_search
{
"size": "21",
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"match": {
"class_name": "29386556"
}
}
],
"should": [
{
"term": {
"master": "7033560"
}
},
{
"term": {
"assistant": "7033560"
}
},
{
"term": {
"students": "7033560"
}
}
],
"minimum_should_match": 1,
"must_not": [
{
"term": {
"class_id": 0
}
}
],
"filter": [
{
"term": {
"class_status": "1"
}
}
]
}
}
}
}
}

此查询可以很好地执行和响应。响应内容中的每个项目都有一个 1.0 的"_score"值。

那么,这是否意味着子布尔查询作为一个整体是在过滤器上下文中,尽管它有一个"必须"和"应该"?

我还发现布尔查询可以有一个常量分数子查询。

为什么 es 允许这些语法,但没有更多的单词要解释?

如果使用constant_score查询,则永远不会获得低于 1.0 的分数,除非您指定boost参数,在这种情况下,分数将与这些参数匹配。

如果你需要得分,你显然需要放弃constant_score

在您的情况下,您对class_namematch查询不能产生除 1 或 0 以外的任何其他分数,因为这基本上是是/否筛选器,而不是基于全文搜索的匹配。

总而言之,所有查询都在筛选器上下文中执行(因此得分为 0 或 1(,因为您不依赖于全文搜索。因此,每当使用全文搜索时,您都会获得评分,而不是因为您使用match查询。在您的情况下,您可以将所有must约束合并到filter中,这不会有任何区别,因为您只有过滤器(是/否匹配(而没有全文搜索。

最新更新