【问题标题】:Search in ElasticSearch with where condition使用 where 条件在 ElasticSearch 中搜索
【发布时间】:2016-01-28 18:03:12
【问题描述】:

假设我有包含以下字段的文档:{field1, field2, costprice, sellingprice}

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

在标准 SQL 中,示例可能是:

SELECT * FROM Table1 where costprice-sellingprice>0

如何在 elasticsearch 中实现这一点?

【问题讨论】:

标签: elasticsearch


【解决方案1】:

您需要的是静态脚本:

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

【讨论】:

    【解决方案2】:

    您可以使用脚本过滤器来做到这一点,就像这样。

    你的病情怎么办

    {
        "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 默认禁用动态脚本。当然,您可以在配置中启用它,但最好使用索引脚本。把你的脚本放到 Elasticsearch 的scripts 目录下的price.groovy 很简单。 Elasticsearch 将为您的脚本编制索引,因此您也可以使用它:

    {
        "query": {
            "filtered": {
                "query": {
                    "match_all": {}
                },
                "filter": {
                    "bool": {
                        "must": {
                           "script": {
                               "file": "price",
                               "lang": "groovy"
                            }
                        }
                    }
                }
            }
        }
    }
    

    您的price.groovy 文件如下所示:

    (Float.parseFloat(doc['costprice'].value) - Float.parseFloat(doc['sellingprice'].value) > 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2020-03-21
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多