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安装
2.1. 下载solr
http://lucene.apache.org/solr/downloads.html
2.2. 下载solr-dataimport-scheduler.jar
见附录
此jar包为从数据库导入数据时需要,为可选
2.3. 解压缩
tar -zxvf solr-5.5.0.tgz
2.4. 拷贝solr执行库/文件
- 拷贝solr-5.5.0/server/solr-webapp/webapp到tomcat下的webapps目录下,并改名为solr
- 将solr-5.5.0/server/lib/ext/目录下的所有jar包复制到tomcat/webapps/solr/WEB-INF/lib/下
- 将solr-5.5.0/server/solr目录复制到tomcat目录下并重命名为solr_home(存放检索数据)
- 将solr-5.5.0/server/resouce下的log4j.properties文件复制到tomcat/weapps/solr/WEB-INF/classes目录下,如果没有则新建
- 将solr-5.5.0/dist目录下的solr-dataimporthandler-5.4.0.jar和solr-dataimporthandler-extras-5.4.0.jar复制到tomcat/webapps/solr/WEB-INF/lib/下,这个是为了以后导入数据库表数据
2.5. 修改配置文件
2.5.1. 修改web.xml
在web.xml中,找到如下配置项,并修改其中红色标记的信息(solrHome的地址),并放开注释,使其生效
<env-entry>
<env-entry-name>solr/home</env-entry-name> <env-entry-value>/home/XXX/apache-tomcat-8.0.24/solrHome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
(可选)如果需要数据导入功能则增加如下配置
<listener>
<listener-class>
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
</listener-class>
</listener>
2.5.2. 修改启动脚本catalina.sh
在启动脚本中增加如下命令
JAVA_OPTS="-Dsolr.solr.home=/home/XXX/apache-tomcat-8.0.24/solr -Dsolr.root.logger=INFO,file,DAILY -Dsolr.log.dir=/home/XXX/apache-tomcat-8.0.24/solrHome/logs/"
至此,solr基本上已经配置完成,可以正常启动了
2.6. IK分词器
2.6.1. 拷贝ik-analyzer-solr5-5.x.jar到tomcat/webapps/solr/WEB-INF/lib/
2.6.2. 在schema.xml中增加如下配置,用于注册一个text_ik的字段类型
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_zh.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_zh.txt" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
2.6.3. 拷贝stopwords_zh.txt到solrHome/core/conf目录下
2.6.4. 重启进入界面即可看到IK的效果
2.7. 数据库自动导入dataimport
2.7.1. 拷贝solr-dataimport-scheduler.jar到tomcat/webapps/solr/WEB-INF/lib/
2.7.2. 修改dataimport.properties文件
在solrHome中增加文件夹conf,将附件中的dataimport.properties拷贝到conf目录中
2.7.3. 修改solrConfig.xml文件
在文件中增加如下配置
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
2.7.4. 增加data-config.xml
<dataConfig>
<!-- 这是mysql的配置,学会jdbc的都应该看得懂 -->
<dataSource name="ds1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://172.30.8.205:3306/mysql" user="root" password="root"/>
<document>
<entity name="product" dataSource="ds1"
query="SELECT * FROM product"
deltaImportQuery="SELECT * FROM product where pid='${dih.delta.pid}'"
deltaQuery="SELECT pid FROM product where lastUpdateTime > '${dataimporter.lastUpdateTime}'">
<field column="pid" name="id"/>
<field column="name" name="product_name"/>
<field column="catalog" name="product_catalog"/>
<field column="catalog_name" name="product_catalog_name"/>
<field column="price" name="product_price"/>
<field column="lastUpdateTime" name="lastUpdateTime"/>
</entity>
</document>
</dataConfig>
2.7.5. 重启进入界面即可看到效果
附录:
http://files.cnblogs.com/files/JonyTang/solr.rar
代码操作solr演示:
http://files.cnblogs.com/files/JonyTang/IndexManager.rar