3

ペイロードが 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;
    }
}

私が抱えている問題は次のとおりです。

  1. 個々のトークンを正しく読み取ることができません。CharTermAttribute を使用することが正しい方法かどうかはわかりませんが、うまくいかないことはわかっています。ペイロードを正しく計算するには、個々のトークンに到達する必要がありますが、どういうわけか、WithespaceTokenizer は個々の単語をくっつけて (一度に 3 単語ずつ) 返します。
  2. PayloadAttribute を使用することがペイロードをトークンにアタッチする正しい方法かどうかはわかりません。別の方法を知っているかもしれません

Lucene でペイロードを実際に使用する方法に関する優れたチュートリアルはどこにありますか? Web を検索してみましたが、見つけた唯一の良い記事は次のとおりです。

ありがとうございました

良いチュートリアルが見つからないようです

4

1 に答える 1

2

ペイロード生成ロジックをフィルター内にカプセル化して、フィルターを通過するトークンごとにペイロードを生成することができます。これをLuceneからモデル化しましたDelimitedPayloadTokenFilter

public final class PayloadGeneratorFilter extends TokenFilter {
  private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
  private final PayloadAttribute payAtt = addAttribute(PayloadAttribute.class);
  private final PayloadGenerator payloadGenerator;
  private final FrequencyClassDigest frequencyClassDigest;


  public PayloadGeneratorFilter(TokenStream input, PayloadGenerator payloadGenerator,
                                FrequencyClassDigest frequencyClassDigest) {
    super(input);
    this.payloadGenerator = payloadGenerator;
    this.frequencyClassDigest = frequencyClassDigest;
  }

  @Override
  public boolean incrementToken() throws IOException {
    if (input.incrementToken()) {
      final char[] buffer = termAtt.buffer();
      final int length = termAtt.length();
      String token = buffer.toString();
      byte[] payloadBytes = payloadGenerator.generatePayload(token, frequencyClassDigest);
      payAtt.setPayload(new Payload(payloadBytes));
      return true;
    }

    return false;
  }
}

これにより、アナライザーコードが非常に単純になります。

public class NLPPayloadAnalyzer extends Analyzer {
  private PayloadGenerator payloadGenerator;
  private FrequencyClassDigest frequencyClassDigest;

  public NLPPayloadAnalyzer(PayloadGenerator payloadGenerator,
                            FrequencyClassDigest frequencyClassDigest) {
    this.payloadGenerator = payloadGenerator;
    this.frequencyClassDigest = frequencyClassDigest;
  }

  public TokenStream tokenStream(String fieldName, Reader reader) {
    TokenStream tokenStream = new WhitespaceTokenizer(Version.LUCENE_31, reader);
    tokenStream = new PayloadGeneratorFilter(tokenStream, payloadGenerator, frequencyClassDigest);
    return tokenStream;
  }
}

別の方法は、ペイロードを前処理し、Luceneに送信するテキストに追加してからを使用することDelimitedPayloadTokenFilterです。 text text text text になります text|1.0 text|2.2 text|0.5 text|10.5

http://sujitpal.blogspot.com/2010/10/denormalizing-maps-with-lucene-payloads.htmlも優れたリソースです。

于 2011-08-10T21:28:11.053 に答える