弹性搜索 - search_analyzer vs index_analyzer

Pav*_*utt 37 search analyzer elasticsearch

我正在查看 http://euphonious-intuition.com/2012/08/more-complicated-mapping-in-elasticsearch/ ,它解释了ElasticSearch分析器.

我不理解有关使用不同搜索和索引分析器的部分.自定义映射的第二个例子如下:
- >索引分析器是edgeNgram
- >搜索分析器是:

"full_name":{
    "filter":[
        "standard",
        "lowercase",
        "asciifolding"
    ],
    "type":"custom",
    "tokenizer":"standard"
}
Run Code Online (Sandbox Code Playgroud)

如果我们希望查询"Race"不返回像*ra*pport和*rac*ial这样的结果,因为edgeNgram,为什么首先用edgeNgram索引它?

请解释一下不同分析仪有用的示例.

jav*_*nna 81

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

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

对于部分匹配,您使用edge ngrams进行索引,以便"elasticsearch"变为(使用mingram 3和maxgram 20):

"ela","elas","elast","elasti","elastic","elastics","elasticse","elasticsea","elasticsear","eleasticsearc"和"elasticsearch"

我们现在查询创建的字段.如果我们查询术语"弹性",则匹配并返回预期结果.鉴于我们索引的内容,我们基本上已成为我们所谓的上述部分匹配的精确匹配.也没有必要将ngrams应用于查询.如果我们这样做,我们将查询以下所有条款:

"ela","elas","elast","elasti"和"elastic"

这会使查询方式变得更加复杂,并导致获得奇怪的结果.假设您在另一个文档(同一个字段)中索引术语"已过去".你会得到以下ngram:

"ela","elap","elaps","elapse","elapsed"

如果您搜索"弹性"并对查询生成ngrams,则术语"ela"也会与第二个文档匹配,因此您可以将其与第一个文档一起取回,即使没有术语包含整个"弹性"术语您正在寻找.

我建议你看一下使用不同的分析仪和不同的结果来分析api.


Asi*_*ov4 8

要参考有关索引与搜索分析器的官方文档:

有时,在索引和搜索时使用不同的分析器是有意义的.例如,在索引时我们可能想要对同义词进行索引,例如,对于每次快速出现,我们也快速,快速和快速地索引.但在搜索时,我们不需要搜索所有这些同义词.相反,我们可以查找用户输入的单个单词,无论是快速,快速,快速还是快速.

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

考虑到这些额外的参数,索引时的完整序列看起来像这样:

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

在搜索时间:

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