我在我的电子商务应用程序中使用Solr 1.3.0,现在我计划实施Solr 3.5.0。在Indexsearcher.java中,我们传递了一些读取器的子读取器(带有doc base),这与solr 1.3不同,我们将通过整个读者。
任何人都可以帮助我生成子读取器的位置和基础吗?
感谢。 Jeyaprakash
public void search(Weight weight, Filter filter, Collector collector)
throws IOException {
// TODO: should we make this
// threaded...? the Collector could be sync'd?
System.out.println("Total number of sub readers is "+subReaders.length);
// always use single thread:
for (int i = 0; i < subReaders.length; i++) {
System.out.println("The value of Doc base passed is "+docBase + docStarts[i]);
System.out.println("The Number in sub reader is "+subReaders[i].numDocs());
// search each subreader
collector.setNextReader(subReaders[i], docBase + docStarts[i]);
final Scorer scorer = (filter == null) ?
weight.scorer(subReaders[i], !collector.acceptsDocsOutOfOrder(), true) :
FilteredQuery.getFilteredScorer(subReaders[i], getSimilarity(), weight, weight, filter);
if (scorer != null) {
scorer.score(collector);
}
}
}
答案 0 :(得分:1)
大多数时候,子读者是单个片段的读者。关键是要对读者进行更细粒度的控制,并在知道自己感兴趣的细分时获得更好的性能。
例如,在提交新段时,使用段读取器允许您仅为新提交的段加载字段高速缓存,而不是为整个索引重新加载字段高速缓存(这样可以更快并防止重复高速缓存条目)。
Uwe Schindler和Simon Willnauer撰写了关于这个主题的非常好的文章: