ElasticSearch: ограничить агрегаты строкой запроса
Я изо всех сил стараюсь, чтобы мои агрегаты были ограничены моим запросом. Я, конечно, попробовал:
{
"_source": ["burger.id", "burger.user_name", "burger.timestamp"],
"query": {
"query_string": {
"query": "burger.user_name:Bob"
}
},
"aggs": {
"burger_count": {
"cardinality": {
"field": "burger.id.keyword"
}
},
"min_dtm": {
"min": {
"field": "burger.timestamp"
}
},
"max_dtm": {
"max": {
"field": "burger.timestamp"
}
}
}
}
Я очень настроен на использование "query_string" для фильтрации, поскольку у нас есть очень хороший интерфейс, который позволяет пользователям легко создавать запросы, которые затем превращаются в "query_string".
К сожалению, я не нашел способа объединить query_string и агрегаты так, чтобы агрегаты были только по результатам запроса!
Я прочитал много SO-сообщений о том, как это сделать, но все они очень старые и устаревшие, поскольку все они предлагают устаревший способ отфильтрованных запросов, но даже это не реализует query_string.
ОБНОВИТЬ
Вот несколько примеров документов. Похоже, мои результаты не фильтруются по моему запросу. Есть ли параметр, который мне не хватает? Я также изменил все поля, чтобы быть о гамбургерах...
{
"_index": "burgers",
"_type": "burger",
"_id": "123",
"_score": 5.3759894,
"_source": {
"inference": {
"id": "1",
"user_name": "Jonathan",
"timestamp": 1541521691847
}
}
},
{
"_index": "burgers",
"_type": "burger",
"_id": "456",
"_score": 5.3759894,
"_source": {
"inference": {
"id": "2",
"user_name": "Ryan",
"timestamp": 1542416601153
}
}
},
{
"_index": "burgers",
"_type": "burger",
"_id": "789",
"_score": 5.3759894,
"_source": {
"inference": {
"id": "3",
"user_name": "Grant",
"timestamp": 1542237715511
}
}
}
1 ответ
Нашел мой ответ! Похоже, что проблема была вызвана запросом текстового поля burger.user_name
вместо поля ключевого слова: burger.user_name.keyword
, Изменение моей строки запроса для использования ключевого слова для каждого текстового поля решило мою проблему.
{
"_source": ["burger.id", "burger.user_name", "burger.timestamp"],
"query": {
"query_string": {
"query": "burger.user_name.keyword:Bob"
}
},
"aggs": {
"burger_count": {
"cardinality": {
"field": "burger.id.keyword"
}
},
"min_dtm": {
"min": {
"field": "burger.timestamp"
}
},
"max_dtm": {
"max": {
"field": "burger.timestamp"
}
}
}
}
Этот SO ответ дает отличное, краткое объяснение почему.