Я хотел бы иметь возможность запрашивать текст, но также получать только результаты с максимальным значением некоторого целочисленного поля в моих данных. Я прочитал документы об агрегатах и фильтрах, и я не совсем понимаю, что я ищу.Как сделать запрос elasticsearch, который фильтрует максимальное значение поля?
Например, у меня есть некоторые повторяющиеся данные, которые индексируются одинаково, за исключением целочисленного поля - назовем это поле lastseen
.
Так, в качестве примера, учитывая эти данные, введенные в elasticsearch:
// these two the same except "lastseen" field
curl -XPOST localhost:9200/myindex/myobject -d '{
"field1": "dinner carrot potato broccoli",
"field2": "something here",
"lastseen": 1000
}'
curl -XPOST localhost:9200/myindex/myobject -d '{
"field1": "dinner carrot potato broccoli",
"field2": "something here",
"somevalue": 100
}'
# and these two the same except "lastseen" field
curl -XPOST localhost:9200/myindex/myobject -d '{
"field1": "fish chicken something",
"field2": "dinner",
"lastseen": 2000
}'
curl -XPOST localhost:9200/myindex/myobject -d '{
"field1": "fish chicken something",
"field2": "dinner",
"lastseen": 200
}'
Если я запрос для "dinner"
curl -XPOST localhost:9200/myindex -d '{
"query": {
"query_string": {
"query": "dinner"
}
}
}'
я получить 4 результаты обратно. Я хотел бы иметь фильтр, чтобы получить только два результата - только элементы с максимальным полем lastseen
.
Это явно не прав, но мы надеемся, что это дает вам представление о том, что я после:
{
"query": {
"query_string": {
"query": "dinner"
}
},
"filter": {
"max": "lastseen"
}
}
Результаты будут выглядеть примерно так:
"hits": [
{
...
"_source": {
"field1": "dinner carrot potato broccoli",
"field2": "something here",
"lastseen": 1000
}
},
{
...
"_source": {
"field1": "fish chicken something",
"field2": "dinner",
"lastseen": 2000
}
}
]
обновление 1: Я попытался создать сопоставление, которое исключало индексацию lastseen
. Это не сработало. Все еще получаю все 4 результата.
curl -XPOST localhost:9200/myindex -d '{
"mappings": {
"myobject": {
"properties": {
"lastseen": {
"type": "long",
"store": "yes",
"include_in_all": false
}
}
}
}
}'
обновление 2: Я попробовал дедупликации со схемой AGG listed here, и это не сработало, но что более важно, я не вижу способ совместить это с поиском по ключевым словам.
Что делать, если у вас есть два документы с 'lastseen: 2000', вы хотите, оба вернулись или один с' lastseen: 2000' и один с 'lastseen: 1000'? –
Кроме того, что вы считаете дублирующим документом? Я вижу, что вы признаете этот тип документов как те, у которых есть одно и то же 'field1'. –
@AndreiStefan дублированный документ будет иметь одинаковое поле1 и поле2. –