Использование мощности, но попытка найти с ее помощью общую длину

#elasticsearch #sense

#elasticsearch #смысл

Вопрос:

Я использовал мощность, чтобы найти некоторые уникальные поля, такие как author

     "aggs": {
       "author_count" : {
        "cardinality" : {
            "field" : "author"
        }
       }
   }
 

Это работает и подсчитывает все поля автора, в которых есть уникальный автор.

Теперь я хочу найти общий размер этих уникальных авторов. С другими запросами я только что сделал это, просто добавив

   "aggs":{
    "sum":{
      "field" : "length" }}}
 

Но когда я попробовал это, это дало мне общую длину всего, а не только для уникальных авторов.

Так, например, если автор поля содержит только один «Kim», это должно быть возвращено. Я хочу, чтобы каждый автор, написавший только одну книгу, также добавил все свои длины страниц вместе.

например

 "author" : "kim",
"length": 100

"author" : "lolo",
"length": 100
 

Вывод должен быть author_count 2 и total_length 200 .

Но для

 "author" : "kim",
"length": 100

"author" : "lolo",
"length": 100

"author" : "lolo",
"length": 100
 

Вывод должен быть author_count 1 и total_length 100 . Потому что ким — единственный уникальный автор (автор, написавший только одну книгу)

Есть идеи?

Комментарии:

1. не могли бы вы добавить сопоставление к вопросу? почему вы получаете «lolo» дважды?

2. потому что автор lolo, возможно, написал более одной книги

3. я имел в виду, что kim — единственный уникальный автор, такие сопоставления, как author, book, length, DateCreated. что-то вроде этого?

Ответ №1:

После понимания вопроса это может быть достигнуто с помощью агрегирования селекторов сегментов и агрегирования суммарных сегментов. Сначала агрегация терминов в поле «Автор» даст всех уникальных авторов, затем агрегация подсчета значений даст книги, написанные этими уникальными авторами. total_sum суммирует длину страниц.

Теперь в bucket selector будут сохранены только группы тех авторов, которые написали только одну книгу, и, наконец, sum_bucket суммирует всю длину этих авторов

 {
  "size": 0,
  "aggs": {
    "unique_author": {
      "terms": {
        "field": "author",
        "size": 100
      },
      "aggs": {
        "total_book_count": {
          "value_count": {
            "field": "author"
          }
        },
        "total_sum": {
          "sum": {
            "field": "length"
          }
        },
        "only_single_book_author": {
          "bucket_selector": {
            "buckets_path": {
              "total_books": "total_book_count"
            },
            "script": "total_books==1"
          }
        }
      }
    },
    "page_length": {
      "sum_bucket": {
        "buckets_path": "unique_author>total_sum"
      }
    }
  }
}
 

Комментарии:

1. К сожалению, это не работает, в него не входит, как сложить длины вместе, он просто дает это

2. { «key»: «kim», «doc_count»: 2 }, { «key»: «lolo», «doc_count»: 1

3. Я не уверен, правильно ли я понял, не могли бы вы добавить образец вывода к вопросу? когда вы говорите «добавить длины вместе», это будут все документы? или в некоторых документах нет поля автора?

4. Я обновил вопрос, надеюсь, это поможет. Я хотел бы добавить длины уникальных авторов вместе. Надеюсь, это имеет смысл, но дайте мне знать, если это не так. Спасибо

5. Я запутался в «длине», я думаю, что длина — это другое поле, и я отредактировал свой ответ в соответствии с этим. дайте мне знать, если это не сработает