Сортировка сегментов агрегации elasticsearch по текстовому полюElasticsearch aggregation

Ответить Пред. темаСлед. тема
Anonymous
 Сортировка сегментов агрегации elasticsearch по текстовому полю

Сообщение Anonymous »

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

Код: Выделить всё

"mappings": {
"properties": {
"price": {
"type": "double"
},
"product_name": {
"type": "text"
},
"product_id": {
"type": "keyword"
},
"timestamp": {
"type": "date"
}
}
}
Сейчас я получаю последние продажи для каждого product_id, используя составные и top_hits агрегаты:

Код: Выделить всё

{
"query": {
"bool": {
"filter": [
{
"range": {
"timestamp": {
"gte": "2019-10-25T00:00:00Z",
"lte": "2019-10-26T00:00:00Z"
}
}
}
]
}
},
"aggs": {
"distinct_products": {
"composite": {
"sources": [
{
"distinct_ids": {
"terms": {
"field": "product_id"
}
}
}
],
"size": 10000
},
"aggs": {
"last_timestamp": {
"top_hits": {
"sort": {
"timestamp": {
"order": "desc"
}
},
"size": 1
}
}
}
}
}
}
Теперь я хочу отсортировать полученные сегменты по произвольному полю.
Если я хочу отсортировать по цене, я могу использовать решение в этот вопрос
путем добавления агрегата max, который извлекает поле Product_price из каждого сегмента, и агрегата Bucket_sort в конце, который будет сортировать результаты max :

Код: Выделить всё

{
"query": {
"bool": {
"filter": [
{
"range": {
"timestamp": {
"gte": "2019-10-25T00:00:00Z",
"lte": "2019-10-26T00:00:00Z"
}
}
}
]
}
},
"aggs": {
"distinct_products": {
"composite": {
"sources": [
{
"distinct_ids": {
"terms": {
"field": "product_id"
}
}
}
],
"size": 10000
},
"aggs": {
"last_timestamp": {
"top_hits": {
"sort": {
"timestamp": {
"order": "desc"
}
},
"size": 1,
"_source": {
"excludes": []
}
}
},
"latest_sell": {
"max": {
"field": "product_price"
}
},
"latest_sell_secondary": {
"max": {
"field": "timestamp"
}
},
"sort_sells": {
"bucket_sort": {
"sort": {
"latest_sell": {
"order": "desc"
},
"latest_sell_secondary": {
"order": "desc"
}
},
"from": 0,
"size":  10000
}
}
}
}
}
}
Если я хочу сортировать в алфавитном порядке по Product_name вместо Product_price, я не могу использовать агрегацию max, поскольку она работает только для числовые поля.

Что можно сделать, чтобы отсортировать сегменты Last_timestamp (каждый из которых содержит только один документ) по текстовому полю?

Я использую версию elasticsearch 7.2.0.

Подробнее здесь: https://stackoverflow.com/questions/585 ... text-field
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Elasticsearch aggregation»