我试图弄清楚有效载荷在 Lucene 中的工作方式,但我似乎无法掌握它。我的情况如下:
我需要索引一个具有单个内容字段的文档,并从该字段中的文本中为每个令牌附加一个有效负载(大约 10 个字节)。我需要使用的分析器是一个基本的空白分析器。
从我在互联网上阅读的各种文章来看,使用有效负载的方法是创建我自己的分析器并在标记化步骤中附加有效负载。我为我的新自定义分析器提供了以下代码:
public TokenStream tokenStream(String fieldName, Reader reader) {
TokenStream tokenStream = new WhitespaceTokenizer(Version.LUCENE_31,
reader);
OffsetAttribute offsetAttribute = tokenStream
.getAttribute(OffsetAttribute.class);
CharTermAttribute termAttribute = tokenStream
.getAttribute(CharTermAttribute.class);
if (!tokenStream.hasAttribute(PayloadAttribute.class)) {
tokenStream.addAttribute(PayloadAttribute.class);
}
PayloadAttribute payloadAttribute = tokenStream
.getAttribute(PayloadAttribute.class);
try {
while (tokenStream.incrementToken()) {
int startOffset = offsetAttribute.startOffset();
int endOffset = offsetAttribute.endOffset();
String token;
try{
token = (termAttribute.subSequence(startOffset, endOffset)).toString();
}
catch(IndexOutOfBoundsException ex){
token = new String(termAttribute.buffer());
}
byte[] payloadBytes = payloadGenerator.generatePayload(token,
frequencyClassDigest);
payloadAttribute.setPayload(new Payload(payloadBytes));
}
tokenStream.reset();
return tokenStream;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
我遇到的问题如下:
- 我无法正确读取各个令牌。我不确定使用 CharTermAttribute 是不是正确的方法,但我知道它不起作用。我需要获取单个令牌才能正确计算有效负载,但是 WithespaceTokenizer 以某种方式返回粘合在一起的单个单词(一次 3 个单词)。
- 我不知道使用 PayloadAttribute 是否是将有效负载附加到令牌的正确方法。也许你知道另一种方式
我在哪里可以找到一些关于如何在 Lucene 中实际使用 Payload 的好教程?我试过在网上搜索,我能找到的唯一一篇好文章是:Lucene Payload tutorial但是它并不完全适合我的需要。
谢谢
好像找不到好的教程