最近在做的项目,因为涉及到某些表的数据量会有百万级,首先想到的是进行分表(sharding-jdbc)。但经过一番尝试后,还是选择docker+solr对数据进行查询分页。
Solr是什么?
Solr 是基于 Lucene 的面向企业搜索的 web 应用 Solr 是一个独立的企业级搜索应用服务器,它对外提供类似于 Web-service 的 API 接 口。可以通过 http 请求提交一定格式的 XML 文件,生成索引;也 可以通过 Http Get 操作提出查找请求,并得到 xml/json 格式的返回结果。Solr 是一个高性能,采用 Java5 开发,基于 Lucene 的全文搜索服务器。同时对其进行 了扩展,提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能 进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文检索引擎。 文档通过 Http 利用 XML 加到一个搜索集合中。查询该集合也是通过 http 收到一个 XML/JSON 响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高 亮显示搜索结果,通过索引复制来提高可用性,提供一套强大 Data Schema 来定义字段, 类型和设置文本分析,提供基于 Web 的管理界面等。
与ElasticSearch(ES)相比,为什么选择solr?
- Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式。
- Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。此次项目对于实时搜索要求不高。
- Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
- 在测试环境上用docker部署了es,把服务器弄崩了,运行环境要求还是比较高的。solr相比于es较轻。
下载安装、配置ik、索引数据导入
1、下载镜像,选择8.1.1版本
docker pull solr:8.1.1
2、可以选择docker-compose启动,此处选择run启动了一个名为solr 的容器,将主机的端口8983映射到容器中的端口8983,-d表示已守护进程deamon
的方式运行
docker run -it -d -p 8983:8983 --name solr solr:8.1.1
启动成功后,访问http://ip:8983/solr/
3、创建core,相当于关系型数据库中表的概念。
上述错误是因为文件不存在引起的。
进入容器:
docker exec -it --user=root solr /bin/bash
复制默认配置文件:
cp -r /opt/solr/server/solr/configsets/_default/conf /var/solr/data/medical_verify/
之后再创建就可以成功:
4、运行8.1.1版本的solr,配置文件的挂载自动是做好的,测试过7.4版本的是没有的需要自己-v。
docker inspect solr
进入到宿主机的source目录,发现solr容器中的var/solr配置文件都在此
5、配置ik分词:因为solr默认的分词处理没有很好的将搜索语句进行分词,所以需要配置ik。
准备ik包:ik-analyzer-solr.jar 适用7或者8版本solr
百度网盘地址:https://pan.baidu.com/s/17Kr31ueRq_IreoOhGSP4pw 提取码:lpcl
下载后拷贝到:
docker cp ./ik-analyzer-solr.jar solr:/opt/solr/server/solr-webapp/web-app/WEB-INF/lib
进入{source}/data/core_medical/conf修改managed-schema,新增如下内容:
<fieldType name ="text_ik" class ="solr.TextField">
<!-- 索引时候的分词器-->
<analyzer type ="index" isMaxWordLength ="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<!--查询时候的分词器-->
<analyzer type ="query" isMaxWordLength ="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
进入{source}/data/core_medical/conf修改solrconfig.xml,新增标红部分内容:
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs/" regex="ik-analyzer-solr.jar" />
按下Reload键重启:
此时进行到此core的分析可以看到出现了text_ik选项:
6、导入数据,此处是以oracle为例:
没有配置DataImportHandler 时会出现如下页面:
进入{source}/data/core_medical/conf修改solrconfig.xml,新增如何下内容:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">medical-config.xml</str>
</lst>
</requestHandler>
新建文件:medical_verify.xml
修改managed-schema文件,增加fileId:
- name : 字段的名称
- type : 字段的类型
- indexed :是否索引,索引的话就能查询到,否则,搜索的时候,不会出现
- stored : 是否存储到索引库里面
- required:是否必须
- multiValued:是否多个值
- Unique:字段是否可以重复
重启core后,进行数据导入
进入到查询页面,可以看到数据已经导入:
q 查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,
fl 指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort
start 返回结果的第几条记录开始,一般分页用,默认0开始
rows 指定返回结果最多有多少条记录,默认值为 10,配合start实现分页
sort 排序方式,例如id desc 表示按照 “id” 降序
wt (writer type) 指定输出格式,有 xml, json, php等
fq (filter query) 过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,并且sort是1到5之间的。
df 默认的查询字段,一般默认指定。
qt (query type) 指定那个类型来处理查询请求,一般不用指定,默认是standard。
indent 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试 json,php,phps,ruby输出才有必要用这个参数。
version 查询语法的版本,建议不使用它,由服务器指定默认值。
以上就是solr的安装、配置、注意事项的说明。仅供日后方便查看,有不足的地方请勿喷。
java部分,使用solrj,对索引数据进行检索分页,将在下篇中记录。