背景
常常在业务开发中会遇到大列表的查询需求或者按照各项条件搜索内容,一般的做法往往都是数据库直接关联查询搞定,但是到了一定程度这类需求会带来巨大的资源消耗,一个表格中涉及到了5张表的数据(这里暂且抛开数据库表设计是否合理),搜索要求从其中3张表的不同字段做到模糊查询,如果还用传统的方式实现起来就很难受了,不管是代码逻辑还是数据库性能都是一个考验,要是如果在 A 表一个字段类型是 text 内容又很长需要模糊匹配,在 B 表需要用简拼音搜索,那就难上加难了,不巧在应用市场业务中搜索场景上恰恰遇到了这些问题,但刚好 Solr 就解决了这些问题。
什么是Solr?
其实我们大多数人都是用过 Solr,也许你不会相信我说的这句话,但是事实确实如此啊!每当你想买自己喜欢的东东时,你可能会打开某宝或者某东,在搜索框一搜就能搜到很多东西,你知道你看到的这些数据都来自哪里吗?
现实生活中我们都知道大多数网站或应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用性能。
这就是为什么转移负载到一个外部的搜索服务器是一个不错的主意,Apache Solr 是一个流行的开源搜索服务器,它通过使用类似 REST 的 HTTP API,这就确保你能从几乎任何编程语言来使用 Solr。
Solr 是一个开源搜索平台,用于构建搜索应用程序。 它建立在 Lucene (全文搜索引擎)之上。 Solr 是企业级的,快速的和高度可扩展的。使用 Solr 构建的应用程序非常复杂,可提供高性能。
为了在 CNET 网络的公司网站上添加搜索功能,Yonik Seely 于 2004 年创建了 Solr。并在 2006 年 1 月,它成为 Apache 软件基金会下的一个开源项目。并于 2016 年发布最新版本 Solr 6.0,支持并行 SQL 查询的执行。
Solr 可以和 Hadoop 一起使用。由于 Hadoop 处理大量数据,Solr 帮助我们从这么大的源中找到所需的信息。不仅限于搜索,Solr 也可以用于存储目的。像其他 NoSQL 数据库一样,它是一种非关系数据存储和处理技术。
总之,Solr 是一个可扩展的,可部署,搜索/存储引擎,优化搜索大量以文本为中心的数据。
那有人可能会说搜索这玩意数据库本身就支持啊,干嘛还要搞个 Solr?
其实正如上面 Solr 的介绍中所说的那样:
- Solr 本身也可以看成数据库(NoSQL类型),但它比数据库搜索速度更快,所以在项目中,我们一般把搜索的部分交给 Solr,就像我们在某宝某东首页所看到的商品信息,并不是来自数据库,而是来源于 Solr 的索引库。
- 数据库本身不能实现分词效果,而只能使用模糊查询,但是模糊查询非常低效,查询速度比较慢,由于在实际业务场景中,一般搜索还是用的比较多的,这样数据库压力自然就很大,所以我们就让专业的 Solr 来做搜索功能。
也有人会说索引运用比较多的还有 ES,而且还有良好的性能,为什么选择 Solr?
我们不妨来对比下 Solr 和 ES
Solr 的特点:
- 通过 zookeeper 进行集群管理
- 支持丰富的数据源,可以直接使用 mysql 作为数据源
- 和 hadoop 生态结合的比较好,可以索引文件直接落入 hdfs 实现无限扩容
- 自带查询功能强大,新手都能很容易上手
Elasticsearch 特点:
- 效率快,自带一些图表分析的功能
- restful 的查询方式
- 可以通过 Logstash 来支持 mysql 数据源
Solr 和 Elasticsearch 主要区别:
- Solr 原生支持 mysql 数据源,ES 需要 Logstash 来扩展支持(虽然都是一家的产品)
- Elasticsearch 在数据量较多的情况下速度比 Solr 快
- 数据源 Solr 支持的更好,ES 只支持 json 数据源
- 集群上 SolrCloud 比 ES 部署简单
- 分词上都支持中文和拼音分词
- Solr webUI 更方便观察服务运行情况和调试索引
安装
环境准备
安装 tomcat
和 jdk1.8
,这里还是照例使用的 oneinstack 安装脚本。
wget -c http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --tomcat_option 2 --jdk_option 2 --reboot
安装Solr
mkdir /app/install && cd /app/install
wget https://mirror.bit.edu.cn/apache/lucene/solr/7.7.2/solr-7.7.2.tgz
tar -zxvf solr-7.7.2.tgz
mv solr-7.7.2 /usr//local/
vim /etc/profile
export PATH=/usr/local/solr-7.7.2/bin:$PATH
source /etc/profile
启动Solr
solr start
WARNING: Starting Solr as the root user is a security risk and not considered best practice. Exiting.
Please consult the Reference Guide. To override this check, start with argument '-force'
solr start -force
Warning: Available entropy is low. As a result, use of the UUIDField, SSL, or any other features that require
RNG might not work properly. To check for the amount of available entropy, use 'cat /proc/sys/kernel/random/entropy_avail'.
Waiting up to 180 seconds to see Solr running on port 8983 [-]
Started Solr server on port 8983 (pid=3143). Happy searching!
通过访问 8983 端口就可以进入到 Web UI,一开始访问不通,还以为安装有问题,后来一想 8983 端口没有对外开通访问,添加安全组规则后就好了。
配置tomact启动Solr
配置Solr
虽然直接启动也可以,但是通过 tomact
的方式更加可控为了后续的集群配置也更加推荐使用 tomact
启动 Solr
。
/data/wwwroot/default
下面
在
tomcat
包下的 webapps
目录新建一个目录,取名 solr
cd /data/wwwroot/default
mkdir solr
将 solr
解压包 server/solr-webapp/webapp
、 server/lib
、dist
下的一些内容拷贝到刚才新建的目录下
cp -rf /usr/local/solr-7.7.2/server/solr-webapp/webapp/* /data/wwwroot/default/solr
cp -rf /usr/local/solr-7.7.2/server/lib/ext/* /data/wwwroot/default/solr/WEB-INF/lib
cp -rf /usr/local/solr-7.7.2/server/lib/metrics-* /data/wwwroot/default/solr/WEB-INF/lib
cp -rf /usr/local/solr-7.7.2/dist/solr-dataimporthandler-extras-7.7.2.jar /data/wwwroot/default/solr/WEB-INF/lib
cp -rf /usr/local/solr-7.7.2/dist/solr-dataimporthandler-7.7.2.jar /data/wwwroot/default/solr/WEB-INF/lib
在本地的 /home
目录下新建一个 solr_home
的文件夹,将 solr-7.7.2/server/solr
下的内容拷贝到刚才新建的 solr_home 下
mkdir /home/solr_home
cp -rf /usr/local/solr-7.7.2/server/solr/* /home/solr_home/
打开并编辑 /tomcat/webapps/solr/WEB-INF/web.xml
并且注释文件末尾的所有元素节点
vim /data/wwwroot/default/solr/WEB-INF/web.xml
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/home/solr_home</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
<!--
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>
-->
配置Solr日志(可选)
将 /solr-7.7.2/server/resources/
下的 log4j2.xml
文件拷贝到 solr/WEB-INF/classes/
下,如果没有则自己创建一个。
分别给予权限
chown -R www:www /home/solr_home/
chown -R www:www /data/wwwroot/default/solr/
访问对应端口即可
http://dev.lyafei.com:8080/solr/index.html#/