solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
1、solr介绍
solr基于Lucene的流行、高性能的开源企业级搜索平台。Lucene下的子项目。可以独立地提供全文搜索服务。在互联网项目里面,绝大部分是用全文检索服务器,lucense(基于java的全文检索api)和solr(基于lucense的全文检索服务器)都可以实现。用lucense需要自己来管理维护索引库,进行索引库的优化,缓存的添加。而solr配置一下就好了,比较方便。
- solr本质上是一个war包,然后部署到servlet容器中,容器你可以选择用tomcat,也可以选择更加轻量级的jetty
- 官网链接: https://lucene.apache.org/solr
Solr的特性
1)独立的企业级搜索服务,基于http以类-REST API 对外提供服务
- 你可以通过http协议将文档以JSON/XML/CSV/binary格式发送给Solr进行索引。
- 你通过http GET 请求进行查询,可返回JSON/XML/CSV/binary格式的搜索结果。
2)近实时的索引能力
- 文档数据提交索引后,立马就可看到。
3)先进的全文检索能力
- 基于Lucene的强大搜索能力,支持任意数据类型的短语、通配、连接、分组等等查询
4)综合的管理界面
- Slor内建了综合的管理用户界面,让你方便的管理你的solr实例
5)通过简单的配置方式来提供高灵活性、适用性
6)高伸缩和容错能力
- 基于zookeeper,solr支持分布式、备份、再平衡,来提供高伸缩和容错能力
7)插件体系架构,易扩展
- Solr发布了许多定义良好的扩展点,这使得插件很容易插入索引和查询时的过程中。
Solr应用架构
要在系统中使用Solr只需完成以下三个步骤即可:
- 在solr中定义一个schema(模式),来告诉solr你要索引的文档document由哪些Field构成。
- 将需要让用户搜索的文档发送给solr
- 在你的应用中公开搜索功能。应用的搜索功能通过调用Solr的搜索API实现。
2、solr的下载及安装
2.1 下载solr
下载solr,然后解压即可,windows和linux都可以下载 .tgz(.tgz本质是.tar.gz),和.zip解压出来都一样的。solr下载地址:
2.2 环境准备
Solr是java开发的,所以我们的环境需要安装jdk(JDK1.8及以上),另外Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中,我们这里选择自带的jetty服务器。
- linux下jdk的安装参考:Linux下JAVA WEB服务器的搭建一(JDK\MYSQL\TOMCAT)
2.3 解压solr
把solr 的压缩包上传到Linux系统,然后解压。
tar -zxvf solr-8.9.0.tgz -C /usr/local/
如果是使用tomcat服务器,需要执行以下步骤:
- 把解压的solr\server 下面的 solr-webapp 放到 tomcat 的 webapps 下面,修改solr-webapp为solr。
- 将 solr\server\lib\ext 下的所有jar包拷贝到tomcat的 webapps\solr\WEB-INF\lib 目录。
- 将 solr\server\resources 下的 log4j.properties 配置文件拷贝到tomcat的 webapps\solr\WEB-INF\classes 目录。
目录说明:
bin/ 该目录中包含几个重要的脚本。
solr/solr.cmd 这是 Solr 的控制脚本,用于启动和停止 Solr 服务。在 SlorCloud 模式下运行时,可以创建集合或内核,配置身份验证以及使用配置文件。
post 用于发布内容到 solr 的一个简单的命令行工具。
solr.in.sh/solr.in.cmd 此处配置 Java,Jetty 和 Solr 的系统级属性,即全局属性。
install_solr_services.sh 在 linux/unix 系统上将 Solr 安装为服务。
contrib/ 该目录包含 Solr 专用功能的附加插件。
dist/ 该目录包含主要的 Solr jar 文件。
docs/ solr 帮助文档。
example/ 包含几种演示各种 Solr 功能的示例。
licenses/ 包含 Solr 使用的第三方库的所有许可证。
server/ 该目录是 Solr 应用程序的核心所在:
- Solr 的 Admin UI(server/solr-webapp)
- Jetty 库(server/lib)
- 日志文件(server/logs)和日志配置(server/resources)
- 示例配置(server/solr/configsets)
2.4 创建索引核心库
到 /solr-8.9.0/server/solr下创建索引核心库: demoCore,然后将 /solr-8.9.0/server/solr/configsets/_default下的conf复制到新建索引核心库demoCore下
mkdir demoCore
cp -r /solr-8.9.0/server/solr/configsets/_default/conf /solr-8.9.0/server/solr/demoCore
2.5 配置中文分词器
使用自带的中文分词器 lucene-analyzers-smartcn,将lucene-analyzers-smartcn.jar 复制到 solr-8.9.0/server/solr-webapp/webapp/WEB_INF/lib下。(也可以到官网/Maven 中央仓库(https://search.maven.org/) 下载IK分词器的jar包)
cp /solr-8.9.0/contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-8.9.0.jar /solr-8.9.0/server/solr-webapp/webapp/WEB-INF/lib
maven仓库地址
<dependency>
<groupId>com.github.magese</groupId>
<artifactId>ik-analyzer</artifactId>
<version>8.4.0</version>
</dependency>
在核心demoCore的conf里的managed-schema添加以下内容:
<!-- 配置中文分词器 -->
<fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>
IK 分词器详细的使用可参考官网说明:https://github.com/magese/ik-analyzer-solr
2.6 采用自带的jetty启动
采用自带的jetty启动,默认的端口是8983,进入到 /solr-8.9.0/bin目录:
启动命令:./solr start -force
停止命令:./solr stop -all
重启命令:./solr restart -force
指定端口启动命令:./solr start [-p port]
指定端口停止命令:./solr stop [-p port]
- 如果不指定端口,默认为 8983。
2.7 访问和配置
访问方式 http://ip:端口号/solr,例如: http://120.78.180.121:8983/solr
如果没有执行上述步骤4(即没有创建索引核心库),而是解压后直接采用步骤6启动访问,再通过solr管理界面创建索引核心库,则下图圈起的两处索引库名称可以随便填写(如orderCore),最好保持两处名称一致,然后保存,否则会提示保存报错,无法找到orderCore的solrconfig.xml。
这时需要从步骤2开始执行到步骤5。 创建你刚才所填写的名称库orderCore,重新启动访问,重新添加你刚才的索引库orderCore,保存则会成功。
2.8 添加需存储字段
添加需存储字段步骤为:
- 1 选择所创建的核心库
- 2 点击Schema
- 3 添加字段
- 4 填写字段名称
- 5 选择字段类型
具体情况可以根据实际业务需求来做,如下图。
可以在 managed-schema 中查看添加的字段信息:
<field name="about" type="text_ik" uninvertible="true" indexed="true" stored="true"/>
<field name="age" type="pint" uninvertible="true" indexed="true" stored="true"/>
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
<field name="name" type="text_ik" uninvertible="true" indexed="true" stored="true"/>
<field name="poems" type="text_ik" uninvertible="true" indexed="true" stored="true"/>
<field name="success" type="text_ik" uninvertible="true" indexed="true" stored="true"/>
2.9 添加/更新文档
{"id": "123456","age": 40,"name": "李白","poems": "望庐山瀑布","about": "字太白","success": "创造了古代浪漫主义文学高峰、歌行体和七绝达到后人难及的高度"},
{"id": "123457","age": 31,"name": "杜甫","poems": "望岳","about": "字子美","success": "唐代伟大的现实主义文学作家,唐诗思想艺术的集大成者"}
2.10 查询文档
2.11 配置Solr管理界面权限
solr启动后默认是不用登入即可访问Solr管理界面的,这样暴露了Solr核心库,容易引起他人删除索引库数据,故配置登入权限才可访问Solr管理界面,步骤如下:
- 进入到 /solr-8.9.0/server/etc
- 在此目录下新建role.properties 配置文件(名字随意)打开文件进行编辑 , 内容如下:
#用户名 密码 权限
user:pass,admin
(如:admin:123456,admin)
也可配置多用户:
#用户名 密码 权限
user: pass,admin
user1: pass,admin
user3: pass,admin
- 添加获取用户文件的配置
找到目录: /solr-8.9.0/server/contexts,打开solr-jetty-context.xml文件进行编辑,在文件configure中添加获取用户文件的配置,内容如下:
<Get name="securityHandler">
<Set name="loginService">
<New class="org.eclipse.jetty.security.HashLoginService">
<Set name="name">admin</Set> <!--名称-->
<!-- 配置刚刚创建的角色文件地址 -->
<Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/role.properties</Set>
</New>
</Set>
</Get>
- 编辑web.xml
进入到 /solr-8.9.0/server/solr-webapp/webapp/WEB-INF下,编辑web.xml文件,在文件中找到security-constraint的配置,在之后追加以下内容,然后保存重启Jetty即可,此时再访问则需要登入。
<security-constraint>
<web-resource-collection>
<web-resource-name>Solr</web-resource-name>
<url-pattern>/</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name> <!-- 此处填写为你role.properties中设置的的角色名称 -->
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>admin</realm-name> <!-- 此处填写为你role.properties中设置的的用户名称-->
</login-config>
评论区