Как объединить несколько запросов в ElasticSearch

Для справки, вот код. Я пытаюсь сделать плагин hubot, который регистрируется в elasticsearch, а затем использует команды hubot для поиска этих журналов.

https://gist.github.com/4050748

Я пытаюсь получить записи, которые соответствуют двум запросам.

{ 
  query: { 
        match: {
          user: "SomeUsername" 
        }, 
        range: {
          date: {
            from: (Date.now() - 3600) 
          }
        }
  },
  size: 50 
}

Я ожидал:

  • до 50 записей
  • записи, которые имели данного пользователя
  • записи в последнем час

Я:

  • до 10 записей
  • записи, которые имели данного пользователя
  • в любое время

Как получить все записи с некоторым именем пользователя за последний час? Нужно ли использовать match_all с фильтрами? То, что я пытаюсь, не поддерживается?

в SQL это было бы что-то вроде:

Select (*) from messages where user_name = ? and time > ?

2 ответов


вам нужно использовать запрос типа bool для объединения различных запросов вместе. Затем можно выбрать, должен ли каждый отдельный запрос совпадать, должен совпадать (необязательно) или не должен совпадать.


для тех, кто натыкается на этот вопрос и задается вопросом, как выглядит объединение запроса соответствия и диапазона в ElasticSearch, этот пример будет выглядеть как

curl 'localhost:9200/<index>/_search?pretty=true' -d '{
  "query" : {
    "bool": {
      "must": [
        {
          "match": {
            "user": "SomeUsername"
          }
        },
        {
          "range" : {
            "date": {
              "gt": "now-1h"
            }
          }
        }
      ]
    }
  }
}'