【问题标题】:How to sum two fields inside a bool Query in Elastic Search?如何在弹性搜索中对布尔查询中的两个字段求和?
【发布时间】:2016-01-08 20:37:26
【问题描述】:

我正在使用 Elasticsearch 来查找我的结果。如何对查询中的两个字段求和?

{
  "query": {
    "bool": {
      "must": [
        { "term": { "x.flag1": "false" } },
        { "term": { "x.flag2": "false" } }
      ]
    }
  }
}

现在我想找到两个字段的总和 x.ax.b 并将其与另一个字段进行比较,例如 x.c

(x.a + x.b === x.c) 

我必须将它包含在 bool 查询中。这样只有同时满足这两个条件的记录才会出现在我的结果中。这可能吗?

【问题讨论】:

    标签: node.js elasticsearch


    【解决方案1】:

    您可以像这样通过script query 进行操作:

    查询 ES 2.x 及以后版本:

    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "x.flag1": "false"
              }
            },
            {
              "term": {
                "x.flag2": "false"
              }
            }
          ],
          "filter": {
            "script": {
              "script": "doc['x.a'].value + doc['x.b'].value === doc['x.c'].value"
            }
          }
        }
      }
    }
    

    对于 pre-2.0 ES 版本的相同查询:

    {
      "query": {
        "filtered": {
          "filter": {
            "bool": {
              "must": [
                {
                  "term": {
                    "x.flag1": "false"
                  }
                },
                {
                  "term": {
                    "x.flag2": "false"
                  }
                },
                {
                  "script": {
                    "script": "doc['x.a'].value + doc['x.b'].value === doc['x.c'].value"
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    请注意,您需要 enable dynamic scripting 才能使其正常工作(即 script.inline: true)。

    但是,如果您有很多文档,这会很快降低您的 ES 集群的速度。如果可能的话,这应该在索引时完成,您可以为此目的创建另一个布尔字段,然后您可以简单地根据包含您需要的 true/false 条件的布尔字段过滤文档。

    【讨论】:

    • : QueryParsingException[[dooht] [bool] 查询不支持[filter]];我收到这个错误怎么办?
    • 您是否使用的是 2.0 之前的 ES 版本?
    • 哦..我有 1.74 ES
    猜你喜欢
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2016-10-04
    相关资源
    最近更新 更多