从Lucene的TermsEnum获取属性

时间:2016-10-27 13:39:32

标签: java lucene

当我通过StandardAnalyzer传递一些文本时,我可以获得TokenStream,并且通过迭代获取各种令牌属性,如OffsetAtribute。

public static void displayTokensWithFullInfo(TokenStream stream) throws IOException {
        CharTermAttribute charAttribute = stream.addAttribute(CharTermAttribute.class);
        OffsetAttribute offsetAttribute = stream.addAttribute(OffsetAttribute.class);

        stream.reset();
        while (stream.incrementToken()) {
            System.out.print(offsetAttribute.startOffset() + "->" + offsetAttribute.endOffset() + " \"");
            System.out.print(charAttribute.toString());    

        }

        stream.close();
    }

保存TokenStream后,为了索引,我试图从TermsEnum获取OffsetAttribute,但我得到的偏移值总是等于0。

IndexReader reader = new IndexSearcher(DirectoryReader.open(directory)).getIndexReader();
    Terms terms = MultiFields.getTerms(reader,"field");
    TermsEnum termsEnum = terms.iterator();
                    BytesRef  bytesRef = termsEnum.next();
                    while(bytesRef  != null){
                        AttributeSource attributeSource = termsEnum.attributes();
                        OffsetAttribute offsetAttribute = attributeSource.addAttribute(OffsetAttribute.class);

                        bytesRef = termsEnum.next();
                    }

我做错了什么?实际上是否可以从TermVector获取此属性?如果我想创建自己的属性实现,Lucene是否提供了这个漏洞怎么办?

谢谢。

1 个答案:

答案 0 :(得分:0)

TermsEnum遍历语料库中所有出现的字词。 这意味着你得到了#34; House"一旦,即使它出现在许多文件中。

为此获取TermVector / Offset没有意义,因为这仅适用于包含该术语的文档。

您可能希望为单个文档获取带有TermVectors的TermsEnum:

TermsEnum tEnum = reader.getTermVector(123, "field").iterator()

请参阅IndexReader.getTermVector