2016-11-16 200 views
0

我有这样简单Elasticsearch嵌套搜索查询

{ 
    "_source": { 
    "id": 792477813014224900, 
    "metadata": { 
     "iso_language_code": "en", 
     "result_type": "recent" 
    }, 
    "retweeted": false, 
    "retweet_count": 330, 
    "user": { 
     "id": 149250899, 
     "listed_count": 0, 
     "protected": false, 
     "followers_count": 347, 
     "entities": { 
     "description": { 
      "urls": [] 
     } 
     }, 
     "screen_name": "Zwido_" 
} 

在ES(Tweepy JSON)文件和我想搜索和USER_NAME领域基于查询一个完整的文档。 我tryied这个代码

{ 
      "nested": { 
       "path": "_source", 
       "score_mode": "avg", 
       "query": { 
        "bool": { 
         "must": [ 
          { 
           "text": {"_source.user.user_name": user} 
          } 
         ] 
        } 
       } 
      } 
} 

但它不工作,我收到错误

TransportError(400, 'search_phase_execution_exception', 'failed to parse search source. unknown search element [nested] 

我做错了吗? 感谢您的帮助。

回答

0

您不需要指定_source字段+您在顶层缺少query,则可以这样做。

{ 
    "query": { 
     "nested": { 
      "path": "user", 
      "score_mode": "avg", 
      "query": { 
       "bool": { 
        "must": [ 
         { 
          "match": {"user.screen_name": user} 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

UPDATE

如果您usernested型没有,那么你可以简单地做这样的:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "user.screen_name": user 
      } 
     } 
     ] 
    } 
    } 
} 
+0

我接受了你的回答,它正在工作。我添加了“大小”:1,只过滤一个查询。谢谢 – bezoadam

+0

很高兴帮助! – Val

0

为elasticsearch文档中提到here你应该改变您的数据映射告诉elasticsearch它是嵌套对象。一旦完成,那么你可以查询对象。

+0

我相信@Val答案像魅力一样工作,但我收到'user'不是嵌套类型的错误。所以我GOOGLE和尝试更新_mappings,但我注意到,我不能改变映射,而不会丢失索引的数据。我现在搞砸了,有什么建议吗? – bezoadam

+0

据我已阅读,您将重新索引数据以更改映射,但停机时间是一个问题,您可以在这里参考有关别名索引以防止停机的问题。 –

+0

@bezoadam我已经更新了我的答案。 – Val