Apache Solr —— Facet Pivot实现与低版本移植
Mar 27, 2013 Solr
1、前言
Solr升级到4.0后便有了一个新功能,就是facet.pivot,关于pivot的介绍可以看上一篇文章:《Apache Solr – Facet介绍》 这篇主要讲述Pivot的内部实现机制,以及如何将这个功能移植到低版本的Solr中来。
2、Pivot实现机制
http://...?q=*:*&facet=true&&facet.field=province&facet.field=city&facet.pivot=province,city&wt=json
2.1 获得所有pivots参数列表
e.g.: [“province,city”, …]
2.2 将pivots交给PivotFacetHelper处理
1 | // FacetComponent.java -> process |
2.3 解析pivot,获得每个field –> pivot: field subField fnames
1 | // PivotFacetHelper.java -> process |
2.4 获得第一级field的facets
1 | // PivotFacetHelper.java -> process |
2.5 递归调用pivotResult = doPivot(superFacets, field, subField, fnames, docs)
1 | // … |
新版添加新机制方式可以参考,并不是在源码基础上大刀阔斧的改。而是添加了一个新类,只需原有获取facet流程逻辑上,添加少数几行代码即可,这也算是模块化思想么?
3、移植Pivot功能到低级版本
这里是从solr4.0移植到solr3.5
移植步骤倒也还方便,主要是添加PivotFacetHelper类,剩下的就是一步一步修复红叉叉了。
1 | Index: core/src/java/org/apache/solr/handler/component/FacetComponent.java |
1 | Index: solrj/src/java/org/apache/solr/common/params/FacetParams.java |
1 | Index: core/src/java/org/apache/solr/request/SimpleFacets.java |
1 | Index: core/src/java/org/apache/solr/schema/FieldType.java |
1 | Index: core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java |
没弄过patch,上面的就将就着看吧。
WARNING:
3.x中,SimpleFacet组件中有两个成员,docs/base。在4.x中,这两个成员改名为docsOrig/docs。名字倒是清晰了,就是移植的时候没注意倒是挺麻烦的。
WARNING:
BytesRef这个类,在4.x中改动比较大,而且Term也原生支持BytesRef。为了偷懒,就直接将BytesRef.bytes转换成了String。
WARNING:
上面还有一些小类,没有写上,有红叉叉自己改改应该问题不大。