【发布时间】:2016-09-20 01:09:43
【问题描述】:
我正在玩弹性搜索,但遇到了一个奇怪的问题:我有一个更像这样的请求,我通过多种方式建立起来:
curl -XGET 'http://127.0.0.1:9200/train-recipe/_search' -d '{
'query': {
'more_like_this': {
'fields': ['ingredients'],
'max_query_terms': 12,
'like': [{'_type': 'recipe', '_id': 2938, '_index': 'train-recipe'}],
'min_term_freq': 1
}
},
'from': 0,
'size': 10
}'
我得到以下回复:
{"error":{"root_cause":[{"type":"json_parse_exception","reason":"json_parse_exception: Unrecognized token 'ingredients': was expecting ('true', 'false' or 'null')\n at [Source: [B@6f7a6ea4; line: 4, column: 34]"}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"train-recipe","node":"kfORe_NWSE2gIeHSHGgIQw","reason":{"type":"query_parsing_exception","reason":"Failed to parse","index":"train-recipe","caused_by":{"type":"json_parse_exception","reason":"json_parse_exception: Unrecognized token 'ingredients': was expecting ('true', 'false' or 'null')\n at [Source: [B@6f7a6ea4; line: 4, column: 34]"}}}]},"status":400}
我也有这个要求,对我来说和第一个一样:
curl -XGET 'http://127.0.0.1:9200/train-recipe/_search' -d '{
"query": {
"more_like_this": {
"fields": ["ingredients"],
"like": [{"_index" : "train-recipe","_type" : "recipe","_id" : 2938}],
"min_term_freq": 1,
"max_query_terms": 12
}
},
'from' : 0,
'size':10
}'
但是这个工作得很好。我也尝试使用 python 请求来做到这一点,如下所示:
def build_mlt(nb, doc_id):
mlt = {}
mlt['from'] = 0
mlt['size'] = nb
mlt['query'] = {}
mlt['query']['more_like_this'] = {}
mlt['query']['more_like_this']['fields'] = ['ingredients']
mlt['query']['more_like_this']['like'] = [{"_index" : "train-recipe","_type" : "recipe","_id" : doc_id}]
mlt['query']['more_like_this']['min_term_freq'] = 1
mlt['query']['more_like_this']['max_query_terms'] = 10
return mlt
def get_similar(nb, doc_id):
mlt = build_mlt(10, 2938)
response = requests.get("http://localhost:9200/test-recipe/recipe/_search", data=json.dumps(mlt))
print json.loads(response.text)
而这一次我有另一个回应:
{u'hits': {u'hits': [], u'total': 0, u'max_score': None}, u'_shards': {u'successful': 5, u'failed': 0, u'total': 5}, u'took': 2, u'timed_out': False}
对我来说,这三个请求是相同的。我根据我的函数melt_builder生成的字典做了第二个。有人可以向我解释为什么我会收到三种不同的回复吗?
【问题讨论】:
标签: python curl elasticsearch request