Java高级技术day81:Solr索引库

一、Solr的安装

1.Solr的介绍:

的数据总体分为两种:结构化数据和非结构化数据。
(1)结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
(2)非结构化数据:指不定长或无固定格式的数据,如邮件,word 文档等。 非结构化数据又一种叫法叫全文数据。
按照数据的分类,搜索也分为两种:
(1)对结构化数据的搜索:如对数据库的搜索,用 SQL 语句。
(2)对非结构化数据的搜索:如利用 windows 的搜索也可以搜索文件内容,Linux 下的 grep 命令,再如用 Google 和百度可以搜索大量内容数据。

1.1 Lucene:

Lucene 是一个高效的,基于 Java 的全文检索库。
Lucene 是 apache 软件基金会 4 jakarta 项目组的一个子项目,是一个开放源代码的全 文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构, Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现 全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene 是一套用于全文 检索和搜寻的开源程序库,由 Apache 软件基金会支持和提供。Lucene 提供了一个简单却 强大的应用程序接口,能够做全文索引和搜寻。在 Java 开发环境里 Lucene 是一个成熟的 免费开源工具。就其本身而言,Lucene 是当前以及最近几年最受欢迎的免费 Java 信息检 索程序库。

1.2Solr是什么?

Solr 是基于 Lucene 的面向企业搜索的 web 应用。
Solr 是一个独立的企业级搜索应用服务器,它对外提供类似于 Web-service 的 API 接 口。用户可以通过 http 请求,向搜索引擎服务器提交一定格式的 XML 文件,生成索引;也 可以通过 Http Get 操作提出查找请求,并得到 xml/json 格式的返回结果。
Solr 是一个高性能,采用 Java5 开发,基于 Lucene 的全文搜索服务器。同时对其进行 了扩展,提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能 进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文检索引擎。
文档通过 Http 利用 XML 加到一个搜索集合中。查询该集合也是通过 http 收到一个 XML/JSON 响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高 亮显示搜索结果,通过索引复制来提高可用性,提供一套强大 Data Schema 来定义字段, 类型和设置文本分析,提供基于 Web 的管理界面等。

2.Solr单机版的安装环境:

2.1安装JDK:

上传jdk-8u11-linux-x64.tar.gz压缩包并解压;“tar -zxf jdk-8u11-linux-x64.tar.gz ”。
配置环境变量:修改/etc/目录下的profile文件。

export JAVA_HOME=/usr/local/jdk 
export 
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
export PATH=$JAVA_HOME/bin:$PATH 
2.2 安装Tomcat:

上传apache-tomcat-7.0.47.tar.gz 到Linux服务器上;并解压“tar -zxf
apache-tomcat-7.0.47.tar.gz ”;
复制到指定目录“ cp apache-tomcat-7.0.47 /usr/local/tomcat -r ”;
进入bin目录下启动Tomcat测试,在地址栏中访问“192.168.226.131:8080”。

3.安装Solr:

Solr 版本:solr-4.10.3.tgz.tgz;
Solr 是由两个部分构成:
(2)Solr 的 web 服务;
(1)Solr 的索引库;

3.1Solr的目录介绍:
  • 解压Solr压缩包:
[root@localhost temp]# tar -zxf solr-4.10.3.tgz.tgz 
[root@localhost temp]# ll
total 422328
drwxr-xr-x.  9 root root      4096 Nov  1 08:00 apache-tomcat-7.0.47
-rw-r--r--.  1 root root   8234674 Nov  1 07:57 apache-tomcat-7.0.47.tar.gz
-rw-r--r--.  1 root root  25230982 Nov  5 03:58 dubbo-admin-2.5.4.zip
drwxr-xr-x.  8 uucp  143      4096 Jun 16  2014 jdk1.8.0_11
-rw-r--r--.  1 root root 159019376 Nov  1 07:24 jdk-8u11-linux-x64.tar.gz
-rw-r--r--.  1 root root      5824 Nov  1 12:47 mysql-community-release-el6-5.noarch.rpm
-rw-r--r--.  1 root root  70793720 Nov  3 23:12 nexus-2.11.2-03-bundle.tar.gz
drwxrwxr-x.  6 root root      4096 Apr  1  2015 redis-3.0.0
-rw-r--r--.  1 root root     57856 Nov  9 00:13 redis-3.0.0.gem
-rw-r--r--.  1 root root   1358081 Nov  8 21:21 redis-3.0.0.tar.gz
drwxr-xr-x.  8 root root      4096 Apr 13  2016 ROOT
drwxr-xr-x.  8 root root      4096 Nov 11 17:49 solr-4.10.3
-rw-r--r--.  1 root root 150010621 Nov 11 17:48 solr-4.10.3.tgz.tgz
drwxr-xr-x. 10 1000 1000      4096 Feb 20  2014 zookeeper-3.4.6
-rw-r--r--.  1 root root  17699306 Nov  4 22:58 zookeeper-3.4.6.tar.gz
-rw-r--r--.  1 root root       243 Jan 10  2018 说明.txt
  • Solr的目录:
