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

У меня есть индекс "события" эластичного поиска - в этом индексе есть тип "событие".

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

event {
  venue {
    name: "foo"
  }
}

Теперь я использую elasticsearch-rails — все отлично работает для перечисления событий, поиска и т. д. с использованием запроса 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

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


person freeloader    schedule 19.07.2015    source источник


Ответы (2)


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

query_hash = {query: {match: {'venue.name' => params[:v] }}}
Event.search query_hash
person Kumar Akarsh    schedule 19.07.2015
comment
работает отлично, спасибо - я был уверен, что пробовал это точное решение, но, должно быть, не пробовал. в любом случае, спасибо - person freeloader; 19.07.2015

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

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

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

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

person Frederick Cheung    schedule 19.07.2015