Elasticsearch-搜索分析器与索引分析器

Posted

技术标签:

【中文标题】Elasticsearch-搜索分析器与索引分析器【英文标题】:Elastic search- search_analyzer vs index_analyzer 【发布时间】:2013-04-02 03:42:36 【问题描述】:

我在看 http://euphonious-intuition.com/2012/08/more-complicated-mapping-in-elasticsearch/ 其中解释了 ElasticSearch 分析器。

我不明白关于使用不同的搜索和索引分析器的部分。 自定义映射的第二个示例如下所示: ->索引分析器是一个edgeNgram ->搜索分析器是:

"full_name":
    "filter":[
        "standard",
        "lowercase",
        "asciifolding"
    ],
    "type":"custom",
    "tokenizer":"standard"

如果我们希望查询“Race”由于 edgeNgram 而不会返回像 *ra*pport 和 *rac*ial 这样的结果,为什么要在第一名?

请举例说明不同的分析器是有用的。

【问题讨论】:

请问我的回答是否让您更清楚? 顶部的链接已损坏 web.archive.org/web/20120828155746if_/http://… 【参考方案1】:

您通常在索引时和查询时都有相似的分析链。相似并不意味着完全相同,但通常您索引文档的方式反映了您查询它们的方式。

ngrams 示例非常适合,因为它是您在索引和查询时使用不同分析器的主要原因之一。

对于部分匹配,您使用边缘 ngram 进行索引,因此“elasticsearch”变为(使用 mingram 3 和 maxgram 20):

“ela”、“elas”、“elast”、“elasti”、“elastic”、“elastics”、“elasticse”、“elasticsea”、“elasticsear”、“elelasticsearc”和“elasticsearch”

现在让我们查询创建的字段。如果我们查询“弹性”一词,就会有一个匹配项,我们会得到预期的结果。考虑到我们索引的内容,我们基本上使我们在上面所说的部分匹配成为完全匹配。也不需要将 ngrams 应用于查询。如果我们这样做,我们将查询以下所有术语:

“ela”、“elas”、“elast”、“elasti”和“elastic”

这会使查询方式更加复杂,也会导致得到奇怪的结果。假设您在另一个文档的同一字段中索引术语“elapsed”。您将拥有以下 ngram:

“ela”、“elap”、“elaps”、“elapse”、“elapsed”

如果您搜索“elastic”并对查询进行 ngram,则术语“ela”也将匹配第二个文档,因此您会将它与第一个文档一起重新获取,即使没有任何术语包含整个“elastic” " 您正在寻找的术语。

我建议您查看analyze api 以尝试使用不同的分析仪及其不同的结果。

【讨论】:

This elasticsearch 插件有助于了解各种分析器的工作原理。 @gsk 非常感谢,非常感谢您提到上述插件,这对于查看我的数据如何在 elasticsearch 中建立索引非常有帮助。 @javanna 很好地解释了兄弟,非常感谢您的回答。 @javanna 正是我要找的东西。 GBU【参考方案2】:

参考the official documentation about index vs search analyzers:

有时,在索引和索引处使用不同的分析器是有意义的 搜索时间。例如,在索引时我们可能想要索引 同义词,例如对于每次出现的 quick 我们也索引 fast, rapid 并且迅速。但是在搜索时,我们不需要搜索所有 这些同义词。相反,我们可以只查找 用户已进入,无论是快速、快速、快速还是快速。

为了实现这种区别,Elasticsearch 还支持 index_analyzer 和 search_analyzer 参数,以及名为的分析器 default_index 和 default_search。

考虑到这些额外的参数,索引处的完整序列 时间真的是这样的:

在字段映射中定义的 index_analyzer,否则 字段映射中定义的分析器,否则 在文档的 _analyzer 字段中定义的分析器,否则 类型的默认 index_analyzer,默认为 类型的默认分析器,默认为 索引设置中名为 default_index 的分析器,默认为 索引设置中名为default的分析器,默认为 在节点级别名为 default_index 的分析器,默认为 在节点级别命名为默认的分析器,默认为 标准分析仪

在搜索时:

在查询本身中定义的分析器,否则 在字段映射中定义的 search_analyzer,否则 字段映射中定义的分析器,否则 类型的默认search_analyzer,默认为 类型的默认分析器,默认为 在索引设置中名为 default_search 的分析器,默认为 索引设置中名为default的分析器,默认为 在节点级别名为 default_search 的分析器,默认为 在节点级别命名为默认的分析器,默认为 标准分析仪

【讨论】:

以上是关于Elasticsearch-搜索分析器与索引分析器的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch搜索功能的实现--搜索引擎为什么选ES

Elasticsearch系列---常见搜索方式与聚合分析

Elasticsearch-基础介绍及索引原理分析

elasticSearch精确索引和全文索引

Elasticsearch搜索中文分词优化

Elasticsearch-基础介绍及索引原理分析