有关Solr中SolrIndexSearcher的search和getDocSet的差别
最近项目中碰到问题,发现在调用SolrIndexSearcher的public TopFieldDocs search(Query query, Filter filter, int n,
Sort sort) throws IOException;
和public DocSet getDocSet(Query query) throws IOException;
效果差别比较大;
查阅了代码发现在SolrIndexSearcher.getDocSet(Query query)中第一次搜索query时,内部实现是调用 getDocSetNC(Query query, DocSet filter);非第一次的话会直接从cache中获取,即
if (filterCache != null) {
DocSet absAnswer = filterCache.get(absQ);
if (absAnswer!=null) {
if (positive) return absAnswer;
else return getPositiveDocSet(matchAllDocsQuery).andNot(absAnswer);
}
}
DocSet absAnswer = getDocSetNC(absQ, null);
DocSet answer = positive ? absAnswer : getPositiveDocSet(matchAllDocsQuery).andNot(absAnswer);
if (filterCache != null) {
// cache negative queries as positive
filterCache.put(absQ, absAnswer);
}
继续查阅方法getDocSetNC(Query query, DocSet filter)可以发现当filter不存在。且query为TermQuery时,实现如下:
if (query instanceof TermQuery) {
Term t = ((TermQuery)query).getTerm();
SolrIndexReader[] readers = reader.getLeafReaders();
int[] offsets = reader.getLeafOffsets();
int[] arr = new int;
int[] freq = new int;
for (int i=0; i<readers.length; i++) {
SolrIndexReader sir = readers;
int offset = offsets;
collector.setNextReader(sir, offset);
TermDocs tdocs = sir.termDocs(t);
for(;;) {
int num = tdocs.read(arr, freq);
if (num==0) break;
for (int j=0; j<num; j++) {
collector.collect(arr);
}
}
tdocs.close();
}
其实情况则直接调用lucene的super.search(query, luceneFilter, collector);
而SolrIndexSearcher.search(query,filter,n,sort)则是直接调用lucene的同名方法;
页:
[1]