Если у меня есть две строки:EdgeNGram с Тиром и ElasticSearch
- Doe, Джо
- Doe, Джонатан
Я хочу осуществить поиск таким образом, что:
- «Doe»> «Doe, Joe», «Doe, Jonathan»
- «Doe J»> «Doe, Joe», «Doe, Jonathan»
- "Джон Доу"> "Doe, Джонатан"
- "Йона Do"> "Doe, Джонатан"
Вот код, у меня есть:
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
К сожалению, это Безразлично Кажется, что он работает ... Токенизация выглядит великолепно, потому что «Доу, Джонатан» я получаю что-то вроде «d», «do», «doe», «j», «jo», «jon», «jona» »и т. д., но если я ищу« do AND jo », я ничего не верну. Если я, однако, ищу «дзону», я вернусь «Доу, Джонатан». Что я делаю не так?