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