私はペイロードがLuceneで動作する方法を理解しようとしており、私はそれを把握していないようです。 私の状況は以下の通りです:Lucene 3.1ペイロード
単一のコンテンツフィールドを持つドキュメントをインデックスし、そのフィールド内のテキストからペイロード(約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 tutorialでしたが、それは私のニーズに合っていません。
あなたは私は良いチュートリアル
http://sujitpal.blogspot.com/2010/10/custom-scoring-with-lucene-payloads.htmlを確認しましたか? – hkn