2 つの文字列がある場合:
- ドウ、ジョー
- ドウ、ジョナサン
次のような検索を実装したいと思います。
- 「ドウ」 > 「ドウ、ジョー」、「ドウ、ジョナサン」
- "Doe J" > "Doe, Joe", "Doe, Jonathan"
- 「ジョン・ドウ」 > 「ドウ、ジョナサン」
- 「ジョナ・ド」>「ドウ、ジョナサン」
私が持っているコードは次のとおりです。
settings analysis: {
filter: {
nameNGram: {
type: "edgeNGram",
min_gram: 1,
max_gram: 20,
}
},
tokenizer: {
non_word: {
type: "pattern",
pattern: "[^\\w]+"
}
},
analyzer: {
name_analyzer: {
type: "custom",
tokenizer: "non_word",
filter: ["lowercase", "nameNGram"]
},
}
} do
mapping do
indexes :name, type: "multi_field", fields: {
analyzed: { type: "string", index: :analyzed, index_analyzer: "name_analyzer" }, # for indexing
unanalyzed: { type: "string", index: :not_analyzed, :include_in_all => false } # for sorting
}
end
end
def self.search(params)
tire.search(:page => params[:page], :per_page => 20) do
query do
string "name.analyzed:" + params[:query], default_operator: "AND"
end
sort do
by "name.unanalyzed", "asc"
end
end
end
残念ながら、これは機能していないようです...トークン化はうまく見えます.「Doe、Jonathan」の場合、「d」、「do」、「doe」、「j」、「jo」、「jon」 "、"jona" などですが、"do AND jo" で検索しても何も返されません。ただし、「jona」を検索すると、「Doe, Jonathan」が返されます。私は何を間違っていますか?