如何设置ElasticSearch analyzer / tokenizer / filter以获取最后一个子字符串作为标记?

时间:2017-09-26 12:52:24

标签: elasticsearch analyzer

我在使用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。

1 个答案:

答案 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,并确保您的文档映射包含使用您的分析器的字段。