Ale*_*hin 7 n-gram elasticsearch trigram
是否有可能告诉ElasticSearch使用所有克的"最佳匹配"而不是使用克作为同义词?
默认情况下,ElasticSearch使用gram作为同义词并返回不匹配的文档.最好以示例的方式展示,假设我们在索引中有两个人:
alice wang
sarah kerry
Run Code Online (Sandbox Code Playgroud)
我们搜索ali12345
:
{
query: {
bool: {
should: {
match: { name: 'ali12345' }
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它会回来的alice wang
.
这怎么可能?因为默认情况下ElasticSearch使用gram作为同义词,因此,即使只有一克匹配 - 文档也会匹配.
如果您检查查询,您会看到它将克视为同义词
...
"explanation": {
"value": 5.274891,
"description": "weight(Synonym(name: ali name:li1 name:i12 name:123 name:234 name:345 ) in 0) [PerFieldSimilarity], result of:",
...
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能告诉它使用"最佳匹配"查询,以达到如下目的:
{
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%'
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
当然可以手动生成此查询,但是您必须手动应用ngram解析和其他分析器管道.所以我想知道它是否可以由ElasticSearch完成?
当有几十克/条时,长字符串的这种查询的性能是什么?是否会使用一些智能优化,例如搜索类似文档(请参阅参考资料more_like_this
) - 当它尝试使用的不是所有条款而只使用最高的条款时tf-idf
?
PS
索引配置
{
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' ]
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 1
我知道这个问题很老了,但以防万一......
您应该能够在三元组查询中使用minimumShouldMatch子句来指定一条记录必须匹配多少个三元组才能被视为命中。您可以使用类似“3<75%”的内容,这意味着“如果有 3 个或更少的三元组,则 100% 必须匹配。如果有 4 个或更多三元组,则必须 75% 匹配”