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

时间:2017-12-09 13:17:34

标签: elasticsearch n-gram trigram

是否有可能告诉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%'
    }
  }
}

问题:

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

  2. 当有几十克/条时,长字符串的这种查询会有什么表现?是否会使用一些智能优化,例如搜索类似文档(请参阅more_like_this) - 当它尝试使用的不是所有条款而只使用最高tf-idf的条款时?

  3. 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' ]
            }
          }
        }
      }
    }
    

2 个答案:

答案 0 :(得分:1)

也许您已经找到了原因,但是ali12345alice wang匹配,因为分析器在搜索时与用于索引时间的分析器相同,包括ngram。

如此:

在索引时间:对于文本alice wang,将创建这些术语[alilicice,...]

在搜索时:对于文本ali12345,将创建这些词条[alili1i12,...]

如我们所见,我们与术语ali匹配

为避免此问题,ElasticSearch提供了为搜索时间指定其他分析器的可能性。在字段name的映射中,您可以添加另一个属性search_analyzer,该属性通常与主analyzer非常相似,但是没有ngram令牌过滤器。这样可以防止在搜索分析期间生成[alili1i12],从而导致与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%必须匹配”