如何与"char_filter"一起执行"小写过滤器"?

dan*_*dan 5 elasticsearch

据我在ES文档中读到:

  1. "字符过滤器用于在字符串被标记化之前"整理"它."
  2. "在标记化之后,生成的标记流将通过任何指定的标记过滤器"

(来源:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/custom-analyzers.html)

从这两个陈述中,我了解到执行了以下步骤:

  1. char_filter;
  2. 符号化;
  3. 过滤.

问题:

我可能有一个char_filter一次转多个字母.

示例:ph - > f.

但是,"PH"不会变成"f",因为"PH"不是映射的一部分.

因此,对"philipp"的分析检索"filipp",而"Philipp"检索"philipp".

使用大写和小写(为了在两种情况下实现相同的结果),char_filter中的映射数将是(字符数)².

示例:ph - > f; Ph - > F; pH - > f; PH - > F.

如果我只有4个映射,我就不会有问题,但如果我需要更多的x²映射,char_filter往往会变得很乱.

索引示例:

{
    "settings" : {
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "default_index" : {
                        "type" : "custom",
                        "tokenizer" : "whitespace",
                        "filter" : [
                            "lowercase"
                        ],
                        "char_filter" : [
                            "misc_simplifications"
                        ]
                    }
                },
                "char_filter" : {
                    "misc_simplifications" : {
                        "type" : "mapping",
                        "mappings" : [
                            "ph=>f","Ph=>F","pH=>f","PH=>F"
                        ]
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

哲学问题:

我明白我可能想要同等对待"ph"和"Ph",但"pH"可能意味着完全不同的东西.但有没有办法在char_filter阶段之前将字符转换为小写?是否有意义?

因为这个大的映射让我觉得我做错了什么,或者我能找到一个更简单(更优雅)的解决方案.

Oll*_*ank 7

您的步骤顺序是正确的:

  1. 字符过滤器
  2. 分词器
  3. 令牌过滤器

然而,CharFilter 的主要目的是清理数据以使标记化更容易。例如,通过删除 XML 标签或用空格字符替换分隔符。

所以 - 我将misc_simplifications作为 TokenFilter 在小写过滤器之后应用。

{
"settings" : {
    "index" : {
        "analysis" : {
            "analyzer" : {
                "default_index" : {
                    "type" : "custom",
                    "tokenizer" : "whitespace",
                    "filter" : [
                        "lowercase",
                        "misc_simplifications"
                    ]
                }
            },
            "filter" : {
                "misc_simplifications" : {
                    "type" : "pattern_replace",
                    "pattern": "ph",
                    "replacement":"f"
                }
            }
        }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

注意我使用模式替换而不是映射。您还可以修改正则表达式以仅替换标记开头的“ph”。

另外 - 你的映射看起来像是语音替换。我不确定您的要求,但看起来语音标记过滤器可能会帮助您。