我在看 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一起索引第一名?
请举例说明不同的分析仪是否有用。
答案 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,默认为
- 标准分析仪