Я пытаюсь выяснить, как работают полезные нагрузки в 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?Я попытался выполнить поиск в Интернете, и единственная хорошая статья, которую мне удалось найти, заключалась в следующем: Учебное пособие по Lucene Payload Однако оно не совсем соответствует моим потребностям.
Спасибо
Не могу найти хороший учебник