[root@localhost temp]# cd solr-4.10.3
[root@localhost solr-4.10.3]# ll
total 1000
drwxr-xr-x.  2 root root   4096 Nov 11 17:49 bin
-rw-r--r--.  1 root root 406208 Dec  9  2014 CHANGES.txt
drwxr-xr-x. 13 root root   4096 Dec  9  2014 contrib
drwxr-xr-x.  4 root root   4096 Nov 11 17:49 dist
drwxr-xr-x. 17 root root   4096 Nov 11 17:49 docs
drwxr-xr-x. 15 root root   4096 Nov 11 17:49 example
drwxr-xr-x.  2 root root  32768 Nov 11 17:49 licenses
-rw-r--r--.  1 root root  12646 Dec  1  2014 LICENSE.txt
-rw-r--r--.  1 root root 501873 Dec  8  2014 LUCENE_CHANGES.txt
-rw-r--r--.  1 root root  24655 Dec  1  2014 NOTICE.txt
-rw-r--r--.  1 root root   5344 Dec  1  2014 README.txt
-rw-r--r--.  1 root root    850 Dec  1  2014 SYSTEM_REQUIREMENTS.txt

(1)bin:启动 solr 的一些脚本,但是需要依赖 jeety 容器;
(2)contrib:存放的是 solr 对第三方插件支持的内容;
(3)dist:solr 编译后所产生一些文件夹。War 或者是 jar;
(4)example:是 solr 的案例。在该目录下有两个文件夹对于我们来说比较重要。
webapps:在该目录中存放了一个 solr 的 war 包。与 dist 目录下的那个 war 文 件是 同一个,只是存放的目录及名称不同而已。
solr: 是 solr 的一个标准的索引库示例。
lib/ext:该目录下存放的是一些日志处理器的 jar 包。Solr 的 web 服务也要依赖于日志 处理的 jar 包。所以我们在安装 solr 服务时,需要将该目录下的 jar 拷贝 给 solr 服务。

3.2安装Solr服务:

将solr下/root/temp/solr-4.10.3/example/webapps目录下的war包,拷贝到Tomcat的webapps目录下;

[root@localhost example]# cd webapps/
[root@localhost webapps]# ll
total 29048
-rw-r--r--. 1 root root 29741796 Dec  9  2014 solr.war
[root@localhost webapps]# cp solr.war /usr/local/tomcat/webapps/
  • 启动Tomcat,解压war包:

查看Tomcat的启动的日志“ tailf logs/catalina.out ”,查看是否做war的解压;然后将Tomcat关闭,删除solr.war;保留solr。

  • 添加服务中所依赖的jar包:

由于我们在解压后的 solr 的项目中,需要依赖一些日志处理的 jar 包。所以我们在添加 依赖的 jar 包时,需要将原来的 war 删除掉。否则 tomcat 再次启动时,会将原来的目录覆盖 掉。那么新添加的 jar 包也就没了。注意:在删除 war 包时,一定要在 tomcat 关闭的状态下 删除 war 包。如果在 tomcat 启动状态下删除 war 包,那么 tomcat 在关闭时会将解压的目录 一并的也删除掉。
jar包所在的目录:/root/temp/solr-4.10.3/example/lib/ext;
拷贝到: /usr/local/tomcat/webapps/solr/WEB-INF/lib/;

[root@localhost lib]# cd ext/
[root@localhost ext]# ll
total 552
-rw-r--r--. 1 root root  16515 Feb  5  2014 jcl-over-slf4j-1.7.6.jar
-rw-r--r--. 1 root root   4959 Feb  5  2014 jul-to-slf4j-1.7.6.jar
-rw-r--r--. 1 root root 489884 May 26  2012 log4j-1.2.17.jar
-rw-r--r--. 1 root root  28688 Feb  5  2014 slf4j-api-1.7.6.jar
-rw-r--r--. 1 root root   8869 Feb  5  2014 slf4j-log4j12-1.7.6.jar
[root@localhost ext]# cp * /usr/local/tomcat/webapps/solr/WEB-INF/lib/

4.安装solr索引库:

在 solr 的解压目录的 example 目录下有个 solr 的目录,就是 solr 的一个基本的索引库示例。

  • 拷贝索引库:

