假设我有5个电影标题:
我想用以下预期行为实现一个自动完成的搜索字段:
这个用例似乎很明显,而且必须被许多人使用,但我只是无法让它正常工作,我似乎找不到任何答案或文档来帮助它。这是我目前的模式:
class Film < Media
include Tire::Model::Search
include Tire::Model::Callbacks
settings :analysis => {
:filter => {
:title_ngram => {
"type" => "edgeNGram",
"min_gram" => 2,
"max_gram" => 8,
"side" => "front" }
},
:analyzer => {
:title_analyzer => {
"tokenizer" => "lowercase",
"filter" => ["title_ngram"],
"type" => "custom" }
}
} do
mapping do
indexes :title, :type => 'string', :analyzer => 'title_analyzer'
indexes :int_english_title, :type => 'string', :analyzer => 'title_analyzer'
end
end
end
以及如何在我的search_controller中处理查询:
search = Tire.search ['books', 'films', 'shows'], :load => true, :page => 1, :per_page => 10 do |s|
s.query do |query|
query.string "title:#{params[:search]}"
end
end
@results = search.results
这会产生一些奇怪的行为:
发布于 2013-01-03 08:44:58
我认为您可以通过将match
查询设置为type:"phrase_prefix"
来实现您想要的结果。大多数,但不是全部,你的例子都会奏效。
有了Ngram,您可以更好地控制流程,但他们有相当大的召回(他们通常返回更多的数据,然后你想要),你必须与它斗争。这是使用多个查询术语("Sans so")观察到的“奇怪行为”,因为它们实际上是作为Sans OR so
查询执行的。
尝试使用default_operator: "AND"
选项(请参阅轮胎的test.rb),或者更确切地说,使用operator: "AND"
选项使用match
查询(参见轮胎的test.rb)。
有一些关于自动完成、轮胎和Ngram的文章可供选择:
发布于 2013-01-02 10:16:24
试着跟随
search = Tire.search ['books', 'films', 'shows'], :load => true, :page => 1, :per_page => 10 do |s|
s.query do |q|
q.boolean do |b|
b.must {|m| m.string params[:search]}
end
end
end
https://stackoverflow.com/questions/14120127
复制相似问题