首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有常量得分包装器的Elasticsearch布尔查询

带有常量得分包装器的Elasticsearch布尔查询
EN

Stack Overflow用户
提问于 2019-12-02 09:19:29
回答 1查看 1.2K关注 0票数 1

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

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

正如它所说明的,我理解什么是‘查询上下文’和什么是‘筛选上下文’,但是当将这两种查询类型组合在一个查询中时,我不知道它是什么意思。

让我们看看一个例子:

代码语言:javascript
运行
复制
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"
              }
            }
          ]
        }
      }
    }
  }
}

可以执行此查询,响应内容中的响应well.Each项具有1.0的“_score”值。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-02 09:29:23

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

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

在您的示例中,matchclass_name的查询不能产生除1或0以外的任何其他分数,因为这基本上是一个是/否筛选器,而不是基于全文搜索的匹配。

总之,由于不依赖全文搜索,所以所有查询都在过滤器上下文中执行(因此得分为0或1)。因此,无论何时使用全文搜索,都会得到评分,而不是因为使用了match查询。在您的示例中,可以将所有must约束合并到filter中,这不会产生任何影响,因为您只有筛选器(是/否匹配)和没有全文搜索。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59135779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档