Как получить все документы из фильтра в Elasticsearch?

Если я передам пустые параметры (см. ниже), я хотел бы получить все документы из Elasticsearch. Как я могу этого добиться?

Одно из решений состоит в том, что я могу записать все существующие категории в массив. Но у меня больше 100 категорий и это не будет хорошим решением.

Кто-нибудь может мне помочь? Можно ли игнорировать условия, если массив пуст?

POST _scripts/test{"script": {
"lang": "mustache",
"source": {
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "terms": {
          "category": [
            "{{#category}}",
            "{{.}}",
            "{{/category}}"
          ]}}}}}}}

Если я выполню приведенный ниже запрос, результаты будут пустыми:

GET poi/_search/template{
"id": "test", 
"params": {
    "category" : [""]
}}

person Mark Müller    schedule 02.06.2020    source источник


Ответы (1)


Лучший способ добиться этого — использовать массив JSON:

POST _scripts/test
{
  "script": {
    "lang": "mustache",
    "source": """
    {
      "query": {
        "bool": {
          "must": {
            "match_all": {}
          },
          "filter": [
            {{#category}}
            {
              "terms": {
                "category": {{#toJson}}category.values{{/toJson}}
              }
            }
            {{/category}}
          ]
        }
      }
    }
    """
  }
}

Затем вы можете выполнить этот шаблон поиска следующим образом:

GET poi/_search/template
{
  "id": "test", 
  "params": {
    "category" : {
      "values": ["cat1", "cat2", "cat3"]
    }
  }
}

И если вы не хотите указывать какие-либо категории, например:

GET poi/_search/template
{
  "id": "test", 
  "params": {
  }
}
person Val    schedule 02.06.2020
comment
Привет, спасибо за быстрый ответ :) ... filter: { {{/category}}... {{/category}} ... } Я попытался выполнить этот запрос в kibana devtools и в почтальоне и получил сообщение об ошибке плохая струна. Я понятия не имею, где я могу выполнить этот запрос. Я попробовал это с, но это не сработало. Не могли бы вы рассказать, как выполнить этот запрос? - person Mark Müller; 02.06.2020
comment
Вам нужно запустить POST _scripts/test в Kibana Dev Tools, чтобы установить шаблон поиска, а затем вы можете запустить GET poi/_search/template где угодно (Kibana или Postman). Я что-то изменил, можете ли вы проверить мой обновленный ответ и попробовать еще раз? - person Val; 02.06.2020
comment
Я не могу установить шаблон поиска {{#category}} {{/category}}, из-за этого появляется сообщение об ошибке: { error : { root_cause : [ { type : x_content_parse_exception, Reason: [10:21] [сохраненный источник скрипта] не удалось разобрать поле [источник] }... | Синтаксическая ошибка неверной строки - person Mark Müller; 02.06.2020
comment
Вы правы, смотрите мой обновленный ответ, шаблоны усов нужно указывать по-другому, то есть с тройными кавычками. - person Val; 02.06.2020
comment
извините, это была моя ошибка, большое спасибо, это работает :) - person Mark Müller; 02.06.2020
comment
извините, к сожалению, последний запрос на получение всех документов не работает. Я получил это сообщение об ошибке: { ошибка : { root_cause : [ { тип : недопустимое_аргумент_исключение, причина : неверный формат запроса, пустое предложение найдено в [9:11] } ], тип : недопустимое_аргумент_исключение, причина : запрос искажен, пустое предложение найдено в [9 :11] }, статус: 400 } - person Mark Müller; 02.06.2020
comment
Имеет смысл. Пожалуйста, проверьте мой обновленный ответ и попробуйте еще раз - person Val; 02.06.2020
comment
Большое спасибо :). - person Mark Müller; 02.06.2020