当我通过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是否提供了这个漏洞怎么办?
谢谢。
答案 0 :(得分:0)
TermsEnum
遍历语料库中所有出现的字词。
这意味着你得到了#34; House"一旦,即使它出现在许多文件中。
为此获取TermVector
/ Offset没有意义,因为这仅适用于包含该术语的文档。
您可能希望为单个文档获取带有TermVectors的TermsEnum:
TermsEnum tEnum = reader.getTermVector(123, "field").iterator()