Я ищу пример того, как выполнять базовые c операции с иерархическими данными в Elasticsearch.
Похоже, что большинство предложений указывают на использование токенизатора path_hierarchy для обработки строкового представления путь (материализованный путь).
Итак, вот простой пример для запуска в Kibana, чтобы создать и заполнить индекс под названием «файловая система» для хранения информации о каталогах. Здесь каждый узел состоит из целочисленного свойства «number_of_files», представляющего количество файлов в каталоге, и текстового свойства «path», представляющего полный путь к каталогу. Последний индексируется с помощью анализатора paths, который, в свою очередь, использует токенизатор path_hierarchy.
PUT /filesystem
{
"settings": {
"analysis": {
"analyzer": {
"paths": {
"tokenizer": "path_hierarchy"
}
}
}
},
"mappings": {
"properties": {
"number_of_files": {
"type": "integer"
},
"path": {
"type": "text",
"analyzer": "paths"
}
}
}
}
POST filesystem/_doc
{
"number_of_files":5,
"path": "/a"
}
POST filesystem/_doc
{
"number_of_files":3,
"path": "/a/b"
}
POST filesystem/_doc
{
"number_of_files":8,
"path": "/a/b/c"
}
POST filesystem/_doc
{
"number_of_files": 10,
"path": "/d"
}
POST filesystem/_doc
{
"number_of_files": 9,
"path": "/e"
}
POST filesystem/_doc
{
"number_of_files": 15,
"path": "/e/f"
}
Теперь несколько вопросов:
Как получить полный список каталогов?
(на самом деле это должно быть довольно просто:
GET /filesystem/_search
) Как получить список каталогов в root (то есть: "/a", "/d", "/e"
)?
- Как получить список дочерних элементов каталога (то есть: дочерние элементы
"/a"
-> ["/a/b"]
, дочерние элементы "/a/b"
- > ["/a/b/c"]
, потомки "/a/b/c"
-> []
, потомки "/e"
-> ["/e/f"]
, ...)? - Как получить набор всех потомков каталога ( то есть: потомки
"/a"
-> ["/a/b", "a/b/c"]
, ...)? - Как получить общее количество дочерних каталогов каталога (то есть: количество потомков
"/a"
-> 2
)? - Как получить общее количество файлов в каталоге и всех его потомках (то есть: количество файлов в
"/a"
и его потомках = 5 + 3 + 8 -> 16
)? - Чтобы ответить на некоторые вопросы На вопросы выше, было бы хорошей идеей добавить дополнительный индекс, чтобы сохранить иерархию другим способом? Или изменить структуру данных в этом примере, чтобы каждый узел содержал дополнительную информацию (например, свойство parentdirectory, ...)?
Этот вопрос связан с:
Как запрашивать поля с помощью анализатора path_hierarchy в elasticsearch?
Лучшая структура для хранения дерева в Elasticsearch?
Дерево индексации и поиска структуры с elasticsearch
Как хранить данные дерева в индексе Lucene / Solr / Elasticsearch или в No SQL db?