在ElasticSearch中搜索where condition

时间:2016-01-28 09:20:29

标签: elasticsearch

我们说我的文档包含以下字段:{field1, field2, costprice, sellingprice}

我需要运行一些查询,其中某些条件需要costpricesellingprice之间的差异

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

SELECT * FROM Table1 where costprice-sellingprice>0

我如何在elasticsearch中实现这一目标?

2 个答案:

答案 0 :(得分:3)

仍然需要脚本:

{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "filter": {
        "script": {
          "script": "doc['costprice'].value - doc['sellingprice'].value > 0"
        }
      }
    }
  }
}

答案 1 :(得分:1)

您可以使用脚本过滤器来完成此操作。

如何处理你的病情

{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "must": {
                        "script": {
                            "script": "(Float.parseFloat(doc['costprice'].value) - Float.parseFloat(doc['sellingprice'].value) > 0"
                        }
                    }
                }
            }
        }
    }
}

请注意,默认情况下禁用动态脚本

  

默认情况下从v1.4.3关闭Groovy动态脚本   默认情况下,Groovy动态脚本是关闭的,这会阻止动态Groovy脚本作为请求的一部分被接受或从特殊的.scripts索引中检索。您仍然可以在每个节点上的config / scripts /目录中使用存储在文件中的Groovy脚本。 (https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html

默认情况下,Elasticsearch已禁用动态脚本。对于cource,您可以在配置中启用它,但最好使用索引脚本。将您的脚本放在price.groovy的Elasticsearch的{​​{1}}目录中很简单。 Elasticsearch将为您的脚本编制索引,因此您可以使用以下内容:

scripts

您的{ "query": { "filtered": { "query": { "match_all": {} }, "filter": { "bool": { "must": { "script": { "file": "price", "lang": "groovy" } } } } } } } 文件如下:

price.groovy