Количество документов в сегментах ключевых слов из списка в документе как агрегация в Elasticsearch - PullRequest
0 голосов
/ 17 мая 2018

Ситуация:

Я новичок в Elasticsearch и не могу понять, как использовать агрегаты и получить то, что мне нужно.

У меня есть документысо следующей структурой:

{
    ...
    "authors" : [
      {
        "name" : "Bob",
        "@type" : "Person"
      }
    ],
    "resort": "Politics",
    ...
}

Я хочу использовать агрегацию, чтобы получить количество документов для каждого автора.Поскольку для некоторых документов может быть несколько авторов, эти документы должны учитываться для каждого автора индивидуально.

Что я пробовал:

Поскольку terms агрегация работала с полем resort Я пытался использовать его с полем authors или name внутри, но всегда не получал никаких блоков.Для этого я использовал следующий запрос curl:

curl -X POST 'localhost:9200/news/_doc/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "_source": false,
  "aggs": {
    "author_agg": { "terms": {"field": "authors.keyword" } }
  }
}'

Я пришел к выводу, что агрегация terms не работает с полями, содержащимися в списке.

ДалееЯ думал об агрегации nested, но в документации сказано, что это агрегация с одним сегментом

, так что я не ищу.Поскольку у меня закончились идеи, я попробовал это, но получал ошибку

"type" : "aggregation_execution_exception",
"reason" : "[nested] nested path [authors] is not nested"

Я нашел этот ответ и попытался использовать его для своих данных.У меня был следующий запрос:

curl -X GET "localhost:9200/news/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "size": 0,
  "aggs": {
    "nest": {
      "nested": {
        "path": "authors"
      },
      "aggs": {
        "authorname": {
          "terms" : {
            "field": "name.keyword"
          }
        }
      }
    }
  }
}'

, который дал мне ошибку

"type" : "aggregation_execution_exception",
"reason" : "[nested] nested path [authors] is not nested"

Я искал, как сделать мой путь вложенным, используя сопоставления, но я не мог найти, каквыполнить это.Я даже не знаю, имеет ли это смысл или нет.

Так как я могу объединить документы в сегменты на основе ключа, который лежит в элементах списка внутри документов?

Возможно, на этот вопрос ответили где-то еще, но тогда я не могу правильно сформулировать свою проблему, так как я все еще смущен всей новой информацией.Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 21 мая 2018

Я наконец-то решил свою проблему:

Идея получения authors сопоставления клавиш nested была абсолютно верной.Но, к сожалению, Elasticsearch не позволяет вам изменить тип с un- nested на nested напрямую, потому что все элементы в этом ключе также должны быть проиндексированы.Таким образом, вы должны пойти следующим образом:

  1. Создать новый индекс с настраиваемым отображением.Здесь мы идем в тип документа _doc, в его свойства и затем в поле документов authors.Там мы устанавливаем type на nested.

~

curl -X PUT "localhost:9200/new_index?pretty" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "_doc" : {
      "properties" : {
        "authors": { "type": "nested" }
      }
    }
  }
}'
Затем мы переиндексируем наш набор данных и устанавливаем место назначения для нашего вновь созданного индекса.Это приведет к индексации данных из старого индекса в новый индекс, по существу, копируя чистые данные, но принимая новое отображение (поскольку настройки и отображения не копируются таким образом).

~

curl -X POST "localhost:9200/_reindex" -H 'Content-Type: application/json' -d'
{
  "source": {
    "index": "old_index"
  },
  "dest": {
    "index": "new_index"
  }
}'

Теперь мы можем выполнить агрегацию nested, чтобы отсортировать документы по группам по авторам:

curl -X GET 'localhost:9200/new_index/_doc/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "size": 0,
  "aggs": {
    "authors": {
      "nested": {
        "path": "authors"
      },
      "aggs": {
        "authors_by_name": {
          "terms": { "field": "authors.name.keyword" }
        }
      }
    }
  }
}'

Я не знаю, как переименовывать индексы до сих пор, нонесомненно, вы можете просто удалить старый индекс и затем выполнить описанную процедуру, чтобы создать другой новый индекс с именем старого, но с пользовательским отображением.

...