В чем разница между count и total_count в фасете эластичного поиска?
Я делаю поиск, используя фасет диапазона:
{
"query": {
"match_all": {}
},
"facets": {
"prices": {
"range": {
"field": "product_price",
"ranges": [
{"from": 0, "to": 200},
{"from": 200, "to": 400},
{"from": 400, "to": 600},
{"from": 600, "to": 800},
{"from": 800}
]
}
}
}
}
И я получил в ответ диапазоны, как и ожидалось:
[
{
"from": 0.0,
"to": 200.0,
"count": 0,
"total_count": 0,
"total": 0.0,
"mean": 0.0
},
{
"from": 200.0,
"to": 400.0,
"count": 1,
"min": 399.0,
"max": 399.0,
"total_count": 1,
"total": 399.0,
"mean": 399.0
},
{
"from": 400.0,
"to": 600.0,
"count": 5,
"min": 499.0,
"max": 599.0,
"total_count": 5,
"total": 2886.0,
"mean": 577.2
},
{
"from": 600.0,
"to": 800.0,
"count": 3,
"min": 690.0,
"max": 790.0,
"total_count": 3,
"total": 2179.0,
"mean": 726.3333333333334
},
{
"from": 800.0,
"count": 2,
"min": 899.0,
"max": 990.0,
"total_count": 2,
"total": 1889.0,
"mean": 944.5
}
]
Во всех ответах count
а также total_count
подобные. Кто-нибудь знает, в чем разница между ними? Какой я должен использовать?
1 ответ
Очень хороший вопрос! Эта часть сложна, так как большую часть времени вы видите одни и те же значения, но... когда вы используете key_field
а также value_field
Вы можете вычислить диапазоны на основе поля и агрегированных данных (min
,max
,total_count
,total
а также mean
) на другом поле. Например, вы можете вычислить диапазоны в поле популярности и посмотреть агрегированные данные в поле цены, чтобы увидеть для каждого диапазона популярности, какую цену вы имеете; может людям нравятся дешевые продукты, а может и нет?
Давайте представим, что ваши продукты могут иметь несколько цен, скажем, например, разные цены для каждой страны... это когда у вас есть count
это отличается от total_count
, Давайте посмотрим на пример.
Давайте индексировать пару документов, которые содержат поле популярности и поле цены, которые могут иметь несколько значений:
{
"popularity": 50,
"price": [28,30,32]
}
а также
{
"popularity": 120,
"price": [50,54]
}
Давайте теперь запустим следующий поисковый запрос, который строит фасет диапазона, используя поле популярности в качестве ключа и поле цены в качестве значения:
{
"query": {
"match_all": {}
},
"facets": {
"popularity_prices": {
"range": {
"key_field": "popularity",
"value_field": "price",
"ranges": [
{"to": 100},
{"from": 100}
]
}
}
}
}
Вот полученный фасет:
{
"popularity_prices": {
"_type": "range",
"ranges": [
{
"to": 100,
"count": 1,
"min": 28,
"max": 32,
"total_count": 3,
"total": 90,
"mean": 30
},
{
"from": 100,
"count": 1,
"min": 50,
"max": 54,
"total_count": 2,
"total": 104,
"mean": 52
}
]
}
}
Теперь должно быть яснее, что total_count
является. Это относится к value_field
(цена): 3 разных значения цены попадают в первый диапазон, но они взяты из одного и того же документа. С другой стороны count
количество документов, попадающих в диапазон
Теперь, когда мы также поняли count
о документах в то время как total_count
о значениях полей, мы ожидаем, что такое же поведение с фасетой нормального диапазона, если поле содержит несколько значений... правильно? К сожалению, в настоящее время этого не происходит, фасет диапазона будет учитывать только первое значение для каждого поля. Не уверен, что это ошибка. Следовательно count
и total_count
всегда одинаковы.