2

我在弹性搜索 python 驱动程序中遇到了一个奇怪的问题,想知道是否有人可以向我解释!下面的代码可以直接使用,cURL但不能使用python-requestsor elasticsearch-py,奇怪的是,当我切换到pyelasticsearch库时它可以工作!详情如下:

我有一个名为的类型MY_TYPE,它有一个嵌套对象MY_NESTED_FIELD和一个子文档MY_CHILD_TYPE。我正在尝试根据应用于MY_TYPEandMY_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"
      }
    }
  }
}

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

我努力了:

  • 卷曲:工作!
  • ElasticSearch 的 HEAD 插件:有效
  • python-requests 2.8.1 版:没用!
  • elasticsearch-py api 版本 1.4.0 和 2.1.0:没用
  • pyelasticsearch 1.4 版:有效

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 上是否有解决此问题的方法?
4

0 回答 0