将该索引库拷贝到指定目录下(可以是任意目录),虽然具备任意性。但是也不能太随便。 应该放到/usr/local/solrhome。先创建 solrhome 目录。

[root@localhost solr-4.10.3]# cd example/
[root@localhost example]# ll
total 104
drwxr-xr-x. 2 root root  4096 Nov 11 17:49 contexts
drwxr-xr-x. 2 root root  4096 Nov 11 17:49 etc
drwxr-xr-x. 4 root root  4096 Nov 11 17:49 example-DIH
drwxr-xr-x. 2 root root  4096 Nov 11 17:49 exampledocs
drwxr-xr-x. 3 root root  4096 Dec  9  2014 example-schemaless
drwxr-xr-x. 3 root root  4096 Nov 11 17:49 lib
drwxr-xr-x. 2 root root  4096 Dec  1  2014 logs
drwxr-xr-x. 5 root root  4096 Nov 11 17:49 multicore
-rw-r--r--. 1 root root  2992 Dec  1  2014 README.txt
drwxr-xr-x. 2 root root  4096 Nov 11 17:49 resources
drwxr-xr-x. 4 root root  4096 Dec  9  2014 scripts
drwxr-xr-x. 4 root root  4096 Nov 11 17:49 solr
drwxr-xr-x. 2 root root  4096 Dec  9  2014 solr-webapp
-rw-r--r--. 1 root root 46294 Mar 12  2013 start.jar
drwxr-xr-x. 2 root root  4096 Nov 11 17:49 webapps
[root@localhost example]# cp solr /usr/local/solrhome/ -r
[root@localhost example]# cd /usr/local/solrhome/
[root@localhost solrhome]# ll
total 4
drwxr-xr-x. 4 root root 4096 Nov 11 18:16 solr
4.10 solr 的服务中配置索引库:

在 solr 的服务中配置索引库的位置注意:需要配置的路径为索引库的根。可以使用 linux 中的 pwd 命令查看绝对路径。将该路径添加到 solr 服务中的 web.xml 文件中 Solr 服务在启 动时,是通过他的 web.xml 文件中的节点配置获取索引库的绝对位置的。vim web.xml 在 web.xml 中找到.注意:该节点默认是注释状态的,我们需要先去掉注释。然后将 拷贝的索引库的路径添加到该节点的节点中 。
web.xml的路径:/usr/local/tomcat/webapps/solr/WEB-INF。

    
       solr/home
        /usr/local/solrhome/solr
       java.lang.String
    
  • 访问Solr服务:

启动 tomcat 通过 solr 的管理页面可以对 solr 进行操作了。启动 tomcat 后,打开浏览器 输入 solr 的访问 url 就可以访问 solr 服务了。

主界面

二、Solr索引库

1.solrhome的目录结构:

(1)solr.xml 配置 solr 集群 ;
(2)collection1(索引库:solr core);
(3)core.properties 设置索引库的名称 ;
(4)data 存放索引 ;
(5)conf 索引库的配置目录 ;
schema.xml:配置字段以及字段类型 ;

  • 索引库的配置:

schema.xml 是用来定义索引数据中的域的,包括域名称,域类型,域是否索引,是否 分词,是否存储等。

1.1Field的的配置和属性的作用:

:定义域 。

(1)name:表示域的名称,是强制必须有的属性 type:域类型的名称,与 fieldType 元素的 name 属性值对应,是强制必须有的属性;
(2)indexed:是否参与检索。true 即表示需要对该域进行索引。默认值为 false;
(3)stored:是否将 field 域中的内容存储到文档域,简单通俗的来说,就是你这一个 field 需不需要被当作查询结果返回。
(4)required:表示这个域是否是必须要在 document 中存在,默认值为 false,如果此配 置项设为 true,则你的 document 中必须要添加此域,否则你创建索引时会抛异常。

1.2FieldType 的的配置和属性的作用:

:定义域的类型;

(1)Name:域类型的名称,作为域类型标识符存在,在定义域(Field)时使用的类型 (FieldType)属性就是域类型的名称。
(2)Class:域类型的数据类型,该属性指向的是 solr 中的已定义的类型,或者是用户定 义的类型,域类型中的数据会被初始化成 class 执行类类的对象。

(3)sortMissingFirst/sortMissingLast:控制当排序域的值不存在时该文档(Document) 所在队列的位置。true 是则在队头/队尾。

1.3CopyField 的的配置和属性的作用:

:复制域。可实现更新与查询分离;

Source:源域;
Dest:目标域;

2.Solr的索引机制:

2.1正排索引(正向索引):

