#ruby-on-rails #ruby #elasticsearch #tire
#ruby-on-rails #ruby #elasticsearch #tire
Вопрос:
Мне нужно запустить поиск с использованием Tire с моим запросом, определенным в качестве параметра, но я не уверен, как поступить.
search = {
query: {
function_score: {
query: { match_all: {} },
# filters is an array previously built
functions: filters,
score_mode: "total"
}
}
}
Program.tire.search(load: true, size: 50, search)
Я получаю следующую ошибку: /Users/app/models/program_match.rb:122: syntax error, unexpected ')', expecting tASSOC
что заставляет меня думать, что я просто пропускаю ключевое слово перед вызовом search
.
Любая помощь будет высоко оценена!
Ответ №1:
Вам, вероятно, просто нужно сделать:
Program.tire.search({load: true, size: 50}.merge(search))
Редактировать
На самом деле, глядя на источник для search
(https://github.com/karmi/retire/blob/master/lib/tire/model/search.rb ), похоже, вам нужно сделать:
Program.tire.search(search, {load: true, size: 50})
search
ожидает два параметра (запрос, параметры) или один параметр (для параметров) и блок (для запроса). Ruby запутывается, потому что вы запустили hash ( load: true ...
), а затем просто ввели новый хэш (ваш search
хэш), который он видит как хэш-ключ (без значения).
Кроме того, если вы только начинаете работать с Tire, я бы посоветовал проверить elasticsearch-rails, который, по словам автора, заменяет Tire .
Недавно я преобразовал проект Tire в elasticsearch-rails и обнаружил, что он может делать все, что делает Tire, хотя он не предоставляет запрос DSL (похоже, вы все равно его не используете, так что никаких потерь).
РЕДАКТИРОВАТЬ 2
Вы можете выполнить простой match_all
запрос, например:
Program.tire.search(load: true, size: 50) { query { all } }
Вы можете получить нечто подобное, выполнив:
Program.tire.search('*', load: true, size: 50)
Как я отметил в комментарии ниже, запрос в качестве первого параметра для search
всегда будет заключен в query_string
запрос.
Вероятно, лучший способ сделать то, что вы просили изначально, — это сделать:
Tire.search(Video.tire.index_name, query: {
function_score: {
query: { match_all: {} },
functions: filters,
score_mode: "total"
}
}).results
Я только что протестировал аналогичный function_score
запрос в локальном проекте и подтвердил, что он выдает ожидаемый запрос.
РЕДАКТИРОВАТЬ 3
Я никогда раньше не использовал эту load
опцию, но, похоже, вы можете сделать:
Tire.search(Video.tire.index_name, payload: {
query: {
function_score: {
query: { match_all: {} },
functions: filters,
score_mode: "total"
}
}
}, load: true).results
Обратите внимание, что вы должны обернуть запрос как значение для payload
.
Комментарии:
1. @kardiez Привет, спасибо за ответ, это имеет смысл, хотя я получаю эту ошибку. Может ли быть что-то не так с моим блоком поиска? Я бы хотел перейти с Tire, но мне еще предстоит найти хороший документ о том, как это сделать. Спасибо за помощь!
2. @XMLSlayer, по-видимому
search
, функция переносит хэш запроса внутрь{query: query_string: {} }
(см. Примерно На стр. 99lib/tire/model/search.rb
). См . Некоторое обсуждение использованияfunction_score
здесь ( github.com/karmi/retire/issues/874 ), который обеспечивает обходной путь.3. Да, кажется, нет хорошего руководства для перехода, но две библиотеки очень похожи. Значительная часть изменений включает в себя просто использование
__elasticsearch__
вместоtire
для идентификации прокси-объекта ES.4. @kardiez, хорошо, что перенос имеет больше смысла. Да, я тоже наткнулся на эту ссылку, но #{Tire::Model::Search.index_prefix} возвращает
nil
для меня, поэтому этот фрагмент кода ничего не делает, кроме поиска строки «_ideas»5. Да, я не знаю, что комментатор пытается сделать с этой строкой. Тем не менее, я думаю, вам просто нужно указать там имя индекса модели, чтобы вы могли заменить
"#{Tire::Model::Search.index_prefix}_ideas"
наProgram.tire.index_name
.