2012-06-21 40 views
3

在使用Lucene的過程中,我有點失望。我沒有看到或理解我應該如何爲任何已經可以直接索引的Lucene分析器提供內容。或者我應該如何開始創建我自己的分析器...Lucene,索引已經/外部標記化的標記並定義了自己的分析過程

例如,如果我有一個List<MyCustomToken>,它已經包含許多標記(實際上還有更多關於大寫等信息,我還想索引爲每個MyCustomToken上的功能)

如果我理解我讀過的東西,我需要子類化分析器,它將調用我自己的標記器子類TokenStream,在那裏我只需要提供一個public final boolean incrementToken()來完成這項工作插入TermAttribute @位置。

順便說一句,這裏就是我感到困惑=>這是的TokenStream中java.io.Reader的一個子類,並且因此僅能夠分析像一個文件,一個串中的流對象的...

如何能我繼續有我自己的文檔分析器,將消耗我的列表,而不是這個流媒體的?

看起來像整個Lucene API是建立在它首先開始分析一個非常低的水平是「角色」角度的想法上的,而我需要稍後開始使用它/插入已經標記的單詞或甚至表達式(單詞組)。

Lucene的用法的典型樣本都是這樣(從here拍攝):

StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35); 

// 1. create the index 
Directory index = new RAMDirectory(); 

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer); 

IndexWriter w = new IndexWriter(index, config); 
addDoc(w, "Lucene in Action"); // BUT here i would like to have a addDoc(w, MyOwnObject) 
addDoc(w, "Lucene for Dummies"); 
addDoc(w, "Managing Gigabytes"); 
addDoc(w, "The Art of Computer Science"); 
w.close(); 

[...] 

private static void addDoc(IndexWriter w, String value) throws IOException { 
    Document doc = new Document(); 
    doc.add(new Field("title", value, Field.Store.YES, Field.Index.ANALYZED)); 
    // SO that i can add here my own analysis base on many fields, with them built from a walk through List or complex structures... 
    w.addDocument(doc); 
} 


PS:(我的Java/Lucene的知識仍然很差,所以我可能錯過了一些東西明顯關於讀者< =>列表模式?)

這個問題幾乎是和我一樣on lucene list

編輯: @Jilles van Gurp =>是的,你是對的,這是我想到的另一個問題,但首先希望找到一個更優雅的解決方案。所以,如果繼續下去,我仍然可以做一些序列化,將這個序列化的字符串作爲文檔提供給我自己的分析器,以及自己的標記器,然後反序列化並重新做一些基本的標記化(實際上,只是遍歷已經完成的標記...)順便說一句,它會添加一些更慢,更愚蠢的額外步驟,我本想避免...

關於這部分=>有人有最近的一個樣本(Lucene> 3.6)自定義標記提供所有Lucene索引必需的基礎數據?我看過這樣的發光令牌:

 posIncrement.setPositionIncrement(increment); 
     char[] asCharArray = myAlreadyTokenizedString.toCharArray(); // here is my workaround 
     termAttribute.copyBuffer(asCharArray, 0, asCharArray.length); 
     //termAttribute.setTermBuffer(kept); 
     position++; 

了爲什麼我在這裏的一部分,它是我用,即記號化我的文字一些外部庫,做兼職的詞性一些註釋,其他分析(可能會考慮表達識別或命名實體識別,還可能包括一些關於大寫等特殊功能),我想跟蹤一個Lucene索引(我感興趣的實際部分是索引查詢,而不是分析的第一步,它幾乎來自Lucene庫僅Tokenising爲我已閱讀)。

(另外,我不認爲我可以從這些以前/早期步驟做一些更聰明,因爲我用許多不同的工具,不是所有的人都是Java或可以很容易地纏到Java)

,所以我想這有點令人傷心,因爲與文本打交道的Lucene對於單詞/標記(字符序列)是如此有界,而文本不僅僅是單個/孤立詞/令牌的並置...

回答

0

Lucene被設計爲索引文本,通常以字符序列的形式出現。因此,分析器框架就是分析文本並將其轉化爲令牌。

現在你不知何故結束了一個令牌列表,現在想餵它到lucene。這不太適合用於優化的用例lucene。最簡單的方法就是將列表簡單地表示爲一個字符串(例如逗號分隔),然後實現一個簡單的TokenStream,它可以將您選擇的任何分隔符分開。

現在真正的問題是,你是如何以列表結束的,以及你是否可以在那裏做更聰明的事情,但是我缺乏對用例的洞察力來理解它。

+0

謝謝你的回覆,看到更多的見解... – user1340802

1

而不是嘗試實施類似addDoc(w, MyOwnObject)的東西,你可以在你的MyOwnObject類中使用MyOwnObject.toString()並實施@Override String toString()

+0

好吧,我不認爲它會適合,因爲我會*仍然*必須寫* MyOnwTokenizer然後分裂回MyOwnObject.toString() '並從那裏向Lucene提供爆炸的MyTokens。這實際上是用我已經/外部標記並註釋的標記/數據提供給Lucene的事實。 – user1340802