0
如果我有兩個字符串:EdgeNGram用輪胎和ElasticSearch
- 李四,喬
- 李四,喬納森
我想實現一個搜索這樣的:
- 「Doe」>「Doe,Joe」,「Doe,Jonathan」
- 「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 「等,但如果我搜索」做和喬「,我什麼都沒有回來。但是,如果我搜索「喬納」,我會回到「多伊,喬納森。」我究竟做錯了什麼?