1

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}

在第二次搜索中,为什么每个字段都作为 alist而在搜索 1 中返回longstring (索引时使用的类型)返回。如何更正Search 2中的行为?

4

1 回答 1

0

您需要使用_source(源过滤) 而不是fields,不建议使用后者。

     search_body =   { 
                "filter" :
                { 
                    "term" :
                    {
                        "user.id" : 19900726
                    }
                },
                '_source' :               <--- change this
                [
                    'id', 
                    'created_at', 
                    'retweet_count',
                    'favorite_count'
                ],
                "size" : 1
            }
于 2016-03-09T13:58:50.507 回答