Запрос диапазона дат с использованием SearchTemplate в Elasticsearch с предложением Следует
У нас есть сценарий, в котором мы должны выполнить запрос диапазона с условием "ИЛИ". Он работает нормально, с одним запросом, но получает ошибку при запуске с несколькими запросами.
POST _scripts/dateTemplate
{
"script": {
"lang": "mustache",
"source": """
{
"query": {
"bool": {
"must": {
"query_string": {
"query": "title:({{searchkeyword}})"
}
},
"filter": {
"bool":{
"must":[
{
"match_all": {}
}
{{#f_url}} , {
"terms" : {
"f_url": [{{#toJson}}f_url{{/toJson}} ]
}
}
{{/f_url}}
],
"should":[
{{#since}}
{
"range": {
"{{since}}": {
{{#from}}"from": "{{from}}"{{#to}},{{/to}}{{/from}}
{{#to}}"to":"{{to}}"{{/to}}
}
}
}
{{/since}}
]
}
}
}
}
}
"""
}
}
Запрос при вызове шаблона
POST _search/template
{
"id": "dateTemplate",
"params": {
"searchkeyword": "*",
"since":[ {
"since":"@timestamp",
"from": "2018-06-01"
},
{
"since":"@timestamp",
"from": "2018-06-08"
}
]
}
}
ошибка
{
"error": {
"root_cause": [
{
"type": "json_parse_exception",
"reason": "Unexpected character ('{' (code 123)): was expecting comma to separate Array entries\n at [Source: \t\t{\n\t\t\"query\": {\n\t\t\t\"bool\": {\n\t\t\t\t\"must\": {\n\t\t\t\t\"query_string\": {\n\t\t\t\t\t\"query\": \"title:(*)\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"filter\": {\n\t\t\t\t\"bool\":{\n\t\t\t\t\t\"must\":[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"match_all\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"should\":[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"range\": {\n\t\t\t\t\t\t\t\t\t\"@timestamp\": {\n\t\t\t\t\t\t\t\t\t\t\"from\": \"2018-06-01\"\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"range\": {\n\t\t\t\t\t\t\t\t\t\"@timestamp\": {\n\t\t\t\t\t\t\t\t\t\t\"from\": \"2018-06-08\"\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t}; line: 25, column: 9]"
}
],
"type": "json_parse_exception",
"reason": "Unexpected character ('{' (code 123)): was expecting comma to separate Array entries\n at [Source: \t\t{\n\t\t\"query\": {\n\t\t\t\"bool\": {\n\t\t\t\t\"must\": {\n\t\t\t\t\"query_string\": {\n\t\t\t\t\t\"query\": \"title:(*)\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"filter\": {\n\t\t\t\t\"bool\":{\n\t\t\t\t\t\"must\":[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"match_all\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"should\":[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"range\": {\n\t\t\t\t\t\t\t\t\t\"@timestamp\": {\n\t\t\t\t\t\t\t\t\t\t\"from\": \"2018-06-01\"\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"range\": {\n\t\t\t\t\t\t\t\t\t\"@timestamp\": {\n\t\t\t\t\t\t\t\t\t\t\"from\": \"2018-06-08\"\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t}; line: 25, column: 9]"
},
"status": 500
}
То же самое, если я добавлю его в условие must, оно отлично работает с условием "И". Можете ли вы помочь в создании шаблона с условием "И" и "ИЛИ"?
1 ответ
Решение
Вы почти у цели, вам просто нужно сообщить усам, когда будет достигнут последний элемент массива. Таким образом, ваш шаблон должен выглядеть следующим образом (т.е. мы добавляем запятую после каждого элемента, кроме последнего):
...
"should":[
{{#since}}
{
"range": {
"{{since}}": {
{{#from}}"from": "{{from}}"{{#to}},{{/to}}{{/from}}
{{#to}}"to":"{{to}}"{{/to}}
}
}
}{{^last}},{{/last}} <-- modify this line
{{/since}}
]
...
А затем просто измените ваш звонок, чтобы включить last
флаг до последнего элемента since
массив:
POST _search/template
{
"id": "dateTemplate",
"params": {
"searchkeyword": "*",
"since":[ {
"since":"@timestamp",
"from": "2018-06-01"
},
{
"since":"@timestamp",
"from": "2018-06-08",
"last": true <-- add this line
}
]
}
}