自从我几年前加入了Cloudera 平台以进行提供搜索引擎分析,我一直积极的和上游的Solr社区开发新功能,这将推动更多有趣的应用程序运行在Cloudera搜索中(那是一个基于 Solr和Apache Hadoop的生态系统),在下文从我的个人博客转帖中,我将介绍其中的一个功能——通过JSON对 nested facets改进支持——我编写了那些代码的签入(注意:此功能是面向未来发布Cloudera企业版,因此尚不支持用于生产环境。) |
为什么是Json?嵌套的sub-facets结构特性,在类似于JSON嵌套的结构中比起提供正常参数查询的平面结构要更容易表达。因此,从5.0开始,Solr 包括了一个Facet API. Facet API现在是JSON请求API 的一部分。因此一个完整的请求可以用JSON来表示。 全新的faceting模块的目的包括:
当然, 如果你喜欢使用Solr现有的faceting功能也是可以的。(只要你喜欢,两者甚至可以同时使用!) 接下来,让我们进入细节。 (注意:这里的一些示例使用的语法,仅在 Solr 5发行版或甚至Solr 6中支持)
|
使用方便
|
1
2
3
4
5
6
7
8
9
|
&facet= true &facet.range={!key=age_ranges}age &f.age.facet.range.start= 0 &f.age.facet.range.end= 100 &f.age.facet.range.gap= 10 &facet.range={!key=price_ranges}price &f.price.facet.range.start= 0 &f.price.facet.range.end= 1000 &f.price.facet.range.gap= 50 |
而下面是在新的JSON Faceting API中的等价faceting命令:
1
2
3
4
5
6
7
8
9
10
11
12
|
age_ranges:{ type:range field:age, start: 0 , end: 100 , gap: 10 price_ranges:{ type:range field:price, start: 0 , end: 1000 , gap: 50 |
这些都不是嵌套的facets,但是包含嵌套的内容, 从上面可以看到JSON API看起来更好。通过深层次嵌套的sub-facets和统计信息,固有嵌套JSON API的清晰度越来越明显。
JSON 扩展项
许多JSON的扩展项已经实现,用来进一步增强用户手动使用 JSON faceting命令的清晰度和易用性。例如:
1
2
3
4
|
{ // this is a single-line comment, which can help add clarity to large JSON commands /* traditional C-style comments are also supported */ x: "avg(price)" , // Simple strings can occur unquoted y: 'unique(manu)' // Strings can also use single quotes (easier to embed in another String) |
JSON 调试
标准缩进的JSON格式很容易理解。如果你得到一大块不知为何没有缩进的JSON格式的数据,并试图理解它,你可以剪贴和粘贴到一个在线的验证器如JSON Lint 或 JSON Formatter.
这两个验证器将缩进您的JSON,即使内容中包含他们不支持的扩展(如注释或空字符串)。
Facet 类型
Facet的类型有两种:一种是将一个存储区域的分解成多个存储桶,另一种是聚合函数或者facet 函数,用来提供关于文档集合属于哪个存储桶的信息。
faceting 可以被嵌套, 任何通过faceting产生的存储桶可以通过subfacet来进一步分解成过个存储桶。
统计即 Facets
统计现在全面融入了faceting。一旦我们从具有由主查询和过滤器定义的范围的单个facet存储桶开始,我们甚至可以在通过faceting分解到成多存储桶之前,请求该顶层存储桶的统计信息。例如:
1
2
3
|
json.facet={ x: "avg(price)" , // the average of the price field will appear under "x" y: "unique(manufacturer)" // the number of unique manufacturers will appear under "y" |
有关可用聚合函数的完整列表,请参阅构facet 函数。
JSON Facet 语法JSON faect命令的一般形式:
例如:
在Solr5.2之后,有“type”字段的 flatter结构依然可以这样使用:
例如:
运行结果在应答中的facet指定名称下显示。Facet命令明确使用json.facet 的请求参数。 使用 Curl来进行测试要手动测试出不同的facet请求,最快捷的是使用curl的相关命令。例如:
Tzrms Facet无论是termsfacet,或者field facet,根据字段中的唯一值产生存储。该字段需要索引或者具有docValues。 terms facet最简单的形式:
允许更多参数的扩展形式
响应示例:
参数列表:
|
查询Facet 查询facet生成一个与指定查询匹配的单个存储桶。 下面是一个查询facet的最简单形式的示例: high_popularity:{query:"popularity:[8 TO 10]"}
扩展形式允许更多参数(or sub-facets/facet functions):
响应示例:
设定Facet范围设定facet的范围,在数字或日期字段上会生成多个区间的存储桶。 设定示例:
响应示例:
为了简化迁移,这些参数名称,值和语义的格式直接取自先前的(非JSON)Solr range faceting风格. 参数列表:
公共参数 所有faceting方法共有的参数包括:
结论
|
本文标题:Apache Solr JSON Facet API 内部原理
本文地址:https://www.oschina.net/translate/inside-the-apache-solr-json-facet-api
参与翻译:Tony, 独孤俊杰
英文原文:Inside the Apache Solr JSON Facet API