ElasticSearch:有没有办法在同一个查询中应用两个脚本?

时间:2013-11-18 16:32:50

标签: elasticsearch

我想基于两个脚本过滤器构建一个查询,但我似乎无法让它工作。我已经尝试过使用嵌套(遵循文档中的示例),但不断收到语法错误:

QueryParsingException[[my_index] [_na] filter malformed, no field after start_object

查询是:

{
    "query": {
        "filtered": {
            "query":{
                "query_string": {
                    "query": "things.type:1 AND things.status:1"
                }
            }, 
            "filter": {
                "nested": {
                   "path": "obj",
                   "_cache": true, 
                   "filter": {
                        "bool": {
                            "must": [
                                {
                                    "script": "doc['things.type'].values.size() == 1"
                                },
                                {
                                    "script": "obj['other_things.key'].values.size() >= 1"
                                }
                            ]
                       }
                   }
                }
            }
        }
    }
}

我可以从第一个脚本("script": "doc['things.type'].values.size() == 1")中提取记录并在Python中迭代列表(唱pyelasticsearch来执行这些查询),但似乎弹性搜索应该能够这样做。

1 个答案:

答案 0 :(得分:1)

您有两个嵌套对象,因此需要两个独立的嵌套过滤器。每个嵌套过滤器都适用于单个文档,因此您无法在一个嵌套子句中访问不同的文档。您可以根据需要使用尽可能多的过滤器,并与:

连接
{
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "things.type:1 AND things.status:1"
        }
      },
      "filter": {
        "and": {
          "filters": [
            {
              "nested": {
                "path": "other_things",
                "filter": {
                  "script": {
                    "script": "doc['other_things.key'].values.size() >= 1"
                  }
                }
              }
            },
            {
              "nested": {
                "path": "things",
                "filter": {
                  "script": {
                    "script": "doc['things.type'].values.size() == 1"
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}