私が5つの映画のタイトルを持っているとしましょう:
- サンソレイユ
- さんさ
- これはそうですか
- ソル・グッド
- 唯一の生存者
この予想される動作でオートコンプリート検索フィールドを実装したいと思います。
- "サンズ" > サンソレイユ、サンサ
- "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" をこの順序で返します。