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() + "]"); } } } }
それほど利用する機会はないだろうけど...。