在 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
返回,而不是在搜索 1 中返回long
或string
(索引时使用的类型)。如何更正搜索 2 中的行为?
您需要使用
_source
(源过滤)而不是 fields
,不建议使用后者。
search_body = {
"filter" :
{
"term" :
{
"user.id" : 19900726
}
},
'_source' : <--- change this
[
'id',
'created_at',
'retweet_count',
'favorite_count'
],
"size" : 1
}