我在使用ElasticSearch时遇到了一些问题。
结构:用'→'分隔的嵌套关键字。示例:→Animal→Mammal→Dog
。可以有任意数量的嵌套级别。
我需要将analyzer/tokenizer/filter
设置为仅使用deepest关键字进行 ES 搜索。
例如,必须将→Animal→Mammal→Dog
分析为狗,→Animal
- 作为动物,→Animal→Mammal
- 作为哺乳动物。
我尝试了PathHierarchy
标记器,但它并不是我需要的。 PathHierarchy tokenizer分裂→Animal→Mammal→Dog to→Animal,→Animal→Mammal,→Animal→Mammal→Dog。
答案 0 :(得分:0)
您可以使用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,并确保您的文档映射包含使用您的分析器的字段。