Каковы параметры для метода поиска драгоценного камня Tire?

#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: {} } (см. Примерно На стр. 99 lib/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 .