2013-04-10 217 views
34

我在看 http://euphonious-intuition.com/2012/08/more-complicated-mapping-in-elasticsearch/ 它解释ElasticSearch分析器。弹性搜索search_analyzer与index_analyzer

我不明白关于拥有不同的搜索和索引分析器的部分。 自定义映射的第二个例子是这样的:
- >指数分析仪是一种edgeNgram
- >搜索分析仪:

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

如果我们想查询“种族”有来无回类似的结果* ra * pport和* rac * ial由于edgeNgram,为什么使用edgeNgram首先将其索引?

请用不同的分析仪有用的例子来解释。

+1

我可否知道我的回答是否让你的事情更清楚? – javanna 2013-04-11 19:56:02

+0

顶部的链接被破坏 – Artem 2015-06-01 05:29:41

回答

73

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

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

部分匹配您索引与边缘n元语法,从而使 “elasticsearch” 变为(与mingram 3和maxgram 20):

“ELA”, “ELAS”, “ELAST”, “elasti”,“弹性“,”松紧带“,”松紧带“,”松紧带“,”松紧带“,”eleasticsearc“和”elasticsearch“

现在让我们查询创建的字段。如果我们查询“弹性”这个词,就会找到一个匹配结果,我们可以得到预期的结果。根据我们编制的索引,我们基本上已经成为我们称之为部分匹配完全匹配的东西。没有必要将ngram应用于查询。如果我们这样做,我们将查询以下条款:

“ELA”,“ELAS”,“ELAST”,“elasti”和“弹性”

这将使查询方式更加复杂,会导致以获得奇怪的结果。假设您在另一个文档中的同一字段中指定了“elapsed”一词。您将有以下的n-gram:

“ELA”,“ELAP”,“elaps”,“流逝”,“流逝”

如果你搜索“弹性”,使n元语法的查询,术语“ELA”将这个第二个文件太匹配,因此你要做的头文件找回来一起,即使没有条款包含你要找的整个“弹性”一词。

我建议你去看看在analyze api与不同分析和他们不同的结果绕绕玩。

+1

谢谢,答案确实让事情更清楚:) – 2013-06-04 08:14:07

+1

[This](https://github.com/polyfractal/elasticsearch-inquisitor)elasticsearch插件帮助了解各种分析器的工作原理。 – gsk 2015-01-07 13:37:50

+0

@gsk非常感谢很多人提及上面的插件,这对我的数据在elasticsearch中的索引方式非常有帮助。 – 2016-08-03 14:08:46

7

要引用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_index的值级,默认为
  • 分析仪名为default在节点级,默认为
  • 标准分析器

而且在搜索时:

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