假设我有 5 部电影片名:
- 无太阳
- 珊莎
- 这也是
- 索尔古德
- 唯一的幸存者
我想实现一个具有这种预期行为的自动完成搜索字段:
- “Sans” > Sans Soleil,珊莎
- “Sans so” > Sans Soleil
- “所以” > 这就是这样,索尔·古德,唯一的幸存者
- “原来如此” > 这也是
- “Sol” > Sol Goode,Sole Survivor,Sans Soleil
这个用例似乎很明显,必须被许多人使用,但我就是无法让它正常工作,而且我似乎找不到任何答案或文档来帮助。这是我目前的模型:
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
这会产生一些奇怪的行为:
- “Sans so”按此顺序返回“Sansa,Sans Soleil,So Is This”。
- “So is”按此顺序返回“Sol Goode,Sans Soleil,Sole Survivor,So Is This”。