【问题标题】:How do I set ElasticSearch analyzer/tokenizer/filter to get last substring as a token?如何设置 ElasticSearch 分析器/标记器/过滤器以获取最后一个子字符串作为标记?
【发布时间】:2017-09-29 00:51:00
【问题描述】:

我在使用 ElasticSearch 时遇到了一些问题。

结构:以“→”分隔的嵌套关键字。示例:→Animal→Mammal→Dog。可以有任意数量的嵌套级别。

我需要设置analyzer/tokenizer/filter 以使ES 仅按最深的关键字进行搜索。 例如,→Animal→Mammal→Dog 必须被分析为狗,→Animal - 作为动物,→Animal→Mammal - 作为哺乳动物。

我尝试了PathHierarchy 标记器,但这并不是我所需要的。 PathHierarchy 分词器正在分裂 →Animal→Mammal→Dog 到 →Animal,→Animal→Mammal,→Animal→Mammal→Dog。

【问题讨论】:

    标签: elasticsearch analyzer


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 2023-03-20
      • 2015-07-18
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多