#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. Я запутался в «длине», я думаю, что длина — это другое поле, и я отредактировал свой ответ в соответствии с этим. дайте мне знать, если это не сработает