gpt4 book ai didi

ElasticSearch 使用 ngram 术语的 "best match"而不是 "synonym"?

转载 作者:行者123 更新时间:2023-11-29 02:47:42 33 4
gpt4 key购买 nike

是否可以告诉 ElasticSearch 使用所有克的“最佳匹配”而不是使用克作为同义词?

默认情况下,ElasticSearch 使用 grams 作为同义词并返回匹配不佳的文档。最好用例子来展示,假设我们在索引中有两个人:

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%'
}
}
}

问题:

  1. 当然可以手动生成此查询,但您必须手动应用 ngram 解析和其他分析器管道。所以我想知道它是否可以通过 ElasticSearch 完成

  2. 当有数十克/术语时,这种查询长字符串的性能如何?它是否会使用一些智能优化,例如搜索类似文档(请参阅 more_like_this)- 当它尝试不使用所有术语而仅使用具有最高 tf-idf 的术语时?

附言

索引配置

{
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' ]
}
}
}
}
}

最佳答案

我知道这个问题很老,但以防万一......

您应该能够在 trigram 查询中使用 minimumShouldMatch 子句来指定一条记录必须匹配多少个 trigram 才能被视为命中。你可以使用类似“3<75%”的东西,这意味着“如果有 3 个或更少的八卦,那么 100% 必须匹配。如果有 4 个或更多的八卦,那么 75% 必须匹配”

关于ElasticSearch 使用 ngram 术语的 "best match"而不是 "synonym"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47728984/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com