2016-02-23 60 views
1

我正在編寫自定義Elasticsearch標記器。該文檔僅指定了一個構造函數,用於傳遞讀取器以獲取要被標記的字符串,以及一個用於生成標記的incrementToken()方法。我可以看到沒有配置標記器的選項的跡象。我看到引用了Lucene TokenizerFactories,它們似乎提供了一個配置選項,但沒有看到它們在任何Elasticsearch上下文中提及。我的標記器是基本Tokenizer類的普通擴展:如何配置/初始化自定義Elasticsearch標記器

public class LCCNTokenizer extends Tokenizer { 
    private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); 

    public LCCNTokenizer(Reader reader) { 
    } 

    @Override 
    public boolean incrementToken() throws IOException { 
     return false; 
    } 
} 

如何配置自定義Elasticsearch標記器?

+0

你可以展示一些關於如何擴展基本Tokenizer類的內容嗎? – Val

+0

不要猶豫,用這段代碼更新你的問題,它會更清晰。 – Val

回答

2

正確的做法是創建一個new ES Plugin。示例Java插件是available here

我會檢查標準分析插件是如何構建的,我們來看看例如Kuromoji analysis plugin。正如你所看到的,它通過註冊一個KuromojiTokenizerFactory來註冊自己的分詞器。

因此,您還需要爲您的標記器創建一個工廠,我們將其稱爲LCCNTokenizerFactory,您將在您的插件類中註冊,如上所述。

現在,這是「魔法」發生的地方。在你LCCNTokenizerFactory類,你就會有一個constructor,它看起來像這樣:

public LCCNTokenizerFactory(IndexSettings indexSettings, Environment env, String name, Settings settings) { 
    param1 = settings.getAsBoolean("param1", true); 
    param2 = settings.getAsString("param2", null); 
    param3 = settings.getAsDouble("param3", 0.0); 
} 

在此構造方法,你現在可以檢索你爲了配置你要創建標記生成器需要的任何自定義設置。

最後,您將覆蓋onCreate方法,以便使用之前在工廠構造函數中分析的自定義設置創建自己的標記器實例。

@Override 
public Tokenizer create() { 
    return new LCCNTokenizer(param1, param2, param3); 
} 

這不是一個完整的例子,但它應該讓你去。

+0

嘿,這是否有幫助或您是否需要更多信息? – Val

+1

這是一個開始,我很感激。我已經接受你的答案。真正的問題是Elasticsearch擴展機制沒有記錄(好吧,有一個頁面,但它自豪地宣稱它已經過時)。和你一樣,人們指出了不同版本的ES的例子,它看起來像擴展機制每5分鐘更改一次,所以它們都不適用於我的情況。我終於注意到,我的ES版本的下載包括該版本的插件,並且它們足夠接近我的行程。謝謝! –