来到 ziroom 后,我使用 Solr 支持业务也有段时间了,大多数情况下 Solr 满足业务需求,但由于 Solr 随着数据量急剧上升后检索性能和更新索引效率衰退较快,同时一些历史遗留原因导致字段较多不易维护,现架构上已将搜索引擎迁移到了 ES。在这里整理记录自己使用 Solr 的点滴,供后续学习和使用时参考。
Solr的使用 系列的重点应是 Solr 的检索,如果需要可以直接传送到 Sorl检索 部分。
部署
由于该 Solr 平台只供学习使用,所以直接采用 Docker 方式部署,这样能避免一些复杂的依赖环境导致的问题。
下载
从 Hub 拉取 Solr 官方镜像 到本地,这里只选择 5.5 版本:
docker pull solr:5.5 |
安装
Docker 需要通过挂载宿主机目录的方式持久化数据,先创建供挂载目录(注意目录读写权限):
mkdir -p /home/docker/solr |
启动 容器,挂载数据目录,隐射监听端口:
docker --name solr -p 127.0.0.1:8983:8983 -v /home/docker/solr:/opt/solr/server/solr -d solr:5.5 |
我们往往需要修改容器的一些默认参数(Solr 的配置),需要我们登入容器:
docker exec -it solr /bin/bash |
注:由于容器中 /opt/solr/server/solr 会默认存在一些 Solr 启动的必须配置文件,直接将空目录挂载到该目录,会导致容器启动失败。可以先将目录挂载到 /opt/solr/mydata 目录,启动容器后
cp /opt/solr/server/solr/* /opt/solr/mydata/
,获得这些配置文件后,重新以上述地址挂载启动容器即可。
配置Web服务
Solr 容器启动成功后,配置 Web 服务器到 8983 端口,访问后看到 Solr Admin 页面,就表示安装成功了。
向 Solr 里推送数据,需要先建立 Core(核),然后在 Core 上创建或更新 Document(文档)。
新建Core
Core 默认路径为/opt/solr/server/solr
。有两种方式新建 Core,方式一 是使用命令:
bin/solr create_core -c books |
方式二:在 Admin 面板点击 “Core Admin >> Add Core”,填写 name、instanceDir、dataDir、config、schema(文档的字段类型描述) 信息即可。由于 config 和 schema 配置可由模板生成,所以我偏向于使用命令方式创建。
注:方式一和方式二,其实都是通过
/solr/admin/cores?action=CREATE
这个 API 来完成创建任务。
新建 Core 后,可选中 books 核,点击 “Files”,这里列举出后面需要使用的 2 个配置文件:
pwd |
新建Document(s)
Document 存放着数据记录,新建 Document 后就可以使用 Solr 检索了。这里需存入 book 的数据格式(例如 json)如下:
{ |
配置字段类型
如果没有配置字段映射类型推送数据时,Solr 会自动根据字段值设置字段的映射类型,并保存在core-name/conf/managed-schema
文件,但是有时结果并不是我们想要的,所以配置文档的字段类型描述很有必要。
从上述 book 的数据可得,各个 Document 的字段类型关系:
字段名 | 类型 | 是否只被索引 |
---|---|---|
id | string | √ |
cat | strings | |
name | string | |
author | strings | |
price | tdouble |
字段类型通过文件schema.xml
描述,需放置于 Core 的 conf 目录,文档格式可以参考managed-schema
文件,基本要素大致为:
|
注:如果后续更新 schema.xml 配置后,需要对 Core 进行 Reload 操作,否则检索时字段类型可能未变更。可以点击 “Core Admin >> Reload” 操作。
推送数据
Solr 支持的数据源类型较多,为 xml、json、csv 等格式。
方式一:使用 post 命令:
post工具 |
books.json
是以 json 格式描述的一些 book,可以批量推送数据。
方式二:在 Admin 面板点击 “books >> Documents”,在 Document(s) 一栏中输入一个 book 信息,并点击 “ Submit Document” 即可。成功右侧会返回:
Status: success |
也可以通过 检索,可以查看数据推送是否成功,检索结果为:
"docs": [ |
注:方式一和二其实是殊途同归,都是 POST 请求
solr/books/update?wt=json
这个 API。
删除Document(s)
删除 Document 其实也是 update 操作,同样有两种方式。
先使用 xml 格式构建需要删除 Document 的条件描述del-book.xml
,如删除 id 为 978-0641723445 的 book 信息:
<delete> |
方式一:同样使用 post 命令:
bin/post -c books server/solr/data/del-book.xml |
方式二:在 Admin 面板点击 “books >> Documents”,Document Type 项选择 xml,然后在 Document(s) 一栏中输入需要删除 book 的条件描述(del-book.xml 内容),并点击 “ Submit Document” 即可。
重新检索,可以发现 id 为 978-0641723445 的 book 信息已经被成功删除。
注:方式一和二都是 POST 请求
solr/books/update?wt=json
这个 API。
总结
本文仅仅叙述了 Solr 的 Docker 单节点部署和简单的数据推送实现,由于个人能力和时间限制,并未涉及到其生成环境的应用环节。后续的一篇文章将会记录 Solr 的检索语法和 PHP 作为客户端调用 Solr 服务的一种方案。
相关文章 »
- Solr的使用 — 检索 (2017-08-13)
