是否有可能告诉ElasticSearch使用所有克的“最佳匹配”而不是使用克作为同义词?
默认情况下,ElasticSearch使用gram作为同义词并返回不匹配的文档。最好以示例的方式展示,假设我们在索引中有两个人:
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' ]
}
}
}
}
}
答案 0 :(得分:1)
也许您已经找到了原因,但是ali12345
与alice wang
匹配,因为分析器在搜索时与用于索引时间的分析器相同,包括ngram。
如此:
在索引时间:对于文本alice wang
,将创建这些术语[ali
,lic
,ice
,...]
在搜索时:对于文本ali12345
,将创建这些词条[ali
,li1
,i12
,...]
如我们所见,我们与术语ali
匹配
为避免此问题,ElasticSearch提供了为搜索时间指定其他分析器的可能性。在字段name
的映射中,您可以添加另一个属性search_analyzer
,该属性通常与主analyzer
非常相似,但是没有ngram令牌过滤器。这样可以防止在搜索分析期间生成[ali
,li1
,i12
],从而导致与alice wang
的0个匹配项
随时在此页面上查看更多详细信息和说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html
答案 1 :(得分:0)
我知道这个问题很旧,但是以防万一...
您应该能够在Trigram查询中使用minimumShouldMatch子句,以指定必须匹配多少个Trigram才能使记录被视为命中。您可以使用类似“ 3 <75%”的含义,这表示“如果存在3个或更少的三字母组,那么100%必须匹配。存在4个或更多的三字母组,那么75%必须匹配”