我在弹性搜索 python 驱动程序中遇到了一个奇怪的问题,想知道是否有人可以向我解释!下面的代码可以直接使用,cURL
但不能使用python-requests
or elasticsearch-py
,奇怪的是,当我切换到pyelasticsearch
库时它可以工作!详情如下:
我有一个名为的类型MY_TYPE
,它有一个嵌套对象MY_NESTED_FIELD
和一个子文档MY_CHILD_TYPE
。我正在尝试根据应用于MY_TYPE
andMY_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"
}
}
所以我的问题是:
- 这是编写此查询的最佳方式吗?
- 有没有解释为什么 elasticsearch-py 行为异常?
- 在 elasticsearch-py 上是否有解决此问题的方法?