2

Solr 4.1 にアップグレードしていますが、新しい API を使用して位置とオフセットの情報を取得できません。私のインデックスは、文字列「 one quick brown fox jumped over one lazy dog 」を含む 1 つのフィールドを持つ 1 つのドキュメントで構成されています。「1」のインデックスを照会、「1」に対応する位置とオフセットを取得しようとしています。

ここにコードスニペットがあります

Terms terms=reader.getTermVector(docId, fieldName);
TermsEnum termsEnum= terms.iterator(TermsEnum.EMPTY);
    BytesRef term;
    while((term=termsEnum.next())!=null){
        String docTerm = term.utf8ToString();
        DocsAndPositionsEnum docPosEnum = termsEnum.docsAndPositions(null, null, DocsAndPositionsEnum.FLAG_OFFSETS);
        //Check if the current term is the same as the query term and if so
        //retrieve all positions (can be multiple occurrences of a term in a field) corresponding to the term
        if (queryTerms.contains(docTerm)) {
            int position;
            while((position=docPosEnum.nextPosition())!=-1){
                int start=docPosEnum.startOffset();
                int end=docPosEnum.endOffset();
                //Store start, end and position in an a list
                }
        }
    }

内側の while ループが正しくありません。DocsAndPositionsEnum 内のすべての位置を反復処理する方法についての指針は、非常に高く評価されます。

4

2 に答える 2

8

これが私のために働いたものです

Terms terms=reader.getTermVector(docId, fieldName);
TermsEnum termsEnum= terms.iterator(TermsEnum.EMPTY);
BytesRef term;
while((term=termsEnum.next())!=null){
            String docTerm = term.utf8ToString();
            //Check if the current term is the same as the query term and if so
            //retrieve all positions (can be multiple occurrences of a term in a field) corresponding to the term
            if (queryTerms.contains(docTerm)) {
                DocsAndPositionsEnum docPosEnum = termsEnum.docsAndPositions(null, null, DocsAndPositionsEnum.FLAG_OFFSETS);
                docPosEnum.nextDoc();
                //Retrieve the term frequency in the current document
                int freq=docPosEnum.freq();
                for(int i=0; i<freq; i++){
                    int position=docPosEnum.nextPosition();
                    int start=docPosEnum.startOffset();
                    int end=docPosEnum.endOffset();
                    //Store start, end and position in a list
                    }
            }
    }
于 2013-03-13T14:23:18.870 に答える
1

Documentで aを繰り返していませんDocsAndPositionsEnum

    if (queryTerms.contains(docTerm)) {
        docPosEnum.advance(docId)
        int freq=docPosEnum.freq();
        for(int i=0; i<freq; i++){
            int position=docPosEnum.nextPosition();
            int end=docPosEnum.endOffset();
            //Store start, end and position in an a list
        }
    }

から返されたdocidを保存したいdocPosEnum.nextDoc()と思うでしょう。

于 2013-03-12T20:57:40.297 に答える