Я боролся с шаблонами Elasticsearch, особенно с необязательными параметрами. Я хочу добавить туда необязательные фильтры. Это фрагмент кода, который я пробовал:
{
"filter" : {
"bool" : {
"must" : [
{{#ProductIDs.0}}
{ "terms" : { "Product.ProductID" : [{{#ProductIDs}}{{.}},{{/ProductIDs}}] } }
{{/ProductIDs.0}}
]
}
}
}
Конечно, я заменил "
на \"
, уродил его, завернул в { "template" :"_snippet_above_" }
.
Теперь, когда я пытаюсь вызвать это, используя следующее:
GET /statistic/_search/template
{
"template": {
"id": "test"
},
"params": {
"ProductIDs": [1,2]
}
}
Он игнорирует параметр, который я предоставил, однако, когда я пытаюсь сделать это на официальной демонстрационной странице mustache.io, он работает нормально.
Пробовал тоже вариант {{#ProductIDs.length}}
- не вышло. Проведя небольшое исследование, я обнаружил, что есть одно различие между mustache.js и mustache.java. Я предположил, что Elasticsearch использует версию JAVA и не поддерживает параметр длины, поэтому мне приходится полагаться на isEmpty. Итак, я переписал свой запрос следующим образом:
{
"filter" : {
"bool" : {
"must" : [
{{^ProductIDs.isEmpty}}
{ "terms" : { "Product.ProductID" : [{{#ProductIDs}}{{.}},{{/ProductIDs}}] } }
{{/ProductIDs.isEmpty}}
]
}
}
}
Теперь, когда я запрашиваю шаблон со списком ProductIDs - он работает нормально, однако, если я удалю параметр, это не принесет результатов. Я предполагаю, что это генерирует это:
{
"filter" : {
"bool" : {
"must" : [
{ "terms" : { "Product.ProductID" : [] } }
]
}
}
}
Если я отправляю пустой массив как параметр - он работает нормально.
GET /statistic/_search/template
{
"template": {
"id": "test"
},
"params": {
"ProductIDs": []
}
}
Я предполагаю, что это происходит потому, что "ProductIDs"
undefined
и не пустые.
Есть ли способ устранить это условие в mustache.java, чтобы я мог игнорировать эти параметры?
tl; dr; Проблема в том, что если я не укажу параметр в моем поисковом запросе через шаблон, мое условие будет отображаться как пустой массив, см. это:
{
"filter" : {
"bool" : {
"must" : [
{ "terms" : { "Product.ProductID" : [] } }
]
}
}
}
Если я передаю в качестве параметра пустой массив, см. Следующее:
GET /statistic/_search/template
{
"template": {
"id": "test"
},
"params": {
"ProductIDs": []
}
}
Он работает так, как ожидалось, и не создает условия фильтрации, как описано в моем шаблоне, потому что в массиве нет данных.
Я хочу этот:
GET /statistic/_search/template
{
"template": {
"id": "test"
},
"params": {
}
}
Чтобы работать так же, как это:
GET /statistic/_search/template
{
"template": {
"id": "test"
},
"params": {
"ProductIDs": []
}
}