能否告诉ElasticSearch使用所有字元的“最佳匹配”而非使用字元作为同义词?
默认情况下,ElasticSearch使用字元作为同义词,并返回匹配不良的文档。最好用例子来说明,假设我们在索引中有两个人:
alice wang
sarah kerry
我们正在搜索
ali12345
:{
query: {
bool: {
should: {
match: { name: 'ali12345' }
}
}
}
}
它会返回alice wang
,这是怎么做到的呢?因为ElasticSearch默认使用语法分词作为同义词,所以即使只有一个语法分词匹配上了,文档也可以被匹配。
如果你检查查询语句,你会发现它把语法分词视为同义词。
...
"explanation": {
"value": 5.274891,
"description": "weight(Synonym(name: ali name:li1 name:i12 name:123 name:234 name:345 ) in 0) [PerFieldSimilarity], result of:",
...
我想知道是否可以告诉它使用“最佳匹配”查询,以实现类似以下的效果:
{
query: {
bool: {
should: [
{ term: { body: 'ali' }},
{ term: { body: 'li1' }},
{ term: { body: 'i12' }},
{ term: { body: '123' }},
{ term: { body: '234' }},
{ term: { body: '345' }},
],
minimum_should_match: '75%'
}
}
}
问题:
当然可以手动生成此查询,但是您需要手动应用ngram解析和其他分析器管道。因此,我想知道是否可以通过ElasticSearch完成此操作?
对于长字符串的这种查询,在有数十个克隆/术语时,性能如何?它是否使用一些智能优化,例如搜索类似文档(请参阅
more_like_this
)- 当它尝试仅使用具有最高tf-idf
值的术语而不是所有术语?
P.S.
索引配置
{
mappings: {
object: {
properties: {
name: {
type: 'text',
analyzer: 'trigram_analyzer'
}
}
}
},
settings: {
analysis: {
filter: {
trigram_filter: { type: 'ngram', min_gram: 3, max_gram: 3 }
},
analyzer: {
trigram_analyzer: {
type: 'custom',
tokenizer: 'keyword',
filter: [ 'trigram_filter' ]
}
}
}
}
}