search - Elasticsearch - search_analyzer 与 index_analyzer

标签 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 这样的结果,为什么要在第一名?

请举例说明不同分析器的用处。

最佳答案

您通常在索引时和查询时都有类似的分析链。相似并不意味着完全相同,但通常索引文档的方式反射(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/

相关文章:

ios - 应用程序在搜索(过滤)NSDictionary 时崩溃

ios - 如何将搜索栏添加到 JSQMessagesViewController

Java,在二进制文件输入中搜索 long,8 字节对齐,大端

c# - Roslyn 查找对字段所做的所有分配

python - 如何搜索和替换文本前有空格的文本?

elasticsearch - 按百分位数过滤

elasticsearch - 如何在Elasticsearch中指定default-mapping.json

indexing - 在 Elasticsearch 中删除别名和索引

java - Apache Lucene中 "order of applying filters"背后的逻辑是什么

hibernate-search - 在自定义 FieldBridge 中使用分析器