Наша модель Account
имеет first_name
, last_name
и ssn
(номер социального страхования).Elasticsearch по нескольким полям с частичными и полными совпадениями
Я хочу сделать частичные совпадения на first_name,
last_name ', но точное совпадение на ssn
. У меня это до сих пор:
settings analysis: {
filter: {
substring: {
type: "nGram",
min_gram: 3,
max_gram: 50
},
ssn_string: {
type: "nGram",
min_gram: 9,
max_gram: 9
},
},
analyzer: {
index_ngram_analyzer: {
type: "custom",
tokenizer: "standard",
filter: ["lowercase", "substring"]
},
search_ngram_analyzer: {
type: "custom",
tokenizer: "standard",
filter: ["lowercase", "substring"]
},
ssn_ngram_analyzer: {
type: "custom",
tokenizer: "standard",
filter: ["ssn_string"]
},
}
}
mapping do
[:first_name, :last_name].each do |attribute|
indexes attribute, type: 'string',
index_analyzer: 'index_ngram_analyzer',
search_analyzer: 'search_ngram_analyzer'
end
indexes :ssn, type: 'string', index: 'not_analyzed'
end
Мой поиск выглядит следующим образом:
query: {
multi_match: {
fields: ["first_name", "last_name", "ssn"],
query: query,
type: "cross_fields",
operator: "and"
}
}
Так это работает:
Account.search("erik").records.to_a
и даже (для Эрика Смита):
Account.search("erik smi").records.to_a
и ПЛА:
Account.search("111112222").records.to_a
но не:
Account.search("erik 111112222").records.to_a
Любая идея, если я индексирование или запрашивая неправильно?
Благодарим за помощь!
Большое вам спасибо за ваш ответ - ничего себе. Я это попробую. Я думаю, это тоже сработало: как только я вынул «search_analyzer:« search_ngram_analyzer », он работает (до сих пор с тестами, которые я сделал). –