親子の 3 レベル (またはそれ以上) のインデックスを作成する必要があります。たとえば、レベルは、著者、本、およびその本の登場人物である可能性があります。
ただし、2 レベルを超えるインデックスを作成する場合、has_child および has_parent クエリとフィルターに問題があります。シャードが 5 つある場合、最下位レベル (文字) で "has_parent" クエリを実行するか、2 番目のレベル (本) で has_child クエリを実行すると、約 5 分の 1 の結果が得られます。
私の推測では、本はその親 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": {}
}
}
}
]
}
}
}'
文字の 5 分の 1 (およそ) のみを返します。