`
suichangkele
  • 浏览: 199785 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

solr的facet源码解读(一)——facet.query

    博客分类:
  • solr
阅读更多

solr的facet query意思很简单,表示在所有的搜索到的结果中,符合某个query的doc有多少个。他的实现原理也很简单。

solr中所有的facet的操作都在facetComponent中,在这个类的process方法里面,会将facet委托给SimpleFacet这个类,然后调用simpleFacet.getFacetCounts方法。我们要说的facet.query就是在这个类中,如下:

public NamedList<Object> getFacetCounts() {
	// if someone called this method, benefit of the doubt: assume true
	if (!params.getBool(FacetParams.FACET, true))
		return null;

	facetResponse = new SimpleOrderedMap<>();
	try {
		facetResponse.add("facet_queries", getFacetQueryCounts());
		facetResponse.add("facet_fields", getFacetFieldCounts()); //
		facetResponse.add("facet_ranges", getFacetRangeCounts());
		facetResponse.add("facet_intervals", getFacetIntervalCounts());

	} catch (IOException e) {
		throw new SolrException(ErrorCode.SERVER_ERROR, e);
	} catch (SyntaxError e) {
		throw new SolrException(ErrorCode.BAD_REQUEST, e);
	}
	return facetResponse;
}

 可以发现,所有的facet的操作都是在这个类中,包括facetQuery、facetField、facetRange,在工作中最常用的就是facetQuery、facetField,先看下facetQuery吧

public NamedList<Integer> getFacetQueryCounts() throws IOException, SyntaxError {
	NamedList<Integer> res = new SimpleOrderedMap<>();
	String[] facetQs = params.getParams(FacetParams.FACET_QUERY);
	if (null != facetQs && 0 != facetQs.length) {
		for (String q : facetQs) {//轮训所有的facet的query
			parseParams(FacetParams.FACET_QUERY, q);//这个方法很简单,就是将一些参数保存到这个类的属性里面,比如下面的docs,
			// TODO: slight optimization would prevent double-parsing of any localParams
			Query qobj = QParser.getParser(q, null, req).getQuery();//获得facet.query的query是什么。
			if (qobj == null) {
				res.add(key, 0);
			} else if (params.getBool(GroupParams.GROUP_FACET, false)) {//这个我没有看,因为工作中还没有遇到这个功能。以后很可能会补充上。
				res.add(key, getGroupedFacetQueryCount(qobj));
			} else {
				res.add(key, searcher.numDocs(qobj, docs));//searcher.numDocs很简单,就是使用这个qobj命中的docs和第二个参数docs取交集,返回的是交集中的数量,第二个参数是solr的参数中q和fq中的命中的doc的id的集合。并且这个方法中会使用filterCache,所以facet.query是很高效的,它仅仅会涉及到倒排表的合并,并且还会使用到filterCache。
			}
		}
	}
	return res;
}

 如此简单就看懂了facet.query的实现原理,他的实现还是很高效的,可以大胆的使用。

  

分享到:
评论

相关推荐

    solrj的facet查询总结

    Solr 的默认 requestHandler(org.apache.solr.handler.component.SearchHandler)已经包含了 Facet 组件(org.apache.solr.handler.component.FacetComponent)。如果自定义 requestHandler 或者对默认的 ...

    solr facet 笔记

    Solr 提供了多种 Facet 组件,包括 `facet.field` 用于基于字段的 Faceting,`facet.query` 用于自定义查询的 Faceting,以及 `facet.date` 用于日期的 Faceting。这些组件可以通过配置在查询请求中指定,以满足不同...

    solr(solr-9.0.0-src.tgz)源码

    源码分析是深入理解一个软件系统工作原理的重要途径,对于Solr这样的复杂系统尤其如此。这里我们将围绕"solr-9.0.0-src.tgz"这个源码包,详细探讨其主要组成部分、核心功能以及开发过程中的关键知识点。 1. **Solr...

    Java后端学习路线梳理(csdn)————程序.pdf

    在Java后端开发的学习旅程中,你需要掌握一系列的知识点,这些知识点构成了一个全面的学习路线。首先,我们需要关注的是编程基础,尤其是Java语言本身。Java的基础包括语言语法、面向对象编程、接口、容器、异常处理...

    solr-6.2.0源码

    Solr是Apache软件基金会开发的一款开源全文搜索引擎,它基于Java平台,是Lucene的一个扩展,提供了更为方便和强大的搜索功能。在Solr 6.2.0版本中,这个强大的分布式搜索引擎引入了许多新特性和改进,使其在处理大...

    solr-mongo-importer-1.1.0.jar

    solr-mongo-importer-1.1.0.jar solr-mongo-importer-1.1.0.jar solr-mongo-importer-1.1.0.jar

    solr.war包solr.war包solr.war包solr.war包solr.war包

    solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...

    java进阶Solr从基础到实战

    Solr它是一种开放源码的、基于 Lucene 的搜索服务器,可以高效的完成全文检索的功能。在本套课程中,我们将全面的讲解Solr,从Solr基础到Solr高级,再到项目实战,基本上涵盖了Solr中所有的知识点。 主讲内容 章节一...

    配置好的solr启动环境

    Solr,全称为Apache Solr,是一款开源的全文搜索引擎,被广泛应用于企业级搜索解决方案中。它基于Java,能够高效地处理大量数据的检索、排序和过滤等任务。在这个“配置好的solr启动环境”中,我们有一个预先配置好...

    apache-solr-4.0.0-ALPHA-src.gz官方包

    Apache Solr 是一个高度可扩展、高性能的全文检索服务,由Apache软件基金会开发并维护。它基于Java,提供了一个高效、灵活的搜索平台,广泛应用于网站搜索、企业级内容管理和数据挖掘等领域。Apache Solr 4.0.0-...

    apache-solr-dataimporthandler-extras-1.4.0.jar.zip

    在给定的压缩包“apache-solr-dataimporthandler-extras-1.4.0.jar.zip”中,主要包含了一个名为“apache-solr-dataimporthandler-extras-1.4.0.jar”的文件,这个文件是Solr的一个重要组件——DataImportHandler...

    solr6.6.0源码

    Solr 6.6.0 是 Apache Solr 的一个重要版本,它是一个开源的企业级全文搜索引擎。这个源码包包含了 Solr 的所有源代码,对于理解 Solr 的工作原理、进行二次开发或者定制化配置有着非常重要的意义。接下来,我们将...

    solr 4.10源码

    这个源码包包含了Solr 4.10.4的所有源代码,对于开发者来说,这是一个深入了解Solr工作原理、定制功能以及进行二次开发的重要资源。 1. **Solr简介** Apache Solr是一个基于Lucene的全文检索服务,提供了一个高效...

    Solr项目源码及solr资源包

    Solr项目源码及solr资源包是一个针对搜索引擎平台Apache Solr的学习与实践资源集合,主要结合了Spring Data Solr框架进行操作。这个项目旨在帮助开发者更好地理解和运用Solr进行数据索引和检索。让我们详细地探讨...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第15讲 solr之Facet 共7页.pptx

    Solr集群安装与配置(一)第11讲 Solr集群安装与配置(二)第12讲 SolrCloud基本概念第13讲 Solrj操作SolrCloud第14讲 solr索引主从同步第15讲 solr之Facet第16讲 solr之FacetPivot第17讲 solr之Group第18讲 solr之...

    solr-5.2.1.part1.rar 编译第1部分,共2部分

    把solr.war(solr-4.2.0\example\solr-webapp\solr.war)里的东西全复制到WebRoot下 2. 创建solr/home, 把solr-4.2.0\example\solr所有文件复制到你创建的solr/home目录下 3. 创建JNDI让程序找到solr/home(当然你也...

    ik-analyzer-solr5-5.x.jar

    中文分词器ik-analyzer-solr5-5.x.jar,已经打包好,直接用就可以 2积分不黑心

    solr-dataimport-scheduler.jar 可使用于solr7.x版本

    Solr 数据导入调度器(solr-dataimport-scheduler.jar)是一个专门为Apache Solr 7.x版本设计的组件,用于实现数据的定期索引更新。在理解这个知识点之前,我们需要先了解Solr的基本概念以及数据导入处理...

    Solr in action.mobi

    PART 1 MEET SOLR. .................................................................1 1 ■ Introduction to Solr 3 2 ■ Getting to know Solr 26 3 ■ Key Solr concepts 48 4 ■ Configuring Solr 82 5 ■ ...

    bhl_rails_solr-源码.rar

    3. **Solr配置**:源码中可能包含针对不同环境(如开发、测试、生产)的Solr配置,通过solr.yml管理。这些配置可能涉及Solr服务器地址、端口、数据目录等。 4. **错误处理**:在与Solr通信过程中,可能会遇到网络...

Global site tag (gtag.js) - Google Analytics