我正在使用ElasticSearch 1.5。我有八个节点设置和一个单独的客户端节点。我正在使用pycurl通过Python向引擎发送过滤器请求。我正在尝试创建一些嵌套的布尔过滤器。我可以使用两个单独的布尔过滤器,但是当我尝试将它们串在一起时,我会遇到以下失败:
{u'error': u'SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[hT6TiTqoTpGaCr45SrjUtg][ships][0]: RemoteTransportException[[Kaitlyn][inet[/172.31.14.203:9300]][indices:data/read/search[phase/query]]]; nested: SearchParseException[[ships][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [{"qu1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ufffd\ufffd\ufffd3\ufffd\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"must": 1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ufffd\ufffd\ufffd3\ufffd\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"melia"}1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ufffd\ufffd\ufffd3\ufffd\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00": {"sho1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ufffd\ufffd\ufffd3\ufffd\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}}, {"te1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ufffd\ufffd\ufffd3\ufffd\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 {"match1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]]]; nested: JsonParseException[Illegal unquoted character ((CTRL-CHAR, code 0)): has to be escaped using backslash to be included in name\n at [Source: UNKNOWN; line: 1, column: 7]]; }
谁能告诉我我做错了什么?
背景
以下代码适用于定义为
的数据data = {
"query": {
"filtered": {
"query": {"match_all":{}},
"filter": {
"bool": {
"must": [
{"bool": {
"should": [
{ "term": {"stuff":"thingamabobs"}},
{ "term": {"stuff":"trucs"}}
]
}
}
]
}
}
}
}
}
并将数据定义为
data = {
"query": {
"filtered": {
"query": {"match_all":{}},
"filter": {
"bool": {
"must": [
{"bool": {
"should": [
{ "term": {"name":"melia"}},
{ "term": {"name":"heli"}}
]
}
},
]
}
}
}
}
}
但不是将数据定义为(两个过滤器合并,显然不正确)
data = {
"query": {
"filtered": {
"query": {"match_all":{}},
"filter": {
"bool": {
"must": [
{"bool": {
"should": [
{ "term": {"name":"melia"}},
{ "term": {"name":"heli"}}
]
}
},
{"bool": {
"should": [
{ "term": {"stuff":"thingamabobs"}},
{ "term": {"stuff":"trucs"}}
]
}
}
]
}
}
}
}
}
以下是代码段。
import pycurl
import json
from StringIO import StringIO
from pprint import pprint
import time
def handlePycurlResult(result):
resultDict = json.loads(result)
print 'handlePycurlResult', type(resultDict)
pprint(resultDict)
data = ...
c = pycurl.Curl()
c.setopt(c.WRITEFUNCTION, handlePycurlResult)
c.setopt(c.URL, 'http://localhost:9200/owners/owner/_search?pretty')
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json'])
c.setopt(c.POST, 1)
c.setopt(c.POSTFIELDS, json.dumps(data))
c.perform()
c.close()
除了我用Python对象构建的JSON文档之外,上面的代码有效地复制了Convert curl example to pycurl
答案 0 :(得分:1)
我的查询中没有任何错误。但是,您得到的错误是抱怨JSON查询中存在NULL字符(即\x00
),这就是问题所在:
Failed to parse source [{"qu1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ufffd\ufffd\ufffd3\ufffd\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"must"
...
JsonParseException[Illegal unquoted character ((CTRL-CHAR, code 0)): has to be escaped using backslash to be included in name
如果您在其他地方编辑查询,然后将其复制/粘贴到Python代码中,请先尝试验证它(例如在http://jsonformatter.curiousconcept.com)并粘贴生成的紧凑JSON(即没有空格)你的代码看看会发生什么。