2017-09-26 53 views
1

我在使用ElasticSearch時遇到了一些問題。如何設置ElasticSearch分析器/標記器/過濾器以將最後一個子字符串作爲標記?

結構:用'→'分隔的嵌套關鍵字。例如:→Animal→Mammal→Dog。可能有任何數量的嵌套級別。

我需要的是設置analyzer/tokenizer/filter使ES搜索只有最深的關鍵字。 例如→Animal→Mammal→Dog必須分析爲狗,→Animal - 作爲動物,→Animal→Mammal - 作爲哺乳動物。

我試過PathHierarchy tokenizer,但它不是我所需要的。 PathHierarchy標記器正在分裂→動物→哺乳動物→狗→動物→動物→哺乳動物→動物→哺乳動物→狗。

回答

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,並確保文檔映射包含使用您的分析器的字段。