设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 开源资讯 查看内容

Apache Solr JSON Facet API内部原理

2016-11-3 22:56| 发布者: joejoe0332| 查看: 1544| 评论: 0|原作者: oschina|来自: oschina

摘要: 自从我几年前加入了Cloudera 平台以进行提供搜索引擎分析, 我一直积极的和上游的Solr社区开发新功能,这将推动更多有趣的应用程序运行在Cloudera搜索中(那是一个基于 Solr和Apache Hadoop的生态系统),在下文从我 ...
自从我几年前加入了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模块的目的包括:

  • 完美的JSON支持。

  • 复杂的纲领性的结构更加简化, 嵌套facet 命令。

  • 支持更多的标准格式的响应,使客户端更容易解析。

  • 完美的数据分析支持。

  • 可以对任何计算指标对facet存储进行排序。

  • 一个对features分布式更简单快捷的方法。

  • 与其他搜索功能更好地的集成。

当然, 如果你喜欢使用Solr现有的faceting功能也是可以的。(只要你喜欢,两者甚至可以同时使用!)

接下来,让我们进入细节。 (注意:这里的一些示例使用的语法,仅在 Solr 5发行版或甚至Solr 6中支持)

使用方便

一些超出传统Solr faceting 便于使用的增强来自于JSON的固有嵌套结构。

例如,下面是使用Solr  Flat API中的两个不同范围facet的faceting命令:

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命令的一般形式:

1
<facet_name>:{<facet_type>:<facet_parameter(s)>}

例如:

1
top_authors:{terms:{field:authors,limit:5}}

在Solr5.2之后,有“type”字段的 flatter结构依然可以这样使用:

1
<facet_name>:{"type":<facet_type>,<other_facet_parameter(s)>}

例如:

1
top_authors:{type:terms,field:authors,limit:5}

运行结果在应答中的facet指定名称下显示。Facet命令明确使用json.facet 的请求参数。

使用 Curl来进行测试

要手动测试出不同的facet请求,最快捷的是使用curl的相关命令。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$curl http://localhost:8983/solr/query -d 'q=*:*&rows=0&
 
json.facet={
 
categories:{
 
type:terms,
 
field:cat,
 
sort:{x:desc},
 
facet:{
 
x:"avg(price)",
 
y:"sum(price)"

Tzrms Facet

无论是termsfacet,或者field facet,根据字段中的唯一值产生存储。该字段需要索引或者具有docValues。

terms facet最简单的形式:

1
top_genres:{terms:genre_field}

允许更多参数的扩展形式

1
2
3
4
5
top_genres:{
type:terms,
field:genre_field,
limit:3,
mincount:2

响应示例:

1
2
3
4
5
6
7
"top_genres":{
"buckets":[
"val":"Science Fiction",
"count":143},
"val":"Fantasy",
"count":122},
"val":"Biography",

参数列表:

http://blog.cloudera.com/wp-content/uploads/2016/10/solr-json-tab1.png


查询Facet 

查询facet生成一个与指定查询匹配的单个存储桶。

下面是一个查询facet的最简单形式的示例:

high_popularity:{query:"popularity:[8 TO 10]"}

扩展形式允许更多参数(or sub-facets/facet functions):

1
2
3
4
high_popularity:{
type:query,
q:"popularity:[8 TO 10]",
facet:{average_price:"avg(price)"}

响应示例:

1
2
3
"high_popularity":{
"count":147,
"average_price":74.25

设定Facet范围

设定facet的范围,在数字或日期字段上会生成多个区间的存储桶。

设定示例:

1
2
3
4
5
6
prices:{
type:range,
field:price,
start:0,
end:100,
gap:20

响应示例:

1
2
3
4
5
6
7
8
9
10
11
12
"prices":{
"buckets":[
"val":0.0,// the bucket value represents the start of each range. This bucket covers 0-20
"count":5},
"val":20.0,
"count":3},
"val":40.0,
"count":2},
"val":60.0,
"count":1},
"val":80.0,
"count":1}

为了简化迁移,这些参数名称,值和语义的格式直接取自先前的(非JSON)Solr range faceting风格.

参数列表:

公共参数

所有faceting方法共有的参数包括:

结论

希望,到目前为止您已经对Solr 5中介绍的JSON API有了很好的理解。需要再次强调的是,此功能预计将会在未来的Cloudera版本中发行/获得认证,但是尚未支持线上生产使用。




酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部