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

标签 elasticsearch n-gram trigram

是否可以告诉 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/

相关文章:

node.js - 谷歌 Ngram 排序?

python - 在Python中使用sklearn计算变量n-grams的TF-IDF

Django 三元组 : create gin index and search suggested words in Django

postgresql - 同时使用 trigram 和 ILIKE

java - 弹性搜寻和Y10k(超过4位数字的年份)

r - 错误 : Problem with `filter()` input `..1`

elasticsearch - mysql到Elasticsearch:使用选定字段进行分组和排序

python - sqlalchemy 中的三元组距离操作

elasticsearch - Elastic Search 为单个搜索设置字段权重

elasticsearch - Elasticsearch 得分基本长度特征