我遇到了一些奇怪的弹性搜索python驱动程序,并希望有人可以解释给我!以下代码直接来自cURL
但不适用于python-requests
或elasticsearch-py
,奇怪的是,当我切换到pyelasticsearch
库时,它可以正常工作!详情如下:
我有一个名为MY_TYPE
的类型,它有一个嵌套对象MY_NESTED_FIELD
和一个子文档MY_CHILD_TYPE
。我尝试根据应用于MY_TYPE
和MY_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运行此查询时(使用cURL
或head
插件),它会过滤父级并根据正确的结果返回聚合。但是,当我从python脚本尝试它时,它运行成功但返回错误的数据(它返回所有文档的facets而不应用过滤器)
我试过了:
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"
}
}
所以我的问题是: