Solr部署详解
- 方式:原创
目录
1 solr概述
1.1 solr的简介
1.2 solr的特点
2 Solr安装
2.1 安装JDK
2.2 安装Tomcat
2.3 安装solr
2.4 目录结构说明
2.5 SOLR HOME说明
3 Solr配置
3.1 Solr.XML说明
3.2 配置SolrConfig.xml
3.3 配置schema.xml
3.4 配置中文分词
3.5 多实例部署
4 solr使用
4.1 添加索引
4.2 更新索引
4.3 删除索引
4.4 提交和优化
4.5 查询索引
5 扩展到SolrCloud
5.1 Zookeeper安装
5.2 启动SolrCloud
5.3 术语及注意事项
6 SolrJ的使用
6.1 部署号码黄页的SolrCloud
6.2 SolrJ操作SolrCloud
7 Solr管理
1 solr概述
1.1 solr的简介
solr是一个基于lucene的全文检索引擎。他包括了全文检索,命中高亮,准实时搜索,富文本检索等特性. Solr是用Java编写的,并作为一个独立的全文搜索服务器,比如tomcat容器内运行。Solr的全文索引和搜索其核心使用了Lucene Java搜索库,并具有类似REST的HTTP / XML和JSON的API,可以很容易地从几乎任何编程语言使用.
什么是全文检索?
全文检索是将存储于数据库中整本书、整篇文章中的任意内容信息查找出来的检索。它可以根据需要获得全文中有关章、节、段、句、词等信息,也就是说类似于给整本书的每个字词添加一个标签,也可以进行各种统计和分析。
对于全文检索来说,倒排索引是最常用的一种技术。倒排索引用来存储某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。
然后再我们检索的时候。系统会将我们需要查询的文本转化为检索词。然后去映射表中查询其对应的文档,然后做文档归并既可以获取到我们希望得到的结果。
Why solr?
既然Solr是基于lucene的,那为什么我们不直接使用Lucene呢?
Lucene是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎
。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎.
Lucene的涉及目标决定了lucene在扩展和管理索引上比较困难。但是solr提供了一个管理页面,并且可以动态的添加和删除索引节点。可以做索引之间的互备,而这些使用lucene则很难实现
1.2 solr的特点
- 基于标准的开放接口:Solr支持XML,JSON和HTTP的调用形式,所以虽然solr是用java写成,但是我们依然可以使用别的语言来调用solr
- 先进的全文检索技术:在Solr中,我们不仅可以使用词来作为检索条件,还可以使用时间范围,数字范围等作为检索条件,也可以进行模糊搜索。
- 线性可扩展性:可以在线的扩展索引节点,自动索引复制,自动故障切换和恢复。
- 近实时索引:数据添加到索引后,可以很快的被检索到。
- 管理界面:可以很方便的管理各个节点,包括索引统计信息以及各个节点的状态。
2 Solr安装
Solr的运行环境非常简单。只需要JDK和一个WEB容器。这里以Tomcat为例介绍Solr的安装。
2.1安装JDK
下载JDK:
http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u45-oth-JPR
设置权限:[root@localhost solrTest]# chmod 777 ./jdk-6u45-linux-i586.bin
安装:[root@localhost solrTest]# ./jdk-6u45-linux-i586.bin
设置环境变量,在/ect/profile中添加并export
[root@localhost solrTest]# vim /etc/profile
在文件的最后加上下面三句话,并在控制台内也执行这四句话
JAVA_HOME=/usr/local/solrTest/jdk1.6.0_45
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
确定已经安装成功
在控制台执行
[root@localhost ~]# java –version
返回
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) Client VM (build 20.45-b01, mixed mode, sharing)
2.2安装Tomcat
下载TOMCAT http://tomcat.apache.org/download-60.cgi
解压缩 [root@localhost solrTest]# tar -zxvf apache-tomcat-6.0.37.tar.gz
启动Tomcat
[root@localhost apache-tomcat-6.0.37]# cd /usr/local/solrTest/apache-tomcat-6.0.37/bin/
[root@localhost bin]# ./catalina.sh start
访问页面测试下http://192.168.39.250:8080/ (虚拟主机的IP)
看到这个页面说明Tomcat运行正常
2.3安装solr
下载solr http://lucene.apache.org/solr/downloads.html
解压缩 [root@localhost solrTest]# tar zxvf solr-4.4.0.tgz
Solr解压后会有一个example目录,这个目录下是Solr自带的一个示例。这个示例下有一个已经编译好的Solr.War.我们后续的操作可以使用这个已经编译好的war包
将war包拷到Tomcat目录下:
[root@localhost solrTest]# cp solr-4.4.0/example/webapps/solr.war /usr/local/solrTest/apache-tomcat-6.0.37/webapps/solr.war
创建一个集合的文件夹并配置
[root@localhost solrTest]# mkdir testData
[root@localhost solrTest]# cp -a solr-4.4.0/example/solr/* testData/
设置solr home
[root@localhost solrTest]# vi apache-tomcat-6.0.37/conf/Catalina/localhost/solr.xml
<?xml version="1.0" encoding="utf-8"?>
<Context docBase="/usr/local/solrTest/apache-tomcat-6.0.37/webapps/solr.war" debug="0" crossContext="true">
<Environment name="solr/home" type="java.lang.String" value="/usr/local/solrTest/testData" override="true"/>
</Context>
启动一下Tomcat
(/usr/local/solrTest/apache-tomcat-6.0.37/bin/startup.sh)
这时http://192.168.39.250:8080/solr 应该是无法访问的,主要是因为缺少配置文件
关闭tomcat (/usr/local/solrTest/apache-tomcat-6.0.37/bin/shutdown.sh)
拷贝一下文件:
[root@localhost solrTest]# cp solr-4.4.0/example/lib/ext/* apache-tomcat-6.0.37/webapps/solr/WEB-INF/lib/
[root@localhost solrTest]# cp solr-4.4.0/example/resources/log4j.properties apache-tomcat-6.0.37/lib/
再次启动 Tomcat (/usr/local/solrTest/apache-tomcat-6.0.37/bin/startup.sh)
再次访问 http://192.168.39.250:8080/solr
可以看到 Solr已经可以正常的运行,现在 我们来看一下Solr的目录结构
2.4目录结构说明
我们下载的Solr包后,进入Solr所在的目录,我们可以看到以下几个目录:contrib、dist、docs、example、licenses。下面分别对其进行介绍。
1) Contrib:Solr的一些扩展包,包括分词器,聚类,语言识别,数据导入处理,非结构化内容分析等.
2) dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。我们之前使用的solr.war实际上就是这个文件夹下的solr-4.40.war
3) example:这个目录实际上是Tomcat的安装目录。其中包含了一些样例数据和一些Solr的配置。第一次使用solr的时候可以直接启动这个目录下的start.jar来启动solr,以便对solr有个比较直观的了解
其中一些子目录也比较重要,这里也对它们稍作介绍。
- example/multicore:该目录是一个包含了多实例配置信息的Solr的home目录。
- example/solr:该目录是一个包含了默认配置信息的Solr的home目录。
- example/webapps:tomcat的webapps目录,该目录通常用来放置Java的Web应用程序。在Solr中,前面提到的solr.war文件就部署在这里。
其余的2个目录docs和licenses则分别是本地的文档以及权限介绍.
2.5 SOLR HOME说明
Solr home目录实际上是一个运行的Solr实例所对应的配置和数据(Lucene索引)。就example来说,合法的solrhome目录有2个,一个是example/solr目录,另一个是example/multicore目录,他们的区别就是multicore是多实例的。
example/solr目录下主要有以下一些目录和文件:
- solr.xml solr的主要配置文件,在solr启动的时候被加载,solr的配置信息包括端口号,连接时间,超时时间等.
- collection1/conf/ schema.xml 该文件是索引的schema,包含了域类型的定义
- collection1/conf/ solrconfig.xml 该文件是Solr的主配置文件,solr的版本,数据存放位置,定义扩展功能的使用等.
3 Solr配置
Solr的配置主要是以下三个主要的文件solr.xml, solrconfig.xml, schema.xml,在solr启动的时候,会首先检查solr.xml,这个文件时solr的全局的配置信息.告诉solr在哪里可以找到solr的实例.在solr.xml加载后,solr会去每个实例内查找solrconfig.xml. solrconfig.xml指向其他的配置文件.除非修改solrconfig.xml,否则将以schema.xml配置文件来决定Solr的字段
3.1 Solr.XML说明
Solr.xml的配置通常是不用修改的,配置文件可以修改的栏目如下:
<solr>
<str name="adminHandler">${adminHandler:org.apache.solr.handler.admin.CoreAdminHandler}</str>
<int name="coreLoadThreads">${coreLoadThreads:3}</int>
<str name="coreRootDirectory">${coreRootDirectory:}</str> <!-- usually solrHome -->
<str name="managementPath">${managementPath:}</str>
<str name="sharedLib">${sharedLib:}</str>
<str name="shareSchema">${shareSchema:false}</str>
<int name="transientCacheSize">${transientCacheSize:Integer.MAX_VALUE}</int> <!-- ignored unless cores are defined with transient=true -->
<solrcloud>
<int name="distribUpdateConnTimeout">${distribUpdTimeout:}</int>
<int name="distribUpdateSoTimeout">${distribUpdateTimeout:}</int>
<int name="leaderVoteWait">${leaderVoteWait:}</int>
<str name="host">${host:}</str>
<str name="hostContext">${hostContext:solr}</str>
<int name="hostPort">${jetty.port:8983}</int>
<int name="zkClientTimeout">${zkClientTimeout:15000}</int>
<str name="zkHost">${zkHost:}</str>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
<logging>
<str name="class">${