ペイロードが 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 でペイロードを実際に使用する方法に関する優れたチュートリアルはどこにありますか? Web を検索してみましたが、見つけた唯一の良い記事は次のとおりです。
ありがとうございました
良いチュートリアルが見つからないようです