假设我有 5 部影片:
- 无太阳
- Sansa
- 这也是吗
- 索尔·古德
- 唯一的幸存者
我想实现一个具有以下预期行为的自动完成搜索字段:
- “Sans” > 无太阳,珊莎
- 《无忧无虑》> 无太阳
- “所以” > 这也是,索尔·古德,唯一幸存者
- “也是” > 这也是
- 《索尔》> 索尔·古德,唯一幸存者,无太阳
这个用例似乎很明显,并且一定是许多人使用的一个,但我就是无法让它正常工作,而且我似乎找不到任何答案或文档来提供帮助。这是我当前的模型:
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”。