正排索引是以文档的 ID 为关键字,索引文档中每个字的位置信息,查找时扫描索引中 每个文档中字的信息直到找出所有包含查询关键字的文档。
但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大 延长,检索效率低下。
尽管正排索引的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下, 否则实用性价值不大。

示例
2.2 倒排索引(反向索引):

对数据进行分析,抽取出数据中的词条,以词条作为 key,对应数据的存储位置作为 value,实现索引的存储。这种索引称为倒排索引。
当 solr 存储文档时,solr 会首先对文档数据进行分词,创建索引库和文档数据库。所谓 的分词是指:将一段字符文本按照一定的规则分成若干个单词。

示例

示例

3.配置中文分词器(IK Analyzer):

上传中文分词器 jar 包,以及配置文件 的压缩文件;
将解压后的配置文件“ unzip IK\ Analyzer\ 2012FF_hf1.zip ”,并把jar包拷贝到对应的目录下;

  • 拷贝配置文件和jar包:

将配置文件需要放到 classes 目录下。 在 solr 中的 WEB-INF 下时没有 classes 目录的。我们需要先创建一个。
Jar 包放到 WEB-INF/lib 目录下。

[root@localhost temp]# cd IK\ Analyzer\ 2012FF_hf1
[root@localhost IK Analyzer 2012FF_hf1]# ll
total 2000
drwxr-xr-x. 5 root root    4096 Apr 19  2017 doc
-rw-r--r--. 1 root root     168 Sep 11  2015 ext_stopword.dic
-rw-r--r--. 1 root root 1165908 Sep 11  2015 IKAnalyzer2012FF_u1.jar
-rw-r--r--. 1 root root     419 Sep 11  2015 IKAnalyzer.cfg.xml
-rw-r--r--. 1 root root  841268 Sep 11  2015 IKAnalyzer中文分词器V2012_FF使用手册.pdf
-rw-r--r--. 1 root root   17778 Sep 11  2015 LICENSE.txt
-rw-r--r--. 1 root root       0 Dec 10  2016 mydict.dic
-rw-r--r--. 1 root root     278 Sep 11  2015 NOTICE.txt
[root@localhost IK Analyzer 2012FF_hf1]# cp ext_stopword.dic IKAnalyzer.cfg.xml mydict.dic /usr/local/tomcat/webapps/solr/WEB-INF/classes/
[root@localhost IK Analyzer 2012FF_hf1]# cp IKAnalyzer2012FF_u1.jar /usr/local/tomcat/webapps/solr/WEB-INF/lib/
3.1在schema.xml中配置中文分词器:
         
        
       
   
  • 测试:


    示例

4.Solr管理页面操作:

4.1 Dashboard(仪表盘)

访问 http://localhost:8080/solr 时,出现该主页面,可查看到 solr 运行时间、solr 版本, 系统内存、虚拟机内存的使用情况。

示例
4.2 Logging(日志) :

显示 solr 运行出现的异常或错误 。

示例
4.3 Core Admin (core 管理) :

主要有 Add Core(添加核心), Unload(卸载核心),Rename(重命名核心),Reload(重 新加载核心),Optimize(优化索引库);
Add Core 是添加 core : 主 要 是 在 instanceDir 对 应 的 文 件 夹 里 生 成 一 个 core.properties 文件。
(1)name:给 core 起的名字;
(2)instanceDir:与我们在配置 solr 到 tomcat 里时的 solr_home 里新建的 core 文件夹名一致;
dataDir:确认 Add Core 时,会在 new_core 目录下生成名为 data 的文件夹 ;
(3)config:new_core 下的conf下的config配置文件(solrconfig.xml) ;
(4)schema: new_core 下的 conf 下的 schema 文件(schema.xml) ;

示例
4.4 Java Properties:

可查看到 java 相关的一些属性的信息。

示例
4.5 Thread Dump:

查看每个线程的详细信息,以及状态信息 。

示例
4.5 Core Selecter(core 选择器) :

overview:包含基本统计如当前文档数;和实例信息如当前核心的配置目录 。

示例
  • Analysis(分析):

检验分词效果。

示例
  • Dataimport(导入数据) :


    示例
  • Documents :

Documents (索引文档)索引的相关操作,如:增加,修改,删除等 在如下页面,选择/update ,文档格式选择 json ,然后 submit 提交。这样 索引就增 加上了。修改与增加一样,都是/update ,删除为/delete 。 成功之后,我们去 query 里查询数据 就能查到我们刚添加的数据。

示例
  • Files 文件夹:

solr_home 下的 core 下的 conf 下的相关文件,可单击查看里面的内容。

示例
  • Ping :

查看当前核心库还是否工作的以及响应时间 。

