Elasticsearch 字段比较

22

假设我有以下字段的文档:{field1, field2, ... fieldn}

我需要运行一些查询,其中一些条件将需要比较两个或更多字段。例如:fieldX = fieldY

在标准SQL中,一个例子可能是:

SELECT * FROM Table1 WHERE farePrice>100 AND originRegion = destinationRegion 

我已经阅读了一些文档,似乎“脚本编写”可能是实现此目的的唯一方法?还有其他选项吗?

1个回答

39

您可以使用脚本过滤器 -

{
  "filtered": {
    "query": {
      "range": {
        "farePrice": {
          "gt": 100
        }
      }
    },
    "filter": {
      "script": {
        "script": "doc['originRegion'].value ==  doc['destinationRegion'].value"
      }
    }
  }
}

你可以在 这里这里 找到更多信息。


非常感谢,这个有效。我想脚本编写可能是比较字段之间的唯一方法。脚本编写对性能有负面影响吗? - jdiaz4517
3
脚本编写通常会占用CPU资源。 - Vineeth Mohan
4
对于 ES 5.0+,你需要在顶层使用 query,而不是 filtered。例如:"query":{"bool":{"must": {"range":...}},"filter":...}。参考链接:https://dev59.com/W1kS5IYBdhLWcg3wASHc。 - AJP
你会如何使用Lucene语法来实现这个? - Sam
2
@Sam - 这个操作是在文档值上完成的,而不是反向索引。因此,在Lucene中查询是无法帮助你的。你需要编写一个扩展来自定义收集器接口或其他东西,并解决它。 - Vineeth Mohan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接