【问题标题】:Retrieving all term positions from DocsAndPositionsEnum从 DocsAndPositionsEnum 检索所有术语位置
【发布时间】:2013-02-28 12:32:13
【问题描述】:

我正在升级到 Solr 4.1,但在使用新 API 检索位置和偏移信息时遇到了问题。我的 index 包含一个文档,其中一个字段包含字符串“one quick brown fox jumped over one lazy dog”。我正在查询我的 'one' 索引并尝试检索与“one”相对应的位置和偏移量。

这里是代码sn-p

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 中所有位置的指针将不胜感激。

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    您没有在 DocsAndPositionsEnum 中迭代到 Document

        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
            }
        }
    

    我猜你可能想要存储从docPosEnum.nextDoc() 返回的 docid。

    【讨论】:

    • 你说得对,我需要迭代到下一个文档。但是,您发布的解决方案将不起作用。内部 while 将导致无限循环,因为 docPosEnumEnum.nextPosition() 仅在没有索引位置时才返回 -1 ..并且我已经索引了这些位置。另外,请注意我有 docID(代码 sn-p 的第 1 行),这使得外部 while 循环变得不必要。
    • 我不认为您只想要单个文档的位置枚举。按照您在答案中编写的方式,除非我弄错了,否则它应该返回包含该术语的第一个文档的结果。该枚举中返回的第一个文档可能不是指定的文档。根据我更新的答案,您需要使用 advance(int)
    【解决方案2】:

    这对我有用

    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
                        }
                }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多