轮胎/ Elasticsearch搜索关联

时间:2012-04-09 10:00:44

标签: ruby-on-rails lucene elasticsearch tire

我有以下代码,我正在尝试使用ElasticSearch进行查询。

当我进行Book.search(:q =>'Foo')时它正在工作但是当我做Book.search(:author =>'Doctor')时它不起作用。在我的数据库中,我有一个名为“Barz,Foo,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

2 个答案:

答案 0 :(得分:3)

你可以这样做

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?

答案 1 :(得分:0)

正如@Karmi所说enter link description here

嗨,是的,你的方法似乎是一个。几件事: *除非你想使用Lucene查询语法(提升,范围等),否则最好使用文本查询, *是的,过滤器比查询更高效,您的示例中的active = true非常适合过滤器。但请注意查询,过滤器和方面之间的相互作用。 但是,您对术语查询的定义不正确 - 它应该是:

term :author, params[:author]