我正在使用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的所有汽车排名较低)。
答案 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
排序仍然存在一些问题,因此时间仍然是一个很大的输入,但这解决了许多问题。