使用源过滤器进行elasticsearch-py搜索

时间:2016-11-29 16:43:05

标签: python elasticsearch elasticsearch-py

我正在使用elasticsearch-py(es版本是2.3)并且想要从索引中的所有文档返回'title'字段,其中包含:actors,director,genre,plot,title,year。

我目前正在尝试messages = es.search(index="movies", _source=['hits.hits.title']),结果是:

{u'hits': {u'hits': [{u'_score': 1.0, u'_type': u'movie', u'_id': u'tt0116996', u'_source': {}, u'_index': u'movies'}, {u'_score': 1.0, u'_type': u'movie', u'_id': u'1', u'_source': {}, u'_index': u'movies'}], u'total': 2, u'max_score': 1.0}, u'_shards': {u'successful': 1, u'failed': 0, u'total': 1}, u'took': 2, u'timed_out': False}

我尝试过不同版本的过滤器路径和源字段列表,但似乎无法正确使用。

3 个答案:

答案 0 :(得分:0)

您可以将源过滤应用于:

messages = es.search(index="movies", _source=["title"])

但您仍需要解析响应。为此,您可以执行以下操作:

titles = [hit["title"] for hit in messages["hits"]["hits"]["_source"]]]

在elasticsearch-py API(据我所知)中没有任何内容可以平衡你从Elasticsearch获得的相当冗长的响应。

答案 1 :(得分:0)

现在,您可以在搜索功能中使用_source_exclued_source_include kwargs来限制返回的字段。

类似于:

messages = es.search(index="movies", _source=["title"], _source_include=['title'])

答案 2 :(得分:0)

我有类似的问题,这就是我解决它的方法。我需要它在一个不同的上下文中 - 我不得不在循环中使用有关标题的信息:

res = es.search(index="movies", body={"query": {"match_all": {}}})
for hit in res['hits']['hits']:
    title = hit['_source'].get('title')