更新:添加了示例
我们在Lucene 4.6之上有一个API,我正在尝试适应在Solr 4.6下运行。问题是当索引由Lucene创建时我们从索引工作中读取一个术语的字符偏移的方式,但是当索引由Solr创建时总是返回-1。在后一种情况下,我可以通过Luke看到字符偏移量,当我访问使用TermVectorComponent类的/ tvrh搜索处理程序时,我甚至可以从Solr获取它们。
这大致是我在Lucene代码中读取字符偏移的方式:
public void showOffsets(Directory dir, Term term) {
IndexReader indexReader = DirectoryReader.open(dir);
IndexReaderContext topContext = indexReader.getContext();
for (AtomicReaderContext context : topContext.leaves()) {
AtomicReader reader = context.reader();
termMatches(term, reader);
}
}
private void termMatches(Term term, AtomicReader reader) throws IOException {
DocsAndPositionsEnum postings = reader.termPositionsEnum(term);
if (postings != null) {
while (postings.nextDoc() != DocsAndPositionsEnum.NO_MORE_DOCS) {
for (int i = 0; i < postings.freq(); i++) {
System.out.println(
"term:" + term.toString() +
" tokpos:" + postings.nextPosition() +
" start:" + postings.startOffset() +
" end:" + postings.endOffset());
}
}
}
}
请注意,我想要单个术语的值。当对Solr创建的索引运行时,上面对startOffset()和endOffset()的调用返回-1,尽管对nextPosition()的调用工作正常。 Solr的TermVectorComponent打印出这样的正确偏移(释义):
IndexReader reader = searcher.getIndexReader();
final Terms vector = reader.getTermVector(docId, field);
TermsEnum termsEnum = vector.iterator(termsEnum);
final int freq = (int) termsEnum.totalTermFreq();
DocsAndPositionsEnum dpEnum = null;
while((text = termsEnum.next()) != null) {
String term = text.utf8ToString();
dpEnum = termsEnum.docsAndPositions(null, dpEnum);
dpEnum.nextDoc();
for (int i = 0; i < freq; i++) {
final int pos = dpEnum.nextPosition();
System.out.println("start:" + dpEnum.startOffset());
System.out.println("end:" + dpEnum.endOffset());
}
}
但在这种情况下,它会获得每个文档ID的偏移量,而不是单个术语。
有人能告诉我:
答案 0 :(得分:0)
storeOffsetsWithPositions="true"
添加到模式中的字段定义中。在这样做并重新编制索引之后,我现在可以按预期进行偏移。