我在看 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 这样的结果,为什么要在第一名?
请举例说明不同分析器的用处。
最佳答案
您通常在索引时和查询时都有类似的分析链。相似并不意味着完全相同,但通常索引文档的方式反射(reflect)了查询它们的方式。
ngrams 示例非常适合,因为它是您在索引和查询时使用不同分析器的主要原因之一。
对于部分匹配,您使用边缘 ngram 进行索引,因此“elasticsearch”变为(使用 mingram 3 和 maxgram 20):
“ela”、“elas”、“elast”、“elasti”、“elastic”、“elastics”、“elasticse”、“elasticsea”、“elasticsear”、“eleasticsearch”和“elasticsearch”
现在让我们查询创建的字段。如果我们查询术语“elastic”,就会有一个匹配项,我们会得到预期的结果。给定我们索引的内容,我们基本上将上面所说的部分匹配变成了完全匹配。也不需要将 ngrams 应用于查询。如果我们这样做,我们将查询以下所有条款:
“ela”、“elas”、“elast”、“elasti”和“elastic”
这会使查询方式更加复杂,并且还会导致得到奇怪的结果。假设您在同一字段的另一个文档中为术语“elapsed”编制索引。您将拥有以下 ngram:
"ela", "elap", "elaps", "elapse", "elapsed"
如果您搜索“elastic”并使用 ngram 进行查询,则术语“ela”也会与第二个文档匹配,因此即使没有术语包含整个“elastic”,您也会将其与第一个文档一起返回"您正在寻找的术语。
我建议您查看 analyze api尝试使用不同的分析器及其不同的结果。
关于search - Elasticsearch - search_analyzer 与 index_analyzer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923480/