與Lucene索引工作,我有一個標準的文檔格式,看起來是這樣的:Lucene的3.5自定義有效載荷
Name: John Doe Job: Plumber Hobby: Fishing
我的目標是一個有效載荷附加到將舉行工作領域有關管道的其他信息,例如維基百科鏈接到管道文章。我不想把有效載荷放在其他地方。最初,我找到了一個涵蓋我想要做的事情的例子,但它使用了Lucene 2.2,並沒有更新來反映令牌流api中的更改。 經過一番更多的研究,我想出了這個小怪物爲這個領域構建自定義標記流。
public static TokenStream tokenStream(final String fieldName, Reader reader, Analyzer analyzer, final String item) {
final TokenStream ts = analyzer.tokenStream(fieldName, reader) ;
TokenStream res = new TokenStream() {
CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
PayloadAttribute payAtt = addAttribute(PayloadAttribute.class);
public boolean incrementToken() throws IOException {
while(true) {
boolean hasNext = ts.incrementToken();
if(hasNext) {
termAtt.append("test");
payAtt.setPayload(new Payload(item.getBytes()));
}
return hasNext;
}
}
};
return res;
}
當我使用令牌流並遍歷所有結果時,在將它添加到字段之前,我看到它成功地將術語和有效負載配對。在流上調用reset()之後,我將它添加到文檔字段並索引文檔。但是,當我打印出文檔並使用Luke查看索引時,我的自定義標記流沒有完成剪切。字段名稱顯示正確,但來自標記流的術語值不會顯示,也不會顯示成功附加有效內容。
這使我2個問題。首先,我是否正確使用了令牌流,如果是的話,爲什麼它不會在我將其添加到域時進行標記?其次,如果我沒有正確使用流,是否需要編寫我自己的分析器。這個例子使用Lucene標準分析器拼湊在一起生成令牌流並寫入文檔。我希望儘可能避免編寫我自己的分析器,因爲我只希望將有效載荷附加到一個字段!
編輯:
調用代碼
TokenStream ts = tokenStream("field", new StringReader("value"), a, docValue);
CharTermAttribute cta = ts.getAttribute(CharTermAttribute.class);
PayloadAttribute payload = ts.getAttribute(PayloadAttribute.class);
while(ts.incrementToken()) {
System.out.println("Term = " + cta.toString());
System.out.println("Payload = " + new String(payload.getPayload().getData()));
}
ts.reset();
我會在今天晚些時候更新調用代碼的帖子。最終的數據可能不是超鏈接,我試圖讓這個概念起作用,並且超鏈接是我組裝示例時首先想到的第一件事。 :) – FloppyDisk 2012-02-10 18:24:59
您是否研究過我建議的解決方案,即實施'TokenFilter'?它肯定會使代碼更加清潔,並且是在Lucene中執行此類事情的最自然的方式。 – 2012-02-11 16:39:45
對不起,延遲了,我看過了。如果我可以避免,我想避免暫時編寫我自己的分析儀。但是,看起來這就是我所要做的。 – FloppyDisk 2012-02-13 14:21:46