ElasticSearch使用ngram术语的"最佳匹配"而不是"同义词"?

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)

问题:

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

  2. 当有几十克/条时,长字符串的这种查询的性能是什么?是否会使用一些智能优化,例如搜索类似文档(请参阅参考资料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% 匹配”