Luceneのメモ

IndexReaderの getTermFreqVector で TermPositionVector を取得するにはIndex作成時に TermVector.WITH_POSITIONS_OFFSETS を指定しておく。

Document doc = new Document();
Reader r = <some reader instance>;
...
doc.add(new Field("contents", r, TermVector.WITH_POSITIONS_OFFSETS));

そして、IndexReaderでは次のように読み出す感じ。

IndexReader ir = IndexReader.open(<index-path>);
...
TermFreqVector tfvector = ir.getTermFreqVector(<docId>, "contents");
if (tfvector instanceof TermPositionVector) {
  TermPositionVector tpvector = (TermPositionVector)tfvector;
  String[] termTexts = tpvector.getTerms();

  // こんな風にすれば、個別の単語の位置も取得できる。
  for (int k = 0;k < termTexts.length;k++) {
    TermVectorOffsetInfo[] tvoinfos =
      tpvector.getOffsets(tpvector.indexOf(termTexts[i]));
    if (tvoinfos != null) {
      for (int m = 0;m < tvoinfos.length;m++) {
        System.out.println("t=" + termTexts[i] + "[" +
          tvoinfos[m].getStartOffset() +
          "," + tvoinfos[m].getEndOffset() + "]");
      }
    }
  }
}

それほど利用する機会はないだろうけど...。