我需要索引 3 个级别(或更多)的子父级。例如,级别可能是作者、一本书和该书中的人物。
但是,当索引超过两级时,has_child 和 has_parent 查询和过滤器会出现问题。如果我有 5 个分片,则在最低级别(字符)上运行“has_parent”查询或在第二级(书籍)上运行 has_child 查询时,我会得到大约五分之一的结果。
我的猜测是,一本书通过它的父 id 被索引到一个分片,因此将与他的父(作者)一起存在,但是一个字符被索引到一个基于书 id 的哈希的分片,这不一定符合这本书被索引的实际碎片。
因此,这意味着同一作者的书籍的所有角色不一定都位于同一个碎片中(这确实削弱了整个孩子-父母的优势)。
难道我做错了什么?我该如何解决这个问题,因为我确实需要复杂的查询,例如“作者写了哪些女性角色的书”。
我发疯了一个显示问题的要点,在: https ://gist.github.com/eranid/5299628
底线是,如果我有一个映射:
"author" : {
"properties" : {
"name" : {
"type" : "string"
}
}
},
"book" : {
"_parent" : {
"type" : "author"
},
"properties" : {
"title" : {
"type" : "string"
}
}
},
"character" : {
"_parent" : {
"type" : "book"
},
"properties" : {
"name" : {
"type" : "string"
}
}
}
和 5 个分片索引,我无法使用“has_child”和“has_parent”进行查询
查询:
curl -XPOST 'http://localhost:9200/index1/character/_search?pretty=true' -d '{
"query": {
"bool": {
"must": [
{
"has_parent": {
"parent_type": "book",
"query": {
"match_all": {}
}
}
}
]
}
}
}'
只返回五分之一(大约)的字符。