我想构建一个Elasticsearch查询,我查询多个字段,所有字段必须出现在至少一个字段中。我对multi_match
使用cross_field
查询。 Elascticsearch documentation
例如:
我的搜索结束了以下用户对象:
{ firstname: '...', lastname: '...', email: '...' }
我们有2位用户:
{
firstname: 'Delphine',
lastname: 'Dorémi',
email: 'tyrell@interne.fr'
}
{
firstname: 'Philippe',
lastname: 'Mifasol',
email: 'roybatty@interne.com'
}
查询:“Rachel Mifasol”
我想要的结果:没有结果(因为“Philippe”用户对象中缺少“Rachel”)
Elasticsearch实际给我的结果:“Philippe”(我想因为“Mifasol”匹配......)
这是我的Elasticsearch查询:
query: {
multi_match: {
query: 'Rachel Mifasol',
type: 'cross_fields',
fields: ['firstname', 'lastname', 'emails'],
operator: 'and'
}
}
这是我的分析器和映射:
settings: {
analysis: {
filter: {
nGram_filter: {
type: 'nGram',
min_gram: 2,
max_gram: 20,
token_chars: [
'letter',
'digit',
'punctuation',
'symbol'
]
}
},
analyzer: {
nGram_analyzer: {
type: 'custom',
tokenizer: 'whitespace',
filter: [
'lowercase',
'asciifolding',
'nGram_filter'
]
},
whitespace_analyzer: {
type: 'custom',
tokenizer: 'whitespace',
filter: [
'lowercase',
'asciifolding'
]
}
}
}
},
mappings: {
users: {
properties: {
firstname: {
type: 'string',
index_analyzer: 'nGram_analyzer',
search_analyzer: 'whitespace_analyzer',
fields: {
sort: {
type: 'string',
index: 'not_analyzed'
}
}
},
lastname: {
type: 'string',
index_analyzer: 'nGram_analyzer',
search_analyzer: 'whitespace_analyzer'
},
emails: {
type: 'string',
index_analyzer: 'nGram_analyzer',
search_analyzer: 'whitespace_analyzer'
}
}
}
}