Поискручные средстваласти поиска по запросу возвращают список объектов, когда в запросе используется опция поля
С помощью 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?
1 ответ
Вам нужно использовать _source
( исходная фильтрация) вместо fields
использование последнего не рекомендуется.
search_body = {
"filter" :
{
"term" :
{
"user.id" : 19900726
}
},
'_source' : <--- change this
[
'id',
'created_at',
'retweet_count',
'favorite_count'
],
"size" : 1
}