我在 Elasticsearch 中配置了一个名为 pipelineAnalyzer 的自定义分析器,该分析器旨在使用管道 (|) 字符作为分隔符来标记字符串,同时还应用小写转换、ASCII 折叠以及修剪标记开头和结尾的空格。但是,我遇到了意外的行为,分析器似乎还从标记中删除了句点 (.),这不是有意的。
这是我的管道分析器的配置:
{
"pipeAnalyzer": {
"type": "custom",
"tokenizer": "pattern",
"pattern": "\\|",
"filter": ["trim", "lowercase", "asciifolding"]
}
}
例如,在分析字符串
75207149.0.1_sb.research.com
时,我希望输出保留句点作为标记的一部分。相反,分析器以删除句点的方式分割字符串,生成诸如 75207149
、0
、1_sb
、research
和 com
等标记,而不是将整个字符串视为单个标记或者至少保留标记内的句点。
此行为令人费解,因为配置的模式标记生成器使用竖线 (|) 作为分隔符,并且没有任何迹象表明应删除句点或将其视为分隔符。
问题:
为什么我的 PipeAnalyzer 会从标记中删除句点,尽管标记生成器被配置为使用管道字符作为分隔符? 如何调整我的 pipelineAnalyzer 配置以确保在分析过程中不会从令牌中删除句点?
任何有关如何解决此问题的见解或建议将不胜感激。我使用的是 Elasticsearch 版本 7.17。
当我测试了您的分析器设置时,我注意到正如您所说,它将删除
dots
。这实际上有点奇怪!在另一个测试中,我首先从分析器主体中提取了分词器定义部分,以便它正常工作!
只需测试以下设置:
{
"settings": {
"analysis": {
"analyzer": {
"pipeAnalyzer": {
"tokenizer": "my_tokenizer",
"filter": ["trim", "lowercase", "asciifolding"]
}
},
"tokenizer": {
"my_tokenizer": {
"type": "pattern",
"pattern": "\\|"
}
}
}
}
}
我想知道为什么会发生这样的事情,尽管根据Elasticsearch的官方文档创建自定义分析器,
tokenizer
应该单独定义,并且只有你应该在那里使用它的最终名称。