2015-02-08 55 views
2

我正在使用elasticsearch版本1.2.1。 我有,我想創建一個自定義標記生成器將打破由它們的長度達令牌到一定的最小長度的用例。例如,假設最小長度爲4,標記「abcdefghij」將被拆分爲: 「abcd efgh ij」。elasticsearch自定義標記器 - 按長度分割標記

我想知道如果我能實現這個邏輯,而不需要編寫一個自定義Lucene的tokenizer類的?

在此先感謝。

+0

這和你提供的例子有些不同,但[NGram Tokenizer](http://www.elasticsearch.org/guide/en/) elasticsearch/reference/current/analysis-ngram-tokenizer.html)可能值得研究。 – femtoRgon 2015-02-08 20:32:03

回答

1

對於您的要求,如果你不能使用pattern tokenizer,那麼你就需要自己編寫了一個自定義Lucene的tokenizer類做到這一點。你可以爲它創建一個自定義的Elasticsearch插件。有關如何爲自定義分析器創建Elasticsearch插件的示例,可以參考this

+0

我想跟隨你的建議和使用模式標記,但我不知道這個功能可以實現。我嘗試的是以下模式:「([。] {0,5})」,但它似乎打破了字符的標記(可能是因爲貪婪的正則表達式)。 – ybensimhon 2015-02-09 09:29:37

+0

根據文檔,不要認爲模式標記器適用於此處:「重要提示:正則表達式應匹配標記分隔符,而不是標記本身。」但在我的情況下,我沒有真正的分離者。 – ybensimhon 2015-02-09 09:57:53

+0

我也懷疑過。看起來像用定製分析器編寫Elasticsearch插件是唯一的選擇。 – bittusarkar 2015-02-09 11:03:56

0

的模式標記生成器支持參數"group"

它有一個默認的「1」,這意味着用於分裂模式,這是你看到了什麼。

但是,通過在您的模式中定義組> = 0並設置組參數,即可完成!例如。下面將把輸入分成4個字符的標記:

PUT my_index 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my_analyzer": { 
      "tokenizer": "my_tokenizer" 
     } 
     }, 
     "tokenizer": { 
     "my_tokenizer": { 
      "type": "pattern", 
      "pattern": "(.{4})", 
      "group": "1" 
     } 
     } 
    } 
    } 
} 

POST my_index/_analyze 
{ 
    "analyzer": "my_analyzer", 
    "text": "comma,separated,values" 
}