2015-09-09 37 views
2

对于我的指数的85%,我用父/子在ElasticsearchElasticsearch:父/子丢失索引关系

所以我下面的:

  • 指数:ESI
  • 类型:关系(907),分类(9300),检查(10581)

我的映射如下:

PUT /esi 
{ 
    "mappings": { 
     "relation": {}, 
     "classification": { 
      "_parent": { 
       "type": "relation" 
      } 
     }, 
     "inspection": 
     { 
      "_parent": { 
       "type": "classification" 
      } 
     } 
    } 
} 

我索引所有数据:关系,分类和检查。 I指数每次检查如下:

PUT /esi/inspection/i20862?parent=c12277 
{ 
    "date": "2015-06-06" 
} 

检查我的指数有意识,是的,所有类型都充满了文件的正确数量。现在奇怪的事情:

我索引10581检查。他们每个人都有一位家长:我将每项检查都与上述父母一起编入索引。父母是存在的。

现在,我请与下面的命令:结果

POST /esi/inspection/_search 
{ 
    "query": 
    { 
     "has_parent": 
     { 
      "parent_type": "classification", 
      "query": 
      { 
       "match_all": 
       { 
       } 
      } 
     } 
    } 
} 

:1556而不是10581

当我检查检查分别键入,我得到的10581(右)的结果。但1556与其父母匹配。

我找不到为什么索引后没有与父母匹配,而给定的父母存在。

回答

2

我不得不路由参数添加到孙子,所以:

PUT /esi/inspection/i20862?parent=c12277&routing=r595 
{ 
    "date": "2015-06-06" 
} 

这确保了孙子家长/孩子的/孙子都存储在同一碎片。

只有父母/孩子,父母/孩子总是存储在同一个分片中。当孩子是父母时,分片可以不同。这就是为什么你需要路由参数。

文档:https://www.elastic.co/guide/en/elasticsearch/guide/current/grandparents.html