Elasticsearch - 按父ID查询

时间:2014-03-11 00:38:59

标签: elasticsearch

我有三种文档类型,其中包含以下父/子关系映射。我已经省略了其他属性,因为我认为它们与问题无关。

   "mappings": {
     "Parent": {            
        },
     "Child": {
        "_parent": {
           "type": "Parent"
        },
        "_routing": {
           "required": true
        }             
     },
     "GrandChild": {
        "_parent": {
           "type": "Child"
        },
        "_routing": {
           "required": true
        }             
     }
  }

我正在使用java api将文档插入到索引中。在索引文档之前,需要删除具有相同ID的现有文档以避免重复。父母的Id和孩子的Id存储在外部。首先,使用对其父ID的术语查询(在这种情况下为“Child”类型的id)删除所有“GrandChild”文档。没有错误,但“GrandChild”文档没有被删除。

通过使用chrome插件Sense运行以下术语查询,我发现问题出在术语查询中。它不会返回命中。 Parent,Child和GrandChild具有相同的路由值,该值设置为Parent的id。这是我试过的查询。

POST /myindex/GrandChild/_search?routing=DFC0E8CD59EBC00EC2DDC9A0FF5D1F2DB272B2449680824CCE60B6864568D498
{
    "query" : {
        "term" : { "_parent" : "//id/of/doc/of/type/Child" }
    }
}

当我尝试使用其父ID搜索“Child”文档时,它可以正常工作。我使用以下查询得到一个“孩子”。

POST /myindex/Child/_search?routing=DFC0E8CD59EBC00EC2DDC9A0FF5D1F2DB272B2449680824CCE60B6864568D498
{
    "query" : {
        "term" : { "_parent" : "DFC0E8CD59EBC00EC2DDC9A0FF5D1F2DB272B2449680824CCE60B6864568D498" }
    }
} 

在“GrandChild”搜索中,我可能做错了什么?

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

从elasticsearch邮件列表中获得问题的答案 https://groups.google.com/forum/#!topic/elasticsearch/d_aZejNMBD8

这里存在一个未解决的问题: https://github.com/elasticsearch/elasticsearch/issues/5399

修改: 如Github问题所示,执行查询的方法是使用父类型为ID添加前缀:

POST /myindex/GrandChild/_search?routing=DFC0E8CD59EBC00EC2DDC9A0FF5D1F2DB272B2449680824CCE60B6864568D498    
{
    "query" : {
        "term" : { "_parent" : "Child#//id/of/doc/of/type/Child" }
    }
}