弹性搜索 - search_analyzer vs index_analyzer

时间:2013-04-10 10:37:27

标签: search elasticsearch analyzer

我在看 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的结果,为什么要将其与edgeNgram一起索引第一名?

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

2 个答案:

答案 0 :(得分:78)

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

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”也会与第二个文档匹配,因此您可以将其与第一个文档一起取回,即使没有任何术语包含整个“弹性” “你正在寻找的术语。

我建议你看看analyze api使用不同的分析仪及其不同的结果。

答案 1 :(得分:8)

引用the official documentation about index vs search analyzers

  

有时,在索引处使用不同的分析器是有意义的   搜索时间。例如,在索引时我们可能想要索引   同义词,例如对于每次快速发生我们也快速,快速地索引   而迅速。但在搜索时,我们不需要搜索所有内容   这些同义词。相反,我们可以只查找单词   用户已进入,快速,快速,快速或快速。

     

为了实现这种区分,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,默认为
  •   
  • 标准分析仪
  •