示例
  • Plugins /stats:

Solr 自带的一些插件以及我们安装的插件的信息以及统计。

示例
  • Query(查询页面):

查询的结果要显示哪个字段,就得将 schema.xml 文件配置字段时的 stored 属性设为 true 。

示例
  • Replication:

显示你当前 Core 的副本,并提供 disable/enable 功能 。

示例
  • Schema:

展示该 Core 的 shema.xml 文件中的内容。

示例

三、SolrJ的使用。

1.在索引库中定义业务字段:

  • 数据库的表结构:
CREATE TABLE `tb_item` (   
`id` bigint(20) NOT NULL COMMENT '商品 id,同时也是商品编号',   
`title` varchar(100) NOT NULL COMMENT '商品标题',   
`sell_point` varchar(500) DEFAULT NULL COMMENT '商品卖点',   
`price` bigint(20) NOT NULL COMMENT '商品价格,单位为:分',   
`num` int(10) NOT NULL COMMENT '库存数量',  
`barcode` varchar(30) DEFAULT NULL COMMENT '商品条形码',   
`image` varchar(500) DEFAULT NULL COMMENT '商品图片', 
`cid` bigint(10) NOT NULL COMMENT '所属类目,叶子类目',   
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商品状态,1-正常,2-下架, 3-删除',   
`created` datetime NOT NULL COMMENT '创建时间',   
`updated` datetime NOT NULL COMMENT '更新时间',   
PRIMARY KEY (`id`),   
KEY `cid` (`cid`),   
KEY `status` (`status`),   
KEY `updated` (`updated`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表'; 
  • 定义域:
  
  
  
  
  
  • 定义默认检索域:
  
  
  

2.什么是SolrJ?

solrJ 是访问 Solr 服务的 JAVA 客户端,提供索引和搜索的请求方法,SolrJ 通常嵌入在 业务系统中,通过 solrJ 的 API 接口操作 Solr 服务。


示例

3.测试SolrJ:

3.1 创建项目:
示例
3.2修改POM文件添加SolrJ坐标:
    
        
        
            org.apache.solr
            solr-solrj
            4.10.3
        
        
            commons-logging
            commons-logging
            1.2
        
    
3.3向索引库中添加文档:
    /**
     * 添加索引库中的文档
     */
    private static void solrJInsert() {
        // 创建一个 solrj 的链接对象
        HttpSolrServer httpSolrServer = new HttpSolrServer("http://192.168.226.131:8080/solr");
        try {
            for(int i=1;i<=20;i++) {
                // 创建一个 Solr 的文档对象
                SolrInputDocument solrInputDocument = new SolrInputDocument();
                // 向文档对象中添加需要插入到索引库的内容
                solrInputDocument.addField("id", "test"+i);
                solrInputDocument.addField("item_title", "Hello"+i);
                solrInputDocument.addField("item_price", 1000+i);
                // 将文档插入到 solr 的索引库中
                httpSolrServer.add(solrInputDocument);
            }
            // 事务的提交
            httpSolrServer.commit();
        } catch (SolrServerException | IOException e) {
            e.printStackTrace();
        }
    }
  • 测试:
    public static void main(String[] args) {
        Test.solrJInsert();
    }
结果
3.3删除索引库:
    private static void solrJDelete() {
        // 创建一个solrj的链接对象
        HttpSolrServer httpSolrServer = new HttpSolrServer("http://192.168.226.131:8080/solr");
        try {
            // 根据主键删除
//          httpSolrServer.deleteById("test");
            // 根据查询删除
            httpSolrServer.deleteByQuery("*:*");
            // 事务提交
            httpSolrServer.commit();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
3.4查询索引库中的文档:
    private static void solrSearch() {
        // 创建一个solrj的链接对象
        HttpSolrServer httpSolrServer = new HttpSolrServer("http://192.168.226.131:8080/solr");
        // 创建查询条件
        SolrQuery query = new SolrQuery();
        query.setQuery("Hello");
        query.set("df", "item_keywords");
        // 设置分页
        query.setStart(0);
        query.setStart(10);

        try {
            // 执行查询
            QueryResponse qr = httpSolrServer.query(query);
            SolrDocumentList results = qr.getResults();
            System.out.println("总条数:" + results.getNumFound());

            for (SolrDocument solr : results) {
                System.out.println(solr.get("item_title"));
                System.out.println(solr.get("item_price"));
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        }
    }
  • 测试:
    public static void main(String[] args) {
//      Test.solrJInsert();
//      Test.solrJDelete();
        Test.solrSearch();
    }
结果

你可能感兴趣的:(Java高级技术day81:Solr索引库)