Запрос диапазона дат с использованием шаблона поиска в Elasticsearch

Мы столкнулись с проблемой при формировании запроса диапазона дат с использованием шаблона поиска в Elasticsearch. Он работает нормально, с одним условным предложением, но когда предоставляется несколько условий, мы получаем следующую ошибку.

    {
  "script": {
    "lang": "mustache",
    "source": "{
         \"query\":{
              \"bool\":{
                  \"must\":[
                     {{#since}}
                      {\"range\": 
                        {\"@timestamp\": 
                            {
                              {{#from}}\"from\":\"{{from}}\"{{/from}}
                            }
                         }
                       },{{/since}}
                       {\"query_string\":
                           {
                             \"query\":\"(title:({{query_string}}))\"
                           }
                        }
                      ]
                   }
                  }
               }"
             }
           }

Ошибка:

{
error: {
root_cause: [
{
type: "general_script_exception",
reason: "Failed to compile stored script [dateTemplate] using lang [mustache]",
}
],
type: "general_script_exception",
reason: "Failed to compile stored script [dateTemplate] using lang [mustache]",
caused_by: {
type: "mustache_exception",
reason: "Improperly closed variable in query-template:1",
},
},
status: 500,
}

Запрос:

{ "id": "dateTemplate", "params": { "query_string": "*" } }

То же самое отлично работает для этого шаблона:

{
  "script": {
    "lang": "mustache",
    "source": "{\"query\":{\"bool\":{\"must\":[{{#since}}{\"range\": {\"@timestamp\": {\"from\": \"{{since}}\"}}},{{/since}}{\"query_string\":{\"query\":\"(title:({{query_string}}))\"}}]}}}"
  }
}

Запрос

{
  "id": "date",
  "params": {
    "query_string": "*",
    "since": "2018-07-23"
  }
}

person User1203    schedule 06.01.2019    source источник


Ответы (1)


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

POST _scripts/dateTemplate
{
  "script": {
    "lang": "mustache",
    "source": """
      {
        "query": {
          "bool": {
            "must": [
              {{#since}}
              {
                "range": {
                  "@timestamp": {
                    {{#from}}"from": "{{from}}"{{/from}}
                  }
                }
              },
              {{/since}}
              {
                "query_string": {
                  "query": "(title:({{query_string}}))"
                }
              }
            ]
          }
        }
      }
    """
  }
}

Тогда правильный способ вызова этого запроса выглядит следующим образом (т.е. вам не хватает переменной from в вашем объекте params):

{
  "id": "dateTemplate",
  "params": {
    "query_string": "*",
    "since": {
      "from": "2018-07-23"
    }
  }
}
person Val    schedule 07.01.2019
comment
Спасибо, это работает нормально, когда у нас также есть несколько запросов диапазона. Но это должно работать с условием ИЛИ. Итак, я добавил то же самое в предложение Should. Но это не работает, как ожидалось. мы получаем одну запятую дополнительно, и я не уверен, как дать ее в формате массива. Чтобы быть более ясным, должен иметь одну строку запроса и запрос терминов. Предложение Should должно иметь этот запрос диапазона дат. Не могли бы вы помочь в этом? - person User1203; 25.02.2019
comment
Конечно, не стесняйтесь задавать новый вопрос, и мы решим его там - person Val; 25.02.2019
comment
Спасибо, ссылка на новый вопрос: stackoverflow.com/questions/54869985/ - person User1203; 25.02.2019