搜索服务器之Solr

2020-05-09  本文已影响0人  Demon先生

1. 什么是Solr

Solr是一个独立的基于全文检索的企业级搜索应用服务器。将文档通过Http利用XML加载到Solr的搜索集合中;然后用户通过Http Get操作发送查找请求,并得到搜索的返回结果。

2. Solr服务器搭建与配置

2.1. 服务器搭建

Solr是由Java开发的,所以服务器的搭建需要Java环境,同时这里介绍在Linux系统中采用Tomcat进行Solr服务搭建步骤。步骤如下:

第一步:准备Tomcat压缩包Solr压缩包

第二步:上传到Linux系统,并解压两个压缩包。

第三步:找到Solr解压包目录中的/example/webapps/solr.war文件复制到tomcat解压包目录中的/webapps文件夹下,然后cd到tomcat的bin目录,运行tomcat,将会自动把solr.war文件进行解压。

image.png

第四步:将Solr解压包目录/example/lib/ext/中的所有jar包复制到刚刚解压的solr工程目录路径/WEB-INF/lib/的文件夹下面。

image.png

第五步:创建solrhome空文件夹,将Solr解压包目录/example/solr/下的所有文件复制到新建的文件夹中。

第六步:关联solr工程和solrhome,此时需要修改solr工程中目录/WEB-INF/下的web.xml文件。将<env-entry>标签取消注释,并修改<env-entry-value>标签的值为刚刚创建的solrhome文件夹的全路径。

image.png

第七步:启动tomcat,输入地址访问,出现如下图所示,表示搭建成功。

image.png

2.2. 配置业务域

Solr会自带一个id域,但是其他的搜索关键词需要再schema.xml文件中进行配置。因为搜索会涉及到中文搜索,所以首先需要配置中文分析器,这里我们采用IKAnalyzer分词器进行处理,具体操作步骤如下:

第一步:下载IKAnalyzer中文分析器相关文件,提取码:2bgc

image.png

第二步:将IKAnalyzer包下的所有文件上传至Linux系统

第三步:将IKAnalyzer.jar添加到Solr工程的WEB-INF/lib目录下,并把其与三个文件(扩展词典和配置文件)放到Solr工程的WEB-INF/classes目录下,若没有此目录请自行创建。

image.png

第四步:修改solrhome/collection1/conf/目录下的schema.xml文件,在最后添加配置一个自己的域类型FieldType,并指定使用IKAnalyzer,同时添加需要搜索的关键词业务域和备份配置(indexed:是否被搜索;stored:是否存储;multiValued:是否存在多个值;type:分词类型)。


image.png

第五步:重启tomcat,出现下图所示表示配置成功。

image.png

2.3. 删除所有数据(扩充,可不了解)

如下命令操作可以清空添加搜索的所有数据。

2222.png

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来满足这些需求。

Solr集群的系统构架图.png

SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。

Zookeeper集群与SolrCloud关系图.png

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后面的两个端口号分别表示:内部通讯端口和投票选举端口。注意单台服务器的内部通讯端口和投票选举端口不能重复。

image.png

第六步:将这一台服务器里的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"
image.png

第十一步:启动每一个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

上一篇下一篇

猜你喜欢

热点阅读