3

Я боролся с шаблонами Elasticsearch, в частности, в необязательных параметрах. Я хотел бы добавить опционально фильтры там. Это фрагмент кода я испытывал: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": [] 
    } 
} 
+0

Я не понимаю, в чем проблема и что такое ожидание. –

+0

Извините за путаницу, @AndreiStefan Я обновил вопрос. Дайте мне знать, если это имеет смысл сейчас. –

ответ

2

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

пример:

{ 
    "filter" : { 
     "bool" : { 
      "should" : [ 
       { "terms" : { "status" : [ "{{#ProductIDs}}","{{.}}","{{/ProductIDs}}"] }} 
       {{^ProductIDs}}, 
       {"match_all":{}} 
       {{/ProductIDs}} 
      ] 
     } 
    } 
} 
+0

Ну, это обходное решение, о котором я думал. Но меня интересует фактическое решение. Если я не пройду ни одного параметра - не отображать его вообще. :( –

+0

, учитывая, что mustache.java не поддерживает [доступ к элементам массива] (https://github.com/spullara/mustache.java/issues/68), я не думаю, что есть способ обойти это, но для реструктуризации вашего запроса шаблона, как указано выше, или использования дополнительного параметра, который имеет длину списка, и использовать это как условие для представления условия must – keety

+0

. Мне просто интересно проверить, существует ли данный параметр или не пуст. пустым массивом/списком является только решение, нет? –

1

Не пробовал, но не следует что-то вроде этой работы?

{ 
    "filter" : { 
    "bool" : { 
     "must" : [ 
     {{#ProductIDs}} 
      {{^ProductIDs.isEmpty}} 
      { "terms" : { "Product.ProductID" : [{{#ProductIDs}}{{.}},{{/ProductIDs}}] } } 
      {{/ProductIDs.isEmpty}} 
      {{#ProductIDs.isEmpty}} 
      {"match_all":{}} 
      {{/ProductIDs.isEmpty}} 
     {{/ProductIDs}} 
     {{^ProductIDs}} 
      {"match_all":{}} 
     {{/ProductIDs}} 
     ] 
    } 
    } 
} 

Не очень, может быть, есть лучший способ.

Смежные вопросы