我們的Account
模型具有first_name
,last_name
和ssn
(社會安全號碼)。部分匹配和完全匹配的多個字段的彈性搜索
我想在first_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
和SSN:
Account.search("111112222").records.to_a
但不是:
Account.search("erik 111112222").records.to_a
如果我索引或查詢不對任何想法?
謝謝你的幫助!
非常感謝你的回覆 - 哇。我會試試看。我認爲這也起到了作用:一旦我拿出search_analyzer:search_ngram_analyzer,它就起作用了(到目前爲止,我已經完成了測試)。 –