搜索服务器之Solr

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350