【问题标题】:Is there a performance difference between `ngram` filter and `ngram` tokenizer in ElasticsearchElasticsearch 中的“ngram”过滤器和“ngram”分词器之间是否存在性能差异
【发布时间】:2019-10-26 18:02:18
【问题描述】:

我都试过了,当我测试分析仪时,它们似乎产生了相同的结果

settings: {
    analysis: {
        filter: {
            ngram_filter: {
                type: "ngram",
                min_gram: 2,
                max_gram: 20
            }
        },
        tokenizer: {
            ngram_tokenizer: {
                type: "ngram",
                min_gram: 2,
                max_gram: 20
            }
        },
        analyzer: {
            index_ngram: {
                type: "custom",
                tokenizer: "keyword",
                filter: [ "ngram_filter", "lowercase" ]
            },
            index_ngram2: {
                type: "custom",
                tokenizer: "ngram_tokenizer",
                filter: [ "lowercase" ]
            },
        },
    }
}

我得到了同样的结果:

curl -X GET "localhost:9200/my_index/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "index_ngram", 
  "text":     "P&G 40-Bh"
}
'

curl -X GET "localhost:9200/my_index/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "index_ngram2", 
  "text":     "P&G 40-Bh"
}
'

我应该使用哪一个?有性能差异吗?看起来他们只是以不同的顺序执行操作,但我不确定哪个性能更高,或者哪个约定更好。

【问题讨论】:

标签: elasticsearch


【解决方案1】:

很难衡量性能差异,因为我自己还没有遇到过这种特殊情况,也没有尝试过针对大量不同的示例文本集。但是,我认为将此类分析器应用于大量文本并不是一个好主意,因此我认为这不是一个常见的用例。如果我不得不猜测,我猜性能非常相似。在每种情况下,分析过程都必须对相同长度的文本进行窗口化,并且正如您所指出的,它必须发出一组相同的标记(忽略报告的不同标记偏移量)。我用personal visualizer 也观察到了这一点。

我会使用更简单、更简洁的分析器描述(ngram 标记器),而不是使用迂回的关键字标记器(“noop”标记器)并定义额外的 ngram 过滤器。这在未来可能更容易证明、理解和解释。

相关参考资料:

【讨论】:

  • 感谢您的回答,也很酷的应用程序!我使用它的原因本质上是执行contains 类型查询。你知道更有效的方法吗?我使用它的领域通常很小,例如P&G 40-Bh。我需要包含来处理空格和特殊字符。
  • 您还可以使用正则表达式和通配符查询(仅与关键字 + 不带 ngram 的小写配对)。但是,我认为您拥有的 ngram 路由是更受欢迎/推荐的选项(在查询时也更高效)。这是一个类似的子字符串/包含问题,建议使用 ngram 路由来应对像你这样的挑战:stackoverflow.com/questions/6467067/….
  • 酷,谢谢,我看到了这个答案,这就是为什么我问这个问题的原因,因为这个答案stackoverflow.com/a/30077747/3866246ngram 作为过滤器与tokenizer,所以我都尝试了,但是后来不确定有什么区别。谢谢你的帮助!
  • 您遇到了一个特殊情况/场景,它们返回相同的结果。如果没有那个关键字标记器,在我认为您可能已经意识到的大多数其他情况下,这两者都非常出色。 qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch 详细讨论了它们分开时更常见的用法。
猜你喜欢
  • 1970-01-01
  • 2015-10-02
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2016-04-09
相关资源
最近更新 更多