0

我正在使用轮胎来索引和搜索汽车数据库:

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

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

4

2 回答 2

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如果查询将包含按正确顺序排列的经销商和州信息,您甚至可以使用该类型,例如“New York Joe Dealer”。

于 2013-04-23T11:55:31.307 回答
0

解决方案是移至“匹配”类型过滤器,并禁用 :type => :phrase,因此:

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

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

于 2013-04-22T14:39:10.673 回答