1

我正在使用 elasticsearch-py(es 版本为 2.3),并希望仅从索引中的所有文档中返回“标题”字段,其中包含以下映射:演员、导演、流派、情节、标题、年份。

我目前正在尝试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}

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

4

3 回答 3

4

您可以通过以下方式应用源过滤:

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

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

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

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

于 2016-11-29T16:56:12.577 回答
1

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

所以像:

messages = es.search(index="movies", _source=["title"], _source_include=['title'])
于 2018-03-20T16:57:14.313 回答
1

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

res = es.search(index="movies", body={"query": {"match_all": {}}})
for hit in res['hits']['hits']:
    title = hit['_source'].get('title')
于 2018-05-30T12:00:49.737 回答