如何设置ElasticSearch分析器/标记器/过滤器以将最后一个子字符串作为标记?
问题描述:
我在使用ElasticSearch时遇到了一些问题。如何设置ElasticSearch分析器/标记器/过滤器以将最后一个子字符串作为标记?
结构:用'→'分隔的嵌套关键字。例如:→Animal→Mammal→Dog
。可能有任何数量的嵌套级别。
我需要的是设置analyzer/tokenizer/filter
使ES搜索只有最深的关键字。 例如→Animal→Mammal→Dog
必须分析为狗,→Animal
- 作为动物,→Animal→Mammal
- 作为哺乳动物。
我试过PathHierarchy
tokenizer,但它不是我所需要的。 PathHierarchy标记器正在分裂→动物→哺乳动物→狗→动物→动物→哺乳动物→动物→哺乳动物→狗。
答
您可以使用Pattern Tokenizer,它使用正则表达式来生成令牌。
我用这个正则表达式:^(?:.*→)(.+)$
测试它与_analyze端点,就像这样:
POST /_analyze
{
"tokenizer": {
"type": "pattern",
"pattern": "^(?:.*→)(.+)$",
"group": 1
},
"text": "→Animal→Mammal→Dog"
}
产生以下结果:
{
"tokens": [
{
"token": "Dog",
"start_offset": 15,
"end_offset": 18,
"type": "word",
"position": 0
}
]
}
它始终是值得重复那些写得很差的正则表达式会导致性能问题,所以请谨慎行事。我相信我写了一个表现良好的正则表达式,但我不保证。
如果您选择继续,您需要在索引设置中设置Custom Analyzer,并确保文档映射包含使用您的分析器的字段。