【发布时间】:2012-12-16 16:57:36
【问题描述】:
假设我有 5 个电影片名:
- 无太阳
- 珊莎
- 原来如此
- 索尔古德
- 唯一的幸存者
我想实现一个具有这种预期行为的自动完成搜索字段:
- "Sans" > Sans Soleil, Sansa
- “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”。
【问题讨论】:
-
最新railscast(pro)中同一问题的不同处理方式
-
有趣,你看过这集吗?如果它解决了我的确切用例,因为它能够正确地对具有多个单词的标题上的 ngram 命中进行排序,我可能会考虑订阅。
-
我看过了。它不能解决您确切的问题,而是使用不同的方法。如果您开发 Rails 应用程序是为了赚钱,railscast 可以节省大量时间,就我而言,每个月的第一天我都会节省 9 美元。
标签: ruby-on-rails elasticsearch tire