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 ответ дает отличное, краткое объяснение почему.

Другие вопросы по тегам