elasticsearch-py驱动程序在聚合时不会正确过滤数据

时间:2015-10-22 12:04:33

标签: elasticsearch pyelasticsearch elasticsearch-py

我遇到了一些奇怪的弹性搜索python驱动程序,并希望有人可以解释给我!以下代码直接来自cURL但不适用于python-requestselasticsearch-py,奇怪的是,当我切换到pyelasticsearch库时,它可以正常工作!详情如下:

我有一个名为MY_TYPE的类型,它有一个嵌套对象MY_NESTED_FIELD和一个子文档MY_CHILD_TYPE。我尝试根据应用于MY_TYPEMY_CHILD_TYPE类型的过滤器对嵌套属性进行术语构面聚合。查询看起来像

{
  "query": {
    "filtered": {
      "filter": {
        "has_child": {
          "query": {
            "range": {
              "CHILD_FIELD": {
                "gte": 0.5
              }
            }
          },
          "type": "MY_CHILD_TYPE"
        }
      }
    }
  },    

  "aggs": {
    "aggregation_results": {
      "aggs": {
        "boards": {
          "terms": {
            "field": "MY_NESTED_FIELD.KEY",
            "size": 100
          },
          "aggs": {
            "MY_RANGES": {
              "range": {
                "ranges": [
                  {
                    "to": 0.5,
                    "from": 0
                  },
                  {
                    "to": 0.8
                    "from": 0.5
                  }
                ],
                "field": "MY_NESTED_FIELD_PATH.VALUE"
              }
            }
          }
        }
      },
      "nested": {
        "path": "MY_NESTED_FIELD_PATH"
      }
    }
  }
}

当我直接针对elasticsearch运行此查询时(使用cURLhead插件),它会过滤父级并根据正确的结果返回聚合。但是,当我从python脚本尝试它时,它运行成功但返回错误的数据(它返回所有文档的facets而不应用过滤器)

我试过了:

  • cURL:工作!
  • ElasticSearch的HEAD插件: Works!
  • python-requests版本2.8.1:无效!
  • elasticsearch-py api版本1.4.0和2.1.0:无效!
  • pyelasticsearch版本1.4: Works!

elasticsearch-py的代码片段是:

from elasticsearch import Elasticsearch
es   = Elasticsearch('HOST:PORT')
data = es.search(index='INDEX_NAME', doc_type='MY_TYPE', body=payload, q='*:*', size=0)

使用python-requests时,代码是:

import requests
url = 'http://ES_HOST:ES_PORT/ES_INDEX/ES_TYPE/_search'
params = {'size':0, 'q':'*:*'}
data   = requests.post(url, params=params, data=json.dumps(payload)).json()

我的弹性搜索版本是:

{
  "version": {
    "number": "1.4.4",
    "build_hash": "c88f77ffc81301dfa9dfd81ca2232f09588bd512",
    "build_timestamp": "2015-02-19T13:05:36Z",
    "build_snapshot": false,
    "lucene_version": "4.10.3"
  }
}

所以我的问题是:

  1. 这是编写此查询的最佳方式吗?
  2. 有没有解释为什么elasticsearch-py的行为很奇怪?
  3. 在elasticsearch-py上有解决方法吗?

0 个答案:

没有答案