2011-07-09 11 views
3

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

私が午前問題は、以下の通りである:

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

Luceneで実際にペイロードを使用する方法に関する良いチュートリアルはありますか?私はウェブを検索しようとしましたが、私が見つけることができた唯一の良い記事はLucene Payload tutorialでしたが、それは私のニーズに合っていません。

あなたは

私は良いチュートリアル

+0

http://sujitpal.blogspot.com/2010/10/custom-scoring-with-lucene-payloads.htmlを確認しましたか? – hkn

答えて

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 texttext|1.0 text|2.2 text|0.5 text|10.5

http://sujitpal.blogspot.com/2010/10/denormalizing-maps-with-lucene-payloads.htmlも良い資源であるになるだろう。

+0

DelimitedPayloadTokenFilterのヒントの+1 – Marc