2015-07-09 2 views
1

Прежде всего, это берется из documentation:Elasticsearch индексированный шаблон поиска формирует пустые строки в массиве

Попутный массив строк

GET /_search/template 
{ 
    "template": { 
    "query": { 
     "terms": { 
     "status": [ 
      "{{#status}}", 
      "{{.}}", 
      "{{/status}}" 
     ] 
     } 
    } 
    }, 
    "params": { 
    "status": [ "pending", "published" ] 
    } 
} 

, который визуализируется как:

{ 
"query": { 
    "terms": { 
    "status": [ "pending", "published" ] 
    } 
} 

Howev э, в моем случае я сделал точно такой же шаблон (по крайней мере я так думаю), но он производит немного другой выход для меня:

.."filter" : { 
    "bool" : { 
    "must" : [{ 
     "terms" : { 
      "myTerms" : [ 
      "{{#myTerms}}", 
      "{{.}}", 
      "{{/myTerms}}" 
      ], 
      "_cache" : true 
     } 
     } 
    ] 
    } 
}.. 

Вот как я это называю позже:

GET /passport/_search/template 
{ 
    "template": { 
     "id": "myTemplate" 
    }, 
    "params": { 
     "myTerms": ["1", "2"] 
    } 
} 

Однако это выглядит так:

.."myTerms" : ["", "1", "2", ""].. 

это не быть проблемой, но myTerms хранятся в виде целых чисел, и я хотел бы сохранить его таким образом (но если только это решение, то хорошо, я может жить с ним), но затем запрос бросает исключение, что он не может преобразовать «» в целочисленный тип, который, как ожидается, поведение

NumberFormatException [Для ввода строки: \ «\»]

Как я должен иметь дело с этим? Я не хочу хранить свои шаблоны в качестве файлов, я предпочитаю их индексировать.

Этот вопрос был многообещающим: Pass an array of integers to ElasticSeach template, но это непонятно, и ответ не решил мою проблему (мне не разрешили хранить мой шаблон, как это).

Elasticsearch используется версия: 1.6.0

Пожалуйста, советы.

ответ

2

Я видел это требование раньше, и решение выглядит взломанным, но оно работает. В принципе, запятые в шаблоне являются проблемой, потому что Mustache будет проходить по массиву, и для каждого элемента массива будет вставлен элемент - {{.}} - но также и запятая, которую вы указываете внутри {{#myTerms}} и {{/myTerms}}.

А также в вашем случае вы не должны использовать двойные кавычки - "{{.}}", потому что сам элемент будет окружен двойными кавычками. Вот почему вы видите "1". Но если вы хотите совместить числа, которые должны быть списком чисел, а не строками.

Итак, прежде всего, избавиться от двойных котировок. Это означает, что окружение шаблона двойными кавычками и избежать любых двойных кавычек, которые должны сделать его в конечном результате (вы сразу поймете, пример ниже).

Во-вторых, хакерская часть имитирует запятую в результате и пропустит последнюю запятую. Значение 1,2,3, не должно содержать последней запятой.Решение состоит в том, чтобы предоставить параметры в виде списка кортежей - один элемент кортежа - это само значение, другой элемент - логическое: [{"value":1,"comma":true},{"value":2,"comma":true},{"value":4}]. Если comma - true, то Mustache должен положить ,, в противном случае нет (этот случай относится к последнему элементу массива).

POST /_search/template/myTemplate 
{"template":"{\"filter\":{\"bool\":{\"must\":[{\"terms\":{\"myTerms\":[{{#myTerms}}{{value}}{{#comma}},{{/comma}}{{/myTerms}}],\"_cache\":true}}]}}}"} 

И это, как вы должны передать параметры:

{ 
    "template": { 
    "id": "myTemplate" 
    }, 
    "params": { 
    "myTerms": [{"value":1,"comma":true},{"value":2,"comma":true},{"value":4}] 
    } 
} 

Что это делает генерировать что-то вроде этого:

{ 
    "filter": { 
    "bool": { 
     "must": [ 
     { 
      "terms": { 
      "myTerms": [1,2,4], 
      "_cache": true 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Не 'NEST' клиент имеет проблемы при шаблон должен быть назван так? Я не упоминал об этом, о чем я говорю. Думал, что будет простое решение –

+0

Я понятия не имею :-). Мое решение с точки зрения ES и, да, не является простым. Принял мне время, чтобы придумать это. –

+0

Думаете об этом, почему, по-вашему, у клиентов должны быть проблемы? 'myTerms' - это массив кортежей, должен быть способ указать это в NEST. –