Server : Ubuntu 16.04
Java Version : 1.8
Solr Version : 7.4.0
Solr 刚刚安装后,是没有任何数据的,所以此时我们无法进行任何查询。幸运的是,官方为用户提供了索引工具以及样本数据,方便新手快速建立索引。
首先,我们先看一下索引工具和样本数据分别位于哪个位置。
/{solr_home}/bin/post
/{solr_home}/example/exampledocs
在样本数据中,包含了 json
、csv
、xml
、html
等多种格式的数据。尽管如此,官方提供的 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 提供多种数据查询方式,这里仅介绍两种。
Solr 启动后,我们可以通过 http://localhost:8983/solr
访问 Solr 的管理页面,如下图所示:
进行查询前,我们首先要选择集合。选中集合后,点击集合下的 Query
选项卡:
此时,页面上会弹出如下图所示的查询窗口。点击 Execute Query
按钮,即可在页面右侧看到 Solr 返回的数据。默认情况下,Solr 会以 JSON
格式返回 10 条记录。
实际上,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 | 表示否 |
() | 用于构成子查询 |
[] | 范围查询,包含头尾 |
{} | 范围查询,不包含头尾 |
+ | 存在运算符,表示文档中必须存在 “+” 号后的项 |
- | 不存在运算符,表示文档中不包含 “-” 号后的项 |
如果我们想在 Solr 中查询包含某个关键词 foundation
的文档,可以直接在管理界面的 q
参数输入框中输入该关键词,然后点击 Execute Query
按钮。此时,我们可以在页面上看到如下结果:
如果想使用 url 方式完成相同的查询,只需将默认的 q=*:*
替换成 q=foundation
即可。完整的 URL 为:http://localhost:8983/solr/testCollection/select?q=*:*
。
有时候,我们想通过某个字段的值来查询文档,正如我们当初使用 SQL 语句 select * from table where field = 'xxx'
查询数据库记录一样。此时,我们只需要将 q
参数默认的 *:*
改为 字段名:字段值
即可。
例如,我们现在在管理界面 q
参数输入框中输入 cat:electronics
,可以看到如下结果:
如果使用 url 完成此查询,只需在浏览器输入完整的 URL : http://localhost:8983/solr/testCollection/select?q=cat:electronics
。
有时候,我们不仅想依赖于某个单词来查询文档,而是想通过词组(单词间有空格)来完成查询工作。如果此时我们想使用管理界面完成该查询,首先要使用双引号将词组包含起来,然后再输入到输入框中。
例如,我们输入词组 "CAS latency"
,得到如下结果:
另一方面,如果我们想使用 url 完成相同的查询,就需要对空格进行处理。一般来说,有两种处理方式:
转换为 %20
,相应的 URL 为:http://localhost:8983/solr/testCollection/select?q="CAS%20latency"
+
号,对应的 URL 为:http://localhost:8983/solr/testCollection/select?q="CAS+latency"
假如我们希望得到同时匹配多个关键词的文档,这时候,我们该怎么做?Solr 的组合查询可以满足我们的需求。这里介绍两种实现组合查询的方法:
AND
将多个查询条件连接起来。例如,我们通过输入 electronics AND music
来匹配同时包含 electronics
和 music
的文档。+
将多个查询条件连接起来。例如,我们可以输入 +electronics +music
实现相同的查询。我们注意到,上述两个组合查询,都是用于查找同时存在 electronics
和 music
的文档。但如果我们的需求发生变化了呢?比如说,我们现在希望能找到存在 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
CommonQueryParameters - Solr Wiki
Solr 学习(5) —- Solr查询语法和参数 - 奔跑的面包 - ITeye博客