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 (например, приведенный выше фрагмент кода неправильно экранирует специальные символы в переданном значении).