Древовидные структуры в Elasticsearch: индексирование, поиск, агрегирование? - PullRequest
0 голосов
/ 28 мая 2020

Я ищу пример того, как выполнять базовые 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"
    }

Теперь несколько вопросов:

  1. Как получить полный список каталогов?

    (на самом деле это должно быть довольно просто:

      GET /filesystem/_search
     
    )
  2. Как получить список каталогов в root (то есть: "/a", "/d", "/e")?

  3. Как получить список дочерних элементов каталога (то есть: дочерние элементы "/a" -> ["/a/b"], дочерние элементы "/a/b" - > ["/a/b/c"], потомки "/a/b/c" -> [], потомки "/e" -> ["/e/f"], ...)?
  4. Как получить набор всех потомков каталога ( то есть: потомки "/a" -> ["/a/b", "a/b/c"], ...)?
  5. Как получить общее количество дочерних каталогов каталога (то есть: количество потомков "/a" -> 2)?
  6. Как получить общее количество файлов в каталоге и всех его потомках (то есть: количество файлов в "/a" и его потомках = 5 + 3 + 8 -> 16)?
  7. Чтобы ответить на некоторые вопросы На вопросы выше, было бы хорошей идеей добавить дополнительный индекс, чтобы сохранить иерархию другим способом? Или изменить структуру данных в этом примере, чтобы каждый узел содержал дополнительную информацию (например, свойство parentdirectory, ...)?

Этот вопрос связан с:

Как запрашивать поля с помощью анализатора path_hierarchy в elasticsearch?

Лучшая структура для хранения дерева в Elasticsearch?

Дерево индексации и поиска структуры с elasticsearch

Как хранить данные дерева в индексе Lucene / Solr / Elasticsearch или в No SQL db?

...