如何在弹性搜索中对bool查询中的两个字段求和?

时间:2016-01-08 09:57:32

标签: node.js elasticsearch

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

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

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

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

我必须在bool查询中包含它。因此,只有那些满足这两个条件的记录才会出现在我的结果中。这可能吗?

1 个答案:

答案 0 :(得分:0)

你可以通过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"
        }
      }
    }
  }
}

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条件的布尔字段来过滤文档。