Как объединить несколько запросов в 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 > ?

Ответ 1

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

Ответ 2

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

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