最近项目中碰到问题,发现在调用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[256];
int[] freq = new int[256];
for (int i=0; i<readers.length; i++) {
SolrIndexReader sir = readers[i];
int offset = offsets[i];
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[j]);
}
}
tdocs.close();
}
其实情况则直接调用lucene的super.search(query, luceneFilter, collector);
而SolrIndexSearcher.search(query,filter,n,sort)则是直接调用lucene的同名方法;
分享到:
相关推荐
资源名称:相关性搜索 利用Solr与Elasticsearch创建智能应用内容简介:《相关性搜索:利用Solr与Elasticsearch创建智能应用》揭开了相关性搜索的神秘面纱,告诉大家如何将 Elasticsearch与 Solr这样的搜索引擎作为可...
Solr 1.4 Enterprise Search Server.pdf
Apache Solr 3 Enterprise Search Server 部分中文翻译 从博客上面保存下来的。是网页版,方便大家查看
Title: Apache Solr Search Patterns Author: Jayant Kumar Length: 250 pages Edition: 1 Language: English Publisher: Packt Publishing Publication Date: 2015-03-31 ISBN-10: 1783981849 ISBN-13: ...
Solr Elasticsearch lucene 搜索引擎
本书揭开了相关性搜索的神秘面纱,告诉大家如何将Elasticsearch 或Solr 这样的搜索引擎作为可编程的相关性框架,从而表达业务排名规则。从这本书中你可学会如何结合各种外部数据源、分类方法以及文本分析手段对...
Solr is a widely popular open source enterprise search server that delivers powerful search and faceted navigation features—features that are elusive with databases. Solr supports complex search ...
详细介绍了Elasticsearch 和 solr 的区别;是一道经典的java面试题
ES和solr都是基于Lucence的搜索框架,文档比较2中方案适合的不同场景和优劣
Solr和ElasticSearch分析比较
Relevant search with applications for Solr and Elasticsearch
Apache Solr Search
Search using Solr’s rich query syntax, perform geospatial searches, and influence relevancy order Enhance search results with faceting, query spell-checking, auto-completing queries, highlighted ...
搜索引擎选择: Elasticsearch与Solr - 叽歪 搜索引擎选择: Elasticsearch与Solr - 叽歪
solr demo 无需分数 互相学习 拥抱开源
少有的solr中文文档,详细说明了SOLR的文件配置,使用。
开源企业搜索引擎SOLR的应用教程开源企业搜索引擎SOLR的应用教程