在 elasticsearch-py
中使用Elasticsearch.search
方法
搜索1:在搜索中不使用fields
选项:
search_body = {
"filter" :
{
"term" :
{
"user.id" : 19900726
}
},
"size" : 1
}
结果如下:
{u'_shards': {u'failed': 0, u'successful': 5, u'total': 5},
u'hits': {u'hits': [{u'_id': u'657184533922451456',
u'_index': u'tweets-index-2016-9',
u'_score': 1.0,
u'_source': {u'created_at': u'2015-10-22T13:19:37',
u'entities': {u'hashtags': [{u'indices': [5, 13], u'text': u'IndvsSA'}],
u'symbols': [],
u'urls': [],
u'user_mentions': []},
u'favorite_count': 0,
u'favorited': False,
u'id': 657184533922451456,
u'id_str': u'657184533922451456',
u'is_quote_status': False,
u'lang': u'und',
u'outdated': u'No',
u'retweet_count': 0,
u'retweeted': False,
u'saved_at': u'2016-03-03T15:02:06.157149',
u'source': u'<a href="http://twitter.com/download/android" rel="nofollow">Twitter for Android</a>',
u'text': u'Out. #IndvsSA',
u'truncated': False,
u'user': {u'id': 19900726, u'id_str': u'19900726'}},
u'_type': u'tweet'}],
u'max_score': 1.0,
u'total': 2981},
u'timed_out': False,
u'took': 10}
搜索2:设置了fields
选项搜索:
search_body = {
"filter" :
{
"term" :
{
"user.id" : 19900726
}
},
"fields" :
[
'id',
'created_at',
'retweet_count',
'favorite_count'
],
"size" : 1
}
结果变为:
{u'_shards': {u'failed': 0, u'successful': 5, u'total': 5},
u'hits': {u'hits': [{u'_id': u'657184533922451456',
u'_index': u'tweets-index-2016-9',
u'_score': 1.0,
u'_type': u'tweet',
u'fields': {u'created_at': [u'2015-10-22T13:19:37'],
u'favorite_count': [0],
u'id': [657184533922451456],
u'retweet_count': [0]}}],
u'max_score': 1.0,
u'total': 2981},
u'timed_out': False,
u'took': 6}
此处在第二次搜索中,为什么每个字段都以list
作为long
返回,而搜索1中string
或${$string}
(索引时使用的类型)被退回。如何更正搜索2 中的行为?
答案 0 :(得分:0)
您需要使用_source
(source filtering)代替fields
,不建议使用后者。
search_body = {
"filter" :
{
"term" :
{
"user.id" : 19900726
}
},
'_source' : <--- change this
[
'id',
'created_at',
'retweet_count',
'favorite_count'
],
"size" : 1
}