Solr入门学习(二)—— Solr 的基本查询

Server : Ubuntu 16.04
Java Version : 1.8
Solr Version : 7.4.0

一、数据准备

Solr 刚刚安装后,是没有任何数据的,所以此时我们无法进行任何查询。幸运的是,官方为用户提供了索引工具以及样本数据,方便新手快速建立索引。

首先,我们先看一下索引工具和样本数据分别位于哪个位置。

  • 索引工具:/{solr_home}/bin/post
  • 样本数据:/{solr_home}/example/exampledocs

在样本数据中,包含了 jsoncsvxmlhtml 等多种格式的数据。尽管如此,官方提供的 post 工具只需一个命令即可为上述多种格式的数据建立索引:

./post -c techproducts ../example/exampledocs/*

成功运行命令,我们看到以下信息输出:

SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/testCollection/update...
Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
POSTing file books.csv (text/csv) to [base]
POSTing file books.json (application/json) to [base]/json/docs
POSTing file gb18030-example.xml (application/xml) to [base]
POSTing file hd.xml (application/xml) to [base]
POSTing file ipod_other.xml (application/xml) to [base]
POSTing file ipod_video.xml (application/xml) to [base]
POSTing file manufacturers.xml (application/xml) to [base]
POSTing file mem.xml (application/xml) to [base]
POSTing file money.xml (application/xml) to [base]
POSTing file monitor2.xml (application/xml) to [base]
POSTing file monitor.xml (application/xml) to [base]
POSTing file more_books.jsonl (application/json) to [base]/json/docs
POSTing file mp500.xml (application/xml) to [base]
POSTing file post.jar (application/octet-stream) to [base]/extract
POSTing file sample.html (text/html) to [base]/extract
POSTing file sd500.xml (application/xml) to [base]
POSTing file solr-word.pdf (application/pdf) to [base]/extract
POSTing file solr.xml (application/xml) to [base]
POSTing file test_utf8.sh (application/octet-stream) to [base]/extract
POSTing file utf8-example.xml (application/xml) to [base]
POSTing file vidcard.xml (application/xml) to [base]
21 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/testCollection/update...
Time spent: 0:00:06.133

可以发现,已经有 21 份文档存储到 Solr 当中,现在,我们可以使用 Solr 查询数据了。


二、查询方式

Solr 提供多种数据查询方式,这里仅介绍两种。

1. Solr 管理界面查询

Solr 启动后,我们可以通过 http://localhost:8983/solr 访问 Solr 的管理页面,如下图所示:

1

进行查询前,我们首先要选择集合。选中集合后,点击集合下的 Query 选项卡:

2

此时,页面上会弹出如下图所示的查询窗口。点击 Execute Query 按钮,即可在页面右侧看到 Solr 返回的数据。默认情况下,Solr 会以 JSON 格式返回 10 条记录。

3

2. URL 查询

实际上,Solr 管理页面是通过 URL 的方式请求数据的。例如上例的查询,转成相应的 URL 就是 http://localhost:8983/solr/testCollection/select?q=*:*

在这个 URL 中,testCollection 表示集合名,select 表示查询动作,参数 q 表示查询条件。其中,参数 q 最为关键,它决定了哪些数据可以返回给用户。

现在,我们在浏览器地址栏中输入这个 URL,即可得到 json 格式的数据。


三、查询参数

除了上述提到的查询条件 q,Solr 还有其他查询参数,具体见下表:

参数名描述
q查询条件,必填项
start结果集第一条记录的偏移位置,用于分页,默认为 0
rows返回文档的记录数,用于分页,默认为 10
sort排序
fl指定返回字段,多个字段用逗号或空格分隔,默认返回所有字段
wt指定输出格式,例如xml、json等
fq过滤查询。该参数可将查询的结果限定在某一范围,由于 Solr 会对过滤查询进行缓存,因此它可以显著提升复杂查询的效率
hl用于设置字段的高亮显示

四、运算符

与 SQL 相似,Solr 查询语句中也包含运算符,具体见下表:

运算符说明
:指定字段目标值,等同于 SQL 中的 “=” 号
?通配符,替代任意单个字符
*通配符,替代任意多个字符
AND表示且,等同于 “&&”
OR表示或,等同于 “||”
NOT表示否
()用于构成子查询
[]范围查询,包含头尾
{}范围查询,不包含头尾
+存在运算符,表示文档中必须存在 “+” 号后的项
-不存在运算符,表示文档中不包含 “-” 号后的项

五、查询示例

1. 关键词查询

如果我们想在 Solr 中查询包含某个关键词 foundation 的文档,可以直接在管理界面的 q 参数输入框中输入该关键词,然后点击 Execute Query 按钮。此时,我们可以在页面上看到如下结果:

4

如果想使用 url 方式完成相同的查询,只需将默认的 q=*:* 替换成 q=foundation 即可。完整的 URL 为:http://localhost:8983/solr/testCollection/select?q=*:*

2. 字段查询

有时候,我们想通过某个字段的值来查询文档,正如我们当初使用 SQL 语句 select * from table where field = 'xxx' 查询数据库记录一样。此时,我们只需要将 q 参数默认的 *:* 改为 字段名:字段值 即可。

例如,我们现在在管理界面 q 参数输入框中输入 cat:electronics,可以看到如下结果:

5

如果使用 url 完成此查询,只需在浏览器输入完整的 URL : http://localhost:8983/solr/testCollection/select?q=cat:electronics

3. 词组查询

有时候,我们不仅想依赖于某个单词来查询文档,而是想通过词组(单词间有空格)来完成查询工作。如果此时我们想使用管理界面完成该查询,首先要使用双引号将词组包含起来,然后再输入到输入框中。

例如,我们输入词组 "CAS latency",得到如下结果:

6

另一方面,如果我们想使用 url 完成相同的查询,就需要对空格进行处理。一般来说,有两种处理方式:

  • 对空格进行编码,即把 转换为 %20,相应的 URL 为:http://localhost:8983/solr/testCollection/select?q="CAS%20latency"
  • 把空格替换为 + 号,对应的 URL 为:http://localhost:8983/solr/testCollection/select?q="CAS+latency"

4. 组合查询

假如我们希望得到同时匹配多个关键词的文档,这时候,我们该怎么做?Solr 的组合查询可以满足我们的需求。这里介绍两种实现组合查询的方法:

  • 使用运算符 AND 将多个查询条件连接起来。例如,我们通过输入 electronics AND music 来匹配同时包含 electronicsmusic 的文档。
  • 通过加上前缀 + 将多个查询条件连接起来。例如,我们可以输入 +electronics +music 实现相同的查询。

我们注意到,上述两个组合查询,都是用于查找同时存在 electronicsmusic 的文档。但如果我们的需求发生变化了呢?比如说,我们现在希望能找到存在 electronics 但是不存在 music 的文档,那么,我们该怎么做?

同样地,有两种方式:

  • 使用运算符 NOT 排除关键词。例如,我们通过输入 electronics NOT music 来匹配包含 electronics 但是不包含 music 的文档。
  • 利用前缀 - 排除关键词。例如,我们可以输入 +electronics -music 达到同样的目的。

这里需要注意的一点是,如果我们要用 url 的方式来实现组合查询,那么在使用 + 号的时候必须对其进行编码。正如我们在词组查询中提到的,+ 号在 url 中表示空格的含义,因此需要使用其对应的编码 %2B 来让 url 识别 + 号本身的运算逻辑。


六、更多查询

除了上面的基本查询,Solr 还有更多的查询示例。这里我们仅作简单展示,不予深入说明。

  • 指定返回字段 id
http://localhost:8983/solr/testCollection/select?q=${keyword}&fl=id
  • 分页查询
http://localhost:8983/solr/testCollection/select?q=${keyword}&start=0&row=100
  • 根据字段 id 排序
http://localhost:8983/solr/testCollection/select?q=${keyword}&sort=id+asc
  • 指定返回格式为 XML
http://localhost:8983/solr/testCollection/select?q=${keyword}&wt=xml
  • 返回某一时间范围内的数据
http://localhost:8983/solr/testCollection/select?q=time:%5B20180903+TO+20180904%5D

参考文章

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值