弹性搜索多个字段

时间:2013-04-22 13:47:41

标签: elasticsearch tire

我正在使用Tire索引并搜索汽车数据库:

create :mappings => {
    :cars => {
        :properties => {
            :id => {:type => 'string', :index => 'not_analyzed', :include_in_all => true},
            :user_id => {:type => 'string', :index => 'not_analyzed'},
            :name => {:type => 'string', :analyzer => 'snowball' },
            :time => {:type => 'long', :index => 'not_analyzed'},
            :origin_country => {:type => 'string', :analyzer => 'keyword', :include_in_all => false},
            :origin_state => {:type => 'string', :analyzer => 'keyword', :include_in_all => false},
            :origin_city => {:type => 'string', :analyzer => 'keyword', :include_in_all => false},
            :dealer_name => {:type => 'string', :analyzer => 'snowball', :boost => 1.5, :include_in_all => false}
        }
    }
}

查询看起来像:

   s = Tire.search Search.index_name do

      query do |query|
        query.text :_all, downcased_query, :type => :phrase
      end

    end

现在,如果您搜索“纽约Joe经销商”,如果有一个dealer_name是“Joe Dealer”或者origin_state是“New York”而不是两者,那么它将匹配。有没有办法匹配origin_state是“纽约”和“dealer_name”是“乔经销商”(或其中之一)?我的想法是,我希望用户输入一个自由形式的查询字符串,并能够找到最佳匹配对象,并希望他们进入纽约Joe经销商并找到所有在纽约Joe Dealer出售的汽车(或纽约或Joe Dealer的所有汽车排名较低)。

2 个答案:

答案 0 :(得分:2)

正确的解决方案是使用multi_match查询对多个字段执行相同的查询。它在Tire中得到支持,请参阅https://github.com/karmi/tire/blob/master/test/integration/match_query_test.rb

Tire.search Search.index_name do
  query do |query|
    query.match :dealer_name, downcased_query
    query.match :origin_state, downcased_query
  end
end

如果查询包含正确顺序的经销商和州信息,您甚至可以使用phrase类型,例如“纽约Joe经销商”。

答案 1 :(得分:0)

解决方案是移动到“匹配”类型过滤器,并且diable:type => :短语,所以:

query do |query|
    query.match :_all, downcased_query
end

排序仍然存在一些问题,因此时间仍然是一个很大的输入,但这解决了许多问题。