1. 什么是Solr
Solr是一个独立的基于全文检索的企业级搜索应用服务器。将文档通过Http利用XML加载到Solr的搜索集合中;然后用户通过Http Get操作发送查找请求,并得到搜索的返回结果。
2. Solr服务器搭建与配置
2.1. 服务器搭建
Solr是由Java开发的,所以服务器的搭建需要Java环境,同时这里介绍在Linux系统中采用Tomcat进行Solr服务搭建步骤。步骤如下:
第二步:上传到Linux系统,并解压两个压缩包。
第三步:找到Solr解压包目录中的/example/webapps/solr.war文件复制到tomcat解压包目录中的/webapps文件夹下,然后cd到tomcat的bin目录,运行tomcat,将会自动把solr.war文件进行解压。
第四步:将Solr解压包目录/example/lib/ext/中的所有jar包复制到刚刚解压的solr工程目录路径/WEB-INF/lib/的文件夹下面。
第五步:创建solrhome空文件夹,将Solr解压包目录/example/solr/下的所有文件复制到新建的文件夹中。
第六步:关联solr工程和solrhome,此时需要修改solr工程中目录/WEB-INF/下的web.xml文件。将<env-entry>标签取消注释,并修改<env-entry-value>标签的值为刚刚创建的solrhome文件夹的全路径。
第七步:启动tomcat,输入地址访问,出现如下图所示,表示搭建成功。
2.2. 配置业务域
Solr会自带一个id域,但是其他的搜索关键词需要再schema.xml文件中进行配置。因为搜索会涉及到中文搜索,所以首先需要配置中文分析器,这里我们采用IKAnalyzer分词器进行处理,具体操作步骤如下:
第一步:下载IKAnalyzer中文分析器相关文件,提取码:2bgc
第二步:将IKAnalyzer包下的所有文件上传至Linux系统
第三步:将IKAnalyzer.jar添加到Solr工程的WEB-INF/lib目录下,并把其与三个文件(扩展词典和配置文件)放到Solr工程的WEB-INF/classes目录下,若没有此目录请自行创建。
第四步:修改solrhome/collection1/conf/目录下的schema.xml文件,在最后添加配置一个自己的域类型FieldType,并指定使用IKAnalyzer,同时添加需要搜索的关键词业务域和备份配置(indexed:是否被搜索;stored:是否存储;multiValued:是否存在多个值;type:分词类型)。
第五步:重启tomcat,出现下图所示表示配置成功。
2.3. 删除所有数据(扩充,可不了解)
如下命令操作可以清空添加搜索的所有数据。
3. Java中SolrJ的使用
3.1. SolrJ使用前配置
在Maven工程中的pom.xml文件中添加SolrJ的使用配置。
<dependencies>
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.3</version>
</dependency>
</dependencies>
3.2. 添加文档
第一步:创建一个SolrServer,使用HttpSolrServer创建对象。
第二步:创建一个文档对象SolrInputDocument。
第三步:向创建的文档对象中添加域内容,必须有id域,同时域的名称必须在schema.xml中定义,否则将操作失败。
第四步:把文档对象添加到SolrServer中,并提交。
@Test
public void add() throws Exception{
//1.创建solrserver 建立连接 需要指定地址
SolrServer solrServer = new HttpSolrServer("http://192.168.25.129:8080/solr");
//2.创建solrinputdocument
SolrInputDocument document = new SolrInputDocument();
//3.向文档中添加域
document.addField("id", "testid1");
document.addField("myTitle", "这是一个测试标题");
//4.将文档提交到索引库中
solrServer.add(document);
//5.提交
solrServer.commit();
}
3.3. 删除文档
3.3.1. 根据id删除
第一步:创建SolrServer对象。
第二步:调用SolrServer对象的根据id删除的方法。
第三步:提交
@Test
public void deleteById() throws Exception {
// 第一步:创建一个SolrServer对象。
SolrServer solrServer = new HttpSolrServer("http://192.168.25.129:8080/solr");
// 第二步:调用SolrServer对象的根据id删除的方法。
solrServer.deleteById("testid222");
// 第三步:提交。
solrServer.commit();
}
3.3.2. 根据查询删除
第一步:创建SolrServer对象。
第二步:调用SolrServer对象的根据条件删除的方法。需要注意的是参数格式为“业务域:搜索内容”,同时该方法可以进行批量删除。
第三步:提交
@Test
public void deleteByQuery() throws Exception {
SolrServer solrServer = new HttpSolrServer("http://192.168.25.129:8080/solr");
solrServer.deleteByQuery("myTitle:测试标题");
solrServer.commit();
}
3.4. 查询索引库
第一步:创建一个SolrServer对象
第二步:创建一个SolrQuery对象。
第三步:向SolrQuery中添加查询条件或者过滤条件。
第四步:执行查询。得到一个Response对象。
第五步:取查询结果。
第六步:遍历结果并打印。
3.4.1. 简单查询
@Test
public void queryDocument() throws Exception {
// 第一步:创建一个SolrServer对象
SolrServer solrServer = new HttpSolrServer("http://192.168.25.129:8080/solr");
// 第二步:创建一个SolrQuery对象。
SolrQuery query = new SolrQuery();
// 第三步:向SolrQuery中添加查询条件、过滤条件。。。
query.setQuery("*:*");
// 第四步:执行查询。得到一个Response对象。
QueryResponse response = solrServer.query(query);
// 第五步:取查询结果。
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("查询结果的总记录数:" + solrDocumentList.getNumFound());
// 第六步:遍历结果并打印。
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("myTitle"));
System.out.println(solrDocument.get("myBrief"));
}
}
3.4.2. 带高亮显示查询
@Test
public void queryDocumentWithHighLighting() throws Exception {
// 第一步:创建一个SolrServer对象
SolrServer solrServer = new HttpSolrServer("http://192.168.25.129:8080/solr");
// 第二步:创建一个SolrQuery对象。
SolrQuery query = new SolrQuery();
// 第三步:向SolrQuery中添加查询条件、过滤条件。。。
query.setQuery("简介");
//指定默认搜索域
query.set("df", "myKeywords");
//开启高亮显示
query.setHighlight(true);
//高亮显示的域
query.addHighlightField("myTitle");
query.setHighlightSimplePre("<em>");
query.setHighlightSimplePost("</em>");
// 第四步:执行查询。得到一个Response对象。
QueryResponse response = solrServer.query(query);
// 第五步:取查询结果。
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("查询结果的总记录数:" + solrDocumentList.getNumFound());
// 第六步:遍历结果并打印。
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get("id"));
//取高亮显示
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
List<String> list = highlighting.get(solrDocument.get("id")).get("myTitle");
String itemTitle = null;
if (list != null && list.size() > 0) {
itemTitle = list.get(0);
} else {
itemTitle = (String) solrDocument.get("myTitle");
}
System.out.println(itemTitle);
System.out.println(solrDocument.get("myBrief"));
}
}
4. 关于Solr集群SolrCloud
SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。
5. Solr集群的搭建
搭建Solr集群首先需要的是Zookeeper集群,通过Zookeeper集群管理工具进行SolrCloud的集群管理、配置文件管理和集群的入口。下面将通过3个zookeeper服务器和4个Solr服务器进行SolrCloud的搭建。
5.1. Zookeeper集群搭建
在Zookeeper集群中,会有一个投票机制,一般集群服务器为奇数,他们会投票选举出Master和Slave,进行集群的相关操作。搭建集群,首先在一台Zookeeper服务器上进行相关配置文件的配置,然后拷贝到其他两台服务器上,进行相应的修改,具体操作步骤如下:
第一步:下载zookeeper压缩包,上传到Linux系统并解压。
第二步:将conf文件夹下的zoo_sample.cfg文件改名为zoo.cfg。
第三步:在解压目录下创建一个data目录,作为zookeeper数据的真实目录。
第四步:在data目录下创建一个myid文件,内容为每个实例的id。第一台台服务器为1,其他的如:2、3。
第五步:vim打开zoo.cfg文件,修改dataDir属性,指定上一步的data目录路径。并在zoo.cfg文件的最后,添加三个服务器的关于zookeeper的内部访问地址和端口,ip后面的两个端口号分别表示:内部通讯端口和投票选举端口。注意单台服务器的内部通讯端口和投票选举端口不能重复。
第六步:将这一台服务器里的zookeeper拷贝到另外两台服务器中,同时修改myid文件分别为2、3。如果data路径有所变化,请注意修改配置文件dataDir。
第七步:同时启动三台服务器zookeeper服务,进入bin目录,操作操作如下:
启动zookeeper:./zkServer.sh start
关闭zookeeper:./zkServer.sh stop
查看zookeeper状态:./zkServer.sh status,此时如果显示mode: follower,则表明集群搭建成功。
5.2. Solr集群的搭建
思路还是先完整的搭建一台Solr服务器,然后拷贝到其他三台里面去。前六步的操作步骤请参看2.1.章节,这里从第七步开始。
第七步:将tomcat工程和solrhome文件夹拷贝到其他三台服务器中,注意对应的路径配置修改。
第九步:使用前面第二步解压的solr包路径下的/root/solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh文件,把任意服务器下的solrhome/collection1/conf目录上传到zookeeper集群中,并改名为myconf。(注意,此时zookeeper集群必须是启动状态)
./zkcli.sh -zkhost 192.168.25.129:2181,192.168.25.130:2181,192.168.25.131:2181 -cmd upconfig -condir /usr/local/softwares/solr4.10.3/solrhome/collection1/conf -confname myconf
第十步:修改4个solr服务器tomcat下的bin目录下的catalina.sh文件,关联solr集群和zookeeper集群。将以下配置添加到catalina.sh文件中:
JAVA_OPTS="-DzkHost=192.168.25.129:2181,192.168.25.130:2181,192.168.25.131:2181"
第十一步:启动每一个tomcat实例,同时保持zookeeper集群是启动状态,输入任意solr工程访问地址,访问集群。
5.3. Solr集群分片与删除处理
Solr集群的分片与删除都只需要通过访问地址的形式就可以实现。
分片处理:访问地址+端口+ /solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
删除处理:访问地址+端口+/solr/admin/collections?action=DELETE&name=collection1
6. 使用SolrJ操作集群
6.1. SolrJ使用前配置
在Maven工程中的pom.xml文件中添加SolrJ的使用配置。
<dependencies>
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.3</version>
</dependency>
</dependencies>
6.2. 添加文档
第一步:创建一个SolrServer对象,需要使用CloudSolrServer子类。构造方法的参数是zookeeper的地址列表。
第二步:设置DefaultCollection属性。
第四步:创建一个SolrInputDocument对象。
第五步:向文档对象中添加对应域的值。
第六步:把文档对象写入索引库,并提交。
@Test
public void testAdd() throws Exception{
//1.创建solrserver 集群的实现类
//指定zookeeper集群的节点列表字符串
CloudSolrServer cloudSolrServer = new CloudSolrServer("192.168.25.129:2181,192.168.25.130:2181,192.168.25.131:2181");
//2.设置默认的搜索的collection 默认的索引库(不是core所对应的,是指整个collection索引集合)
cloudSolrServer.setDefaultCollection("collection1");
//3.创建solrinputdocumenet对象
SolrInputDocument document = new SolrInputDocument();
//4.添加域到文档
document.addField("id", "testcloudid");
document.addField("myTitle", "测试云的值");
//5.将文档提交到索引库中
cloudSolrServer.add(document);
//6.提交
cloudSolrServer.commit();
}
6.3. 查询文档
创建一个CloudSolrServer对象,其他处理和3.3章节一致。
文档下载地址
https://wenku.baidu.com/view/c11b5e36fd00bed5b9f3f90f76c66137ee064fbd