Tire/Elasticsearch поиск ассоциации

У меня есть следующий код, и я пытаюсь использовать ElasticSearch для его запроса.

Он работает, когда я делаю Book.search(:q=>'Foo'), но не работает, когда я делаю Book.search(:author=>'Doctor'). В моей базе данных есть запись с таким именем, как «Барз, Фу, Доктор».

Я не уверен, следует ли мне использовать термины или термин в моем запросе, потому что я разбиваю имя, используя снежный ком. Я пробовал с терминами, а потом получаю ошибку. Со сроком я не получаю никаких результатов.

class Author < ActiveRecord::Base
    has_many :books
end

class Book < ActiveRecord::Base
  belongs_to :author
  include Tire::Model::Search
  include Tire::Model::Callbacks
  mapping do
    indexes :title,
    indexes :description
    indexes :author,type: 'object', properties: {
         name: { type: 'multi_field',
                 fields: { name:  { type: 'string', analyzer: 'snowball' },
                           exact: { type: 'string', index: 'not_analyzed' } 
                  } 
          } }
  end

  def to_indexed_json
   to_json(:include=>{:author=>{:only=>[:name]}} )
  end

  def self.search(params = {})
    tire.search(load:true) do
      query do
       boolean do
        should { string params[:q] } if params[:q].present?
        should { term params[:author] } if params[:author].present?
       end
      end
      filter :term, :active=>true
    end
  end
end

person VP.    schedule 09.04.2012    source источник


Ответы (2)


Вы можете сделать так

should { terms :author, [params[:author]]} if params[:author].present?

OR

should { term :author, params[:author]} if params[:author].present?

OR

should { string "author:#{params[:author]}"} if params[:author].present?
person Mukesh    schedule 09.04.2012

Как сказал @Karmi, введите здесь описание ссылки

Привет, да, ваш подход кажется одним из них. Пара вещей: * если вы не хотите использовать синтаксис запроса Lucene (повышение, диапазоны и т. д.), возможно, лучше использовать текстовый запрос, * да, фильтры более эффективны, чем запросы, а active=true в вашем примере — это хорошо подходит для фильтров. Однако остерегайтесь взаимодействия между запросами, фильтрами и аспектами. Однако ваше определение термина «запрос» неверно — оно должно быть:

term :author, params[:author]
person VP.    schedule 09.04.2012