Solr的使用 — 检索 本文是延续Solr的使用系列 , 前一篇文章已经讲了 Solr 的部署和数据推送 , 这里主要以示例方式讲述 Solr 的常见查询语法 , 同时介绍如何使用 PHP 语言的客户端solarium同 Solr 集群进行数据交互 。
想要详细地了解 Solr 查询语法 , 可参考官方wiki。
用于示例的数据 , 我已经推送到了 Solr , 见这里。数据 Core 为 rooms , 数据格式形如:
通过向 Solr 集群 GET 请求 /solr/core-name/select?query 形式的查询 API 完成查询 , 其中 core-name 为查询的 Core 名称 。查询语句 query 由以下基本元素项组成 , 按使用频率先后排序:
wt 设置结果集格式 , 支持 json、xml、csv、php、ruby、pthyon , 序列化的结果集 , 常使用 json 格式 。
fl 指定返回的字段 , 多指使用“空格”和“,”号分割 , 但只支持设置了 stored=true 的字段 。* 表示返回全部字段 , 一般情况不需要返回文档的全部字段 。
字段别名 :使用 displayName:fieldName 形式指定字段的别名 , 例如:
函数 :fl 还支持使用 Solr内置函数 , 例如根据单价算总价:
fq 过滤查询条件 , 可充分利用 cache , 所以可以利用 fq 提高检索性能 。
sort 指定结果集的排序规则 , 格式为 fieldName+sort , 支持 asc 和 desc 两种排序规则 。例如按照价格倒序排列:
也可以多字段排序 , 价格和面积排序:
查询字符串 q 由以下元素项组成 , 字段条件形如 fieldName:value 格式:
以上元素项的默认值由 solrconfig.xml 配置文件定义 。通常查询时设置 q=*:* , 然后通过 fq 过滤条件来完成查询 , 通过缓存提高查询性能 。
Solr 的模糊查询使用占位符来描述查询规则 , 如下:
查询小区名称中包含“嘉”的房源信息:
Solr 的模糊查询为:
单精确值查询是最简单的查询 , 类似于 SQL 中 = 操作符 。查询小区 id 为 1111027377528 的房源信息:
Solr 中查询为:
多精确值查询是单精确值查询的扩展 , 格式为 (value1 value2 ...) , 功能类似于 SQL 的 IN 操作符 。查询小区 id 为 1111027377528 或者 1111047349969 的房源信息:
Solr 中查询为:
范围查询是查询指定范围的值(数字和时间) , 格式为 [value1 TO value2] , 类似于 SQL 的 BETWEEN 操作符 。查询价格在 [2000, 3000] 的房源信息:
Solr 中范围查询为:
几个特殊的范围查询:
将基本查询结合布尔查询 , 就可以实现大部分复杂的检索场景 。布尔查询支持以下几种布尔操作:
查询北京市价格区间在 [2000, 3000] 或者上海市价格区间在 [1500, 2000] 的房源信息:
转换为逻辑与布尔查询:
在实际中分组查询比较常见 , 当然 Solr 也支持分组查询 。分组查询语句由以下基本元素项组成(常用部分):
查询西二旗内价格最便宜小区的房源信息:
Group 分组查询为:
结果为:
在大多数情况下 , Group 分组已经能满足我们的需求 , 但是如果待分组字段为多值 , Group 分组已经无能为力了 , 这时使用 Facet 就能轻松解决 。
Solr 的 Facet 语句由以下基本元素构成(常用):
例如 , 统计每个商圈的房源分布情况并倒序排列 , 由于 bizcircleCode 字段为多值 , Facet 查询为:
结果如下:
Solr 的 geofilt 过滤器可以实现 LBS 检索 , 但要在 schema.xml 配置中将需检索字段的字段类型设置为 solr.LatLonType 类型 。geofilt 过滤器参数列表如下:
示例中的 location 字段 , 值为 “40.074203,116.315445” , 类型配置为:
则检索坐标点 40.074203,116.315445 附近 2 公里的房源信息:
Solr 提供一些函数以实现逻辑或数学运算 。其中常用数学运算函数列表如下:
常用的逻辑运算函数:
这些函数可以使用在返回值或者查询条件上 。例如返回每个房源的每平方米价格信息:
PHP 可以使用solarium客户端 , 实现 Solr 数据源的检索 , 详细使用说明见这里。
solarium 客户端需要配置 Solr 的基本信息 。如下:
solarium 提供的查询方法较丰富 , 整理后如下表所示:
查询北京市的所有房源信息 , 如下:
秒懂生活扩展阅读
- 老蒋说的娘洗皮是什么意思
- 清朝刘墉老家哪里
- 老子道德经感悟 老子道德经
- 养老保险什么时候可以领
- 黑瞎子为什么不老
- 老三板是什么意思
- 春不老是什么菜 春不老
- benefactor红酒 benefactor
- 怎样给老师过生日
- 网上卖老母鸡怎么发快递