2014-09-26 90 views
0

我在弹性搜索玩家索引中有以下对象。Elasticsearch:在数组中搜索

GET /players/_search 

"hits": [ 
    { 
     "_index": "players", 
     "_type": "1", 
     "_id": "rRI5A8mVRUKKTA08bK90Vw", 
     "_score": 0.2712221, 
     "_source": { 
      "id": "1", 
      "first_name": "Lebron", 
      "last_name": "James", 
      "numbers": [ 
       { 
       "number": "23", 
       "team": { 
        "city": "Cliveland", 
        "name": "Cavaliers" 
       } 
       }, 
       { 
       "number": "6", 
       "team": { 
        "city": "Maimi", 
        "name": "Heat" 
       } 
       } 
      ] 
     } 
    } 
    ] 

现在我想搜索的球员谁在“舞美”中扮演并且有数字“23”(有这个指数没有这样的球员)。我试过

GET /players/_search 
{ 
    "query": { 
     "bool" : { 
      "must" : [ 
       { 
        "term" : { 
         "numbers.number" : "23" 
        } 
       }, 
       { "term" : { 
         "numbers.team.city" : "maimi" 
        } 
       } 
      ] 
     } 
    } 
} 

但elasticsearch仍然发现勒布朗。我应该如何对弹性搜索做出正确的请求?

回答

2

这是因为您的数据结构及其索引方式:arrays inner objects在内部展平。

其实,你的文档在ElasticSearch索引是这样的:

numbers.number:  [23,6] 
numbers.team.city: [Cliveland,Maimi] 
numbers.team.name: [Cavaliers,Heat] 

内对象之间的关联是虽然输了,寻找Cliveland热火6号将这个文件也匹配。

您应该使用nested对象映射来解决此问题:内部对象将保持原样。