【发布时间】:2012-02-03 14:53:08
【问题描述】:
使用 Lucene 索引,我有一个看起来像这样的标准文档格式:
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 查看索引时,我的自定义令牌流没有成功。字段名称正确显示,但令牌流中的术语值未出现,也未指示有效负载的成功附加。
这引出了两个问题。首先,我是否正确使用了令牌流,如果是,为什么在我将其添加到字段时它不进行令牌化?其次,如果我没有正确使用流,我是否需要编写自己的分析器。此示例是使用 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();
【问题讨论】: