Одним из вариантов может быть создание своего рода столбца иерархии хлебных крошек и использование анализатора и фасета для поиска по нему.
Таким образом, индекс может иметь аналогичные настройки для столбца и анализатора
"btb_breadcrumb": {
"type": "text",
"fields": {
"facet": {
"type": "text",
"analyzer": "custom_path_tree",
"fielddata": "true"
}
}
},
"settings" : {
"analysis": {
"analyzer": {
"english_exact": {
"tokenizer": "standard",
"filter": [
"lowercase"
]
},
"custom_path_tree": {
"tokenizer": "custom_hierarchy"
},
"custom_path_tree_reversed": {
"tokenizer": "custom_hierarchy_reversed"
}
},
"tokenizer": {
"custom_hierarchy": {
"type": "path_hierarchy",
"delimiter": ">"
},
"custom_hierarchy_reversed": {
"type": "path_hierarchy",
"delimiter": ">",
"reverse": "true"
}
}
}
}
, а затем вы можете выполнить поиск в этом столбце следующим образом:
{
"bool" :
{
"must" :
[
{"match" : {"btb_breadcrumb.facet" : "catid1>catid2>"}}
]
}
}
теперь это даст вам все элементы с catid2 и всеми его дочерними категориями. Точно так же, если вы хотите получить все элементы, которые подпадают под любые дочерние элементы catid1, вы можете использовать следующий запрос.
{
"bool" :
{
"must" :
[
{"match" : {"btb_breadcrumb.facet" : "catid1>"}}
]
}
}