asticsearch не может запросить путь в ruby

У меня есть индекс эластичного поиска 'events' - внутри этого индекса есть тип 'event'.

Объекты события имеют "место", которое имеет различные свойства, включая "имя", поэтому упрощенная структура выглядит так:

event {
  venue {
    name: "foo"
  }
}

Теперь я использую эластичный поиск-рельсы - все отлично работает для перечисления событий, поиска и т. Д. С использованием запроса dsl - но что, если я хочу перечислить все события в месте с определенным именем?

Я предполагаю, что что-то вроде этого должно быть возможно:

Event.search "{ 'query': { 'match': { 'venue.name': '#{params[:v]}' }}}

но я получаю следующую ошибку:

Elasticsearch::Transport::Transport::Errors::BadRequest

сопровождаемый существенным следом стека, который содержит много такого рода вещей:

Was expecting one of:\n    \"]\" ...\n    \"}\" ...\n    ];

ParseExceptions, предлагающий искаженный JSON - но я не уверен, почему.

Простой поиск

Event.search '{"query" : { "match_all" : {} }}'

работает нормально, так что я предполагаю, что это просто структура запроса, которая не так.

Я пробовал переключать одинарные / двойные кавычки, старался более внимательно следовать примеру на этой странице:

https://www.elastic.co/guide/en/elasticsearch/guide/current/denormalization.html

все безрезультатно, задавался вопросом, сталкивался ли кто-либо еще с этой ситуацией и мог бы предложить, как работать с этим в рубине

2 ответа

Решение

Json, который вы пытаетесь передать функции поиска, не является допустимым Json. Вы можете попробовать передать хэш вместо Json в функцию поиска. Попробуйте следующее:

query_hash = {query: {match: {'venue.name' => params[:v] }}}
Event.search query_hash

Парсер json в Elasticsearch не будет использовать одинарные кавычки для разделения строк - хотя некоторые более поздние парсеры могут, это не является частью стандарта.

Вы, конечно, можете избежать их, хотя это делает вещи несколько менее разборчивыми, поэтому предпочтительнее использовать альтернативную форму цитирования:

%< {"query": { "match": { "venue.name": "#{params[:v]}"}}} >

Однако гораздо лучше представить запрос как хэш ruby, а затем преобразовать его в json (например, приведенный выше фрагмент кода неправильно экранирует специальные символы в переданном значении).

Другие вопросы по тегам