全文检索引擎Solr的配置

描述:

在Linux环境下实现高速的全文检索

一、当前环境:

CentOS (Linux) 6.5 32 bit

二、所需软件

1、Java的JDK

Java jdk 1.8.0【注意:solr5.x版本必须安装java 1.7及以上版本

2、Solr最新稳定版Solr-5.5.3

3、Tomcat稳定版Tomcat-6.0.47【也可以进入到solr的安装目录下,执行bin/solr start命令即可启动solr自带的服务器jetty

4、IK Analyzer最新稳定版分词器IKAnalyzer2012

 

三、Tomcat安装

1、  安装jdk

http://pblog.applinzi.com/index.php/2015/10/08/linux-jdk/

2、  下载Tomcat

http://mirror.bit.edu.cn/apache/tomcat/tomcat-6/v6.0.47/bin/

(如果找不到请到http://mirror.bit.edu.cn/ 官网点击”apache”进入选择相应版本下载)

 

3、解压tomcat并且放到指定目录下

#tar zxvf apache-tomcat-6.0.47.tar.gz

#mv apache-tomcat-6.0.47/ /usr/local/tomcat

4、启动tomcat

#/usr/local/tomcat/bin/startup.sh

(如果想测试是否安装成功,那么就新建一个test

目录,在下面放一个index.html文件进行测试)

5、关闭tomcat

#/usr/local/tomcat/bin/shutdown.sh

 

四、Solr配置

1、  下载Solr

http://mirror.bit.edu.cn/apache/lucene/solr/

历史版本:http://archive.apache.org/dist/lucene/solr/

2、  解压并且配置Solr

#tar zxvf solr-5.5.3.tgz
a.新建目录

#mkdir /usr/local/tomcat/webapps/solr

将solr-5.5.3/server/solr-webapps/webapp/目录下的所有文件拷贝到tomcat安装目录的webapps下(/usr/local/tomcat/webapps/solr)。 

b. 新建solr索引目录:/home/solr;

c. 把官网下载的solr(本文为:solr-5.5.3.tgz)解压目录中的"solr-5.5.3/server/solr"目录下的所有内容复制到/home/solr中。

3、配置/home/solr

修改tomcat/webapps/solr/WEB-INF/web.xml,,取消注释,配置“env-entry-value”的值为自定义的solr索引目录

<env-entry> 

 <env-entry-name>solr/home</env-entry-name> 
 
 <env-entry-value>/home/solr</env-entry-value> 

 <env-entry-type>java.lang.String</env-entry-type> 

</env-entry>

4、配置日志

将solr目录下server/lib/ext中的jar包copy到tomcat的solr/WEB-INF/lib下。这时候虽然添加jar包,但是没有对应的日志配置,需要将solr-5.5.3/server/resources下的log4j.properties也放到solr/WEB-INF/classes/下,如果没有classes文件夹则新建一个。

配置solr.home目录

1.方法一:

修改solr5.3.3/server/webapps/solr/WEB-INF/web.xml,,取消注释,配置“env-entry-value”的值为自定义的solr索引目录

<env-entry>

<env-entry-name>solr/home</env-entry-name> 
 
 <env-entry-value>/home/solr</env-entry-value>

<env-entry-type>java.lang.String</env-entry-type>

</env-entry>

2.方法二:

如果方法一不好使则修改solr5.3.3/bin/solr.in.sh

SOLR_HOME=/home/solr [取消注释]

注:两个方法配置完之后,都需要重启solr,才能生效!

solr5.5:定时更新索引

solr初次创建完索引后,如何使得新增的数据自动创建增量索引呢?这就是本文我们要探讨的问题。

首先,还不知道如何创建solr索引的,请移步:Solr5.5从Mysql上导入数据

增量更新

下面说增量更新的方法,solr本身没有提供增量更新的方法,需要我们自己实现或者用插件做到,为了方便把插件地址写在下面http://wiki.apache.org/solr/DataImportHandler#Scheduling.不过遗憾的是此插件需要自己修改一下,默认加载的配置文件没有成功,请下载修改后的dihs.jar放到solr-5.5.0\server\solr-webapp\webapp\WEB-INF\lib下面,然后在solr-5.5.0\server\solr【说明:该目录是solr.home目录】下新建conf文件夹,将dataimport.properties配置文件放进去,配置文件内容如下

# dataimport.properties example
#
# From this example, copy everything bellow "dataimport scheduler properties" to your
#   dataimport.properties file and then change params to fit your needs
#
# IMPORTANT:
# Regardless of whether you have single or multiple-core Solr,
#   use dataimport.properties located in your solr.home/conf (NOT solr.home/core/conf)
# For more info and context see here:
# http://wiki.apache.org/solr/DataImportHandler#dataimport.properties_example


#Tue Jul 21 12:10:50 CEST 2010
metadataObject.last_index_time=2010-09-20 11\:12\:47
last_index_time=2010-09-20 11\:12\:47


#################################################
#                                   #
#dataimport scheduler properties
#
#                                   #
#################################################

#  to sync or not to sync
#  1 - active; anything else - inactive
syncEnabled=1

#  which cores to schedule
#  in a multi-core environment you can decide which cores you want syncronized
#  leave empty or comment it out if using single-core deployment
syncCores=core0,core1

#  solr server name or IP address
#  [defaults to localhost if empty]
server=localhost

#  solr server port
#  [defaults to 80 if empty]
port=8983

#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
webapp=solr

#  URL params [mandatory]
#  remainder of URL
params=/dataimport?command=delta-import&clean=false&commit=true

#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty]
interval=30

说明:syncCores表示要同步的cores,多个用逗号隔开;interval表示更新索引的频率,单位为分钟。

 

按照自己配置的对应修改就行了,然后找到solr-5.5.0\server\solr-webapp\webapp\WEB-INF下的web.xml文件,增加一个监听器

 <!-- Add Solr Data Import Scheduler Listener -->
  <listener>
    <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>
  </listener>

配置完这些重启下solr服务,然后不出问题就可以使用了哦。

最后在说一句在生产环境中为避免solr admin页面暴露在外网环境下可以指定ip访问,方法是修改solr-5.5.0\server\etc下的jetty.xml,建一个Item节点添加如下

 <!-- Add IP Restrict Start -->
 <Item>
    <New class="org.eclipse.jetty.server.handler.IPAccessHandler">
       <Set name="white">
         <Array type="String">
            <Item>127.0.0.1</Item>
            <Item>127.0.0.2</Item>
          </Array>
       </Set>
	   <Set name="handler">
         <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
       </Set>
    </New>
   </Item>

Solr5.5从Mysql上导入数据

在工作中我们需要将mysql数据库中的表自动创建solr索引,以便进行数据搜索,相关方法如下:

1.jar包准备:
(1)将solr-5.5.3/dist/下的solr-dataimporthandler-5.5.3.jar及solr-dataimporthandler-extras-5.5.3.jar复制到solr-5.5.3/server/solr-webapp/webapp/WEB-INF/lib当中,此java包是导入数据用的;

(2)下载mysql-connector-java-5.1.38.tar.gz,解压后将mysql-connector-java-5.1.38-bin.jar复制到solr-5.5.3/server/solr-webapp/webapp/WEB-INF/lib当中,此java包是mysql连接用的;
2.在core/conf/solrconfig.xml适当位置配置一下添加数据库数据的xml,如下:
<requestHandler name="/dataimport" class="solr.DataImportHandler"> 
  <lst name="defaults"> 
     <str name="config">data-config.xml</str> 
   </lst> 
 </requestHandler>
3.在core/conf/下创建data-config.xml,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig> 
 <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" 
 url="jdbc:mysql://localhost:3306/database_name" user="userName" password="passWord"/> 
 <document name="database_name"> 
 <entity name="tableName" transformer="HTMLStripTransformer" 
 query="select id,name from tableName where isdelete=0" 
 deltaImportQuery="SELECT id,name FROM tableName where id='${dih.delta.id}'" 
 deltaQuery="SELECT id FROM tableName where create_time > '${dataimporter.last_index_time}'"
 deletedPkQuery="select id from tableName where isdelete=1" > 
 <field column="id" name="id" /> 
 <field column="name" name="name" /> 
 <field column="create_time" name="create_time" /> 
 <field column="isdelete" name="isdelete" /> 
 </entity> 
 
 </document> 
</dataConfig>
说明:上面的database_name是你创建的数据库名,userName是数据库用户名,passWord是数据库密码,tableName是你的表名,field区域当中的column对应数据库中的列,而name就是solr中显示的名称。字段isdelete用来表示是否被软删除,默认为0,当数据被软删除时,删除对应的solr索引。字段create_time用来表示数据更新的时间,mysql中的字段类型为类型为TIMESTAMP,默认值为CURRENT_TIMESTAMP,solr根据这个时间来判断增量索引的起始点。
(注:一个data-config.xml中可以有多个<entity>,同时对多个表创建索引。)

data-config.xml中<entity>必要属性的设置说明:
       
(1)transformer:格式转化,HTMLStripTransformer 索引中忽略HTML标签  
(2)query:查询数据库表符合记录数据   
(3)deltaQuery:增量索引查询主键ID,注意这个只能返回ID字段   
(4)deltaImportQuery:增量索引查询导入的数据   
(5)deletedPkQuery:增量索引删除主键ID查询,注意这个只能返回ID字段
4.在core/conf/schema.xml中,添加data-config.xml中<field>对应的字段
<field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="name" type="string" indexed="false" stored="true"/>
<field name="create_time" type="date" indexed="true" stored="true"/>
<field name="isdelete" type="int" indexed="true" stored="true"/>

<field>属性说明:

(1)indexed:表示是否被索引;

(2)stored:表示在结果中是否返回该字段;

(3)multiValued:表示该字段是否可以对应多个值。
注意:字段_version_ 是一个特殊字段,不能删除,是记录当前索引版本号的

5.设置solr-5.5.3/bin/solr.in.sh里的时区:
SOLR_TIMEZONE="UTC+8"
6.重启solr:
  solr-5.5.3/bin/solr restart

7.通过浏览器访问solr后台连接mysql数据库创建索引

a、首先打开你们的浏览器,访问http://localhost:8983/solr,确保我们的Solr Web UI能正常访问,如图:1

b、点击左侧的Dataimport菜单,不出意外的话,你将看到如图截图:

f9e12b6b-f99c-341c-a2c8-6750ddc022b8

需要引起注意的是这里的command参数,它有两个选项,如图:

e360ef14-ed47-3c0a-8eb3-5390a585daab

full-import:全量导入,它会覆盖原有的索引

delta-import:即增量导入,它会在原有索引的基础上追加

下面的几个多选框含义解释如下:

verbose:这个选项设为true的话,会打印导入的一些中间过程的详细信息,有利于调试以及了解内部操作细节

clean:表示是否在导入数据创建索引之前先清空掉原有的索引【增量导入时不要选这项】

commit:表示是否立即提交索引

optimize:表示是否优化索引

debug: 表示是否开启调试模式

 

然后选择需要导入的Entity,点击Execute按钮开始执行数据导入操作,如图:

9e20e8a4-5ad5-3ba7-bc13-752a99e6523d

说明:勾选Auto-Refresh Status让其自动刷新状态。

c、如果你看到indexing字样,如图:

357dd91f-d486-3119-8d89-419a9ff0fd32

如果你导入的数据并不多,但这个界面停留了很长时间(比如超过了30秒,就不需要再傻傻等着了),那么很有可能数据导入过程出错了,这时,请切换到logging菜单查看solr日志,如图:

1bc2d69a-2f05-385f-bcf3-bff6ef560605

日志提示有几个html文件找不到,我们可以在solr的解压安装目录下可以找到,如图:

9682af58-58ea-3eaf-823d-8d9f554f3966

然后我们需要清掉索引目录重新执行dataimport操作,如图:47dda763-05ac-3960-84cf-b911bd9a0c62

然后重启我们的solr,重新执行dataimport操作,如图:

bd53f09c-df8f-3776-ad3a-f09f8def5e10

切换到overview菜单,我们会看到:

e39b507f-a3db-3428-b4ec-0afd839d875c

切换到Query菜单,对我们刚插入的索引进行查询测试,如图:

7593a197-c3c3-3699-b00c-8e2751655c28

参考:http://iamyida.iteye.com/blog/2210621

https://wiki.apache.org/solr/DataImportHandler

solr-5.5.3:IK 中文分词的配置和使用

有的时候,用户搜索的关键字,可能是一句话,不是很规范。所以在 Solr 中查询出的时候,就需要将用户输入的关键字进行分词。

目前有很多优秀的中文分词组件。本篇只以  IKAnalyzer 分词为例,讲解如何在 solr  中及集成中文分词,使用 IKAnalyzer的原因 IK 比其他中文分词维护的勤快,和 Solr 集成也相对容易。具体就不多介绍,这里直接solr 集成 IK 的方法。

1. 首先,下载IKAnalyzer下载

注意:以前老的IK 不支持Solr 5.3以上的版本 ,请注意下载最新的。

2. 将ik的相关jar文件 拷贝到 webapps\solr\WEB-INF\lib 目录下。

3. 在 solr_home\core0\conf\schema.xml[说明:如果是solr5.5以上版本,则无该文件,而变成了managed-schema] 增加如下配置

<!-- 我添加的IK分词 -->
<fieldType name="text_ik" class="solr.TextField">   
     <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>   
     <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>   
</fieldType>

同时,把需要分词的字段,设置为text_ik

  <field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
   <field name="name" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />
   <field name="title" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />
   <field name="category" type="int" indexed="true" stored="true" required="true" multiValued="false" />
   <field name="content" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />
   <field name="price" type="double" indexed="true" stored="true" required="true" multiValued="false" />
   <field name="color" type="string" indexed="true" stored="true" required="true" multiValued="false" />
   <field name="orderBy" type="int" indexed="true" stored="true" required="true" multiValued="false" />
   <field name="updatetime" type="date" indexed="true" stored="true" required="true" multiValued="false" />

4. 重启服务

注意:如果之前已经创建了索引,需要将之前的索引删掉,重新创建分词后的索引。

5. 在admin后台, analysis 下查看分词效果

中文分词效果

6. 配置IKAnalyzer分词器的扩展词典,停止词词典

1. 将 文件夹下的IKAnalyzer.cfg.xml , ext.dic和stopword.dic 三个文件 复制到/webapps/solr/WEB-INF/classes 目录下,并修改IKAnalyzer.cfg.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
    <properties>  
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict">ext.dic;</entry> 

        <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords">stopword.dic;</entry> 
    </properties>

2. 在ext.dic 里增加自己的扩展词典,例如,婴儿奶粉3段   

注意:  记得将stopword.dic,ext.dic的编码方式为UTF-8 无BOM的编码方式。

Solr 增量导入数据原理

solr导入数据库数据创建索引时提供了full-import和delta-import两种导入方式,这篇文章主要讲解后者。

所谓delta-import主要是对于数据库(也可能是文件等等)中增加或者被修改的字段进行导入。主要原理是利用率每次我们进行import的时候在solr.home\conf下面生成的dataimport.properties文件,此文件里面有最近一次导入的相关信息。这个文件如下:

 #Wed Apr 21 16:48:27 CST 2010

 last_index_time=2010-04-21 16\:48\:24

 id.last_index_time=2010-04-21 16\:48\:24

其实last_index_time是最近一次索引(full-import或者delta-import)的时间。

通过比较这个时间和我们数据库表中的timestamp列即可得出哪些是之后修改或者添加的。

solr常用命令总结

1、查看帮助
bin/solr -help 可以看到solr有哪些子命令,如 start, stop, restart, status, healthcheck, create, create_core, create_collection, delete, version
2、启动start
bin/solr start  -help        查看start帮助

bin/solr start         启动单机版

bin/solr start -f         前台启动

bin/solr start -p 8080     指定端口启动

bin/solr start -cloud       启动分布式版本

bin/solr start -e cloud -noprompt (-e表示要启动一个现有的例子,例子名称是cloud,cloud这个例子是以SolrCloud方式启动的)

bin/solr restart           重启项目
3、create
如果是单机版要创建core,如果是分布式的要创建collection
bin/solr create -help     查看create帮助

bin/solr create -c abc

abc是core或collection的名字,取决于solr是单机版还是cloud版本;刷新http://localhost:8983/solr ,可以看到core selector中多了一个abc
abc目录的位置创建在solr.solr.home(默认是solr的server/solr目录)目录下
4、post提交数据生成索引
bin/post -c abc docs/

向名为abc的core或collection提交数据,数据源在docs/目录中
 5、删除
bin/solr delete -c abc 删除一个core或collection
6、删除索引
bin/post -c abc  -d "<delete><id>/home/matthewi/software/solr-5.4.1/docs/solr-morphlines-core/allclasses-noframe.html</id></delete>"

重新执行上面的搜索可以看到搜索结果的数量少了一条:numFound列

bin/post -c abc -d "<delete><query>*:*</query></delete>"

删除所有数据
7、停止solr
bin/solr stop -all
8、状态
bin/solr status

solr-5.5.3环境部署实践

一、当前软件环境:

CentOS-6.5 + solr-5.5.3 + jdk-1.8.0 + solr自带jetty服务器

(注意:solr5.x版本必须安装java 1.7及以上版本)

二、部署步骤:

1、软件下载与安装
(1)jdk-1.8.0下载与安装
http://pblog.applinzi.com/index.php/2015/10/08/linux-jdk/
(2)solr-5.5.3下载与安装
a、下载Solr

http://mirror.bit.edu.cn/apache/lucene/solr/

历史版本:http://archive.apache.org/dist/lucene/solr/

b、解压Solr

   #tar zxvf solr-5.5.3.tgz

c、将解压后的solr整个文件拷贝到/usr/local/solr中
   
   #cp -rp solr-5.5.3/* /usr/local/solr/
2、启动solr
 #/usr/local/solr/bin/solr start 
(还有stop|restart命令,默认监听8983端口)
 启动成功后,在浏览器中访问solr管理后台
 http://localhost:8983/solr

 log日志位置:/usr/local/solr/server/logs/
3、配置Solr
a、创建core(以下先创建一个core0)
 #/usr/local/solr/bin/solr create -c core0 -d /usr/local/solr/server/solr/configsets/basic_configs/

(说明:create的最后一个参数表示创建core0时采用的配置文件路径,创建完成后core0位于/usr/local/solr/server/solr/下。)

b、浏览器中访问:http://localhost:8983/solr
点击Core Admin按钮即可看到刚才创建的core0。

4、添加中文分词【IKAnalyzer】
http://pblog.applinzi.com/index.php/2016/03/18/solr-5-5-3-ik/
5、连接mysql,创建索引
http://pblog.applinzi.com/index.php/2016/03/18/solr5-5-mysql/
6.定时自动更新增量索引
http://pblog.applinzi.com/index.php/2016/03/20/solr5-5-index-update/

solr5.5:设置schema.xml的id为整型

在solr5.5中,schema.xml的主键id不可以设置为int类型,而必须是string类型,否则会报错。如果需要将主键id设置为int类型,需要这样设置:

把solr-5.5.0/server/solr/core0/conf中的elevate.xml的

<query text="ipod">
     <doc id="MA147LL/A" />
     <doc id="IW-02" exclude="true" />
</query>

注释掉

Solr5.5使用schema.xml

与之前版本不同,Solr5.5中默认不再使用schema.xml, 取而代之的是Managed Schema,此种方式必须通过Schema API的方式进行管理,不太方便。现在改为传统的schema.xml的配置文件方式。

以下是简介:

The schemaFactory option in solrconfig.xml controls whether the Schema should be defined as a
“managed index schema”: schema modification is only possible through the Schema API.
All of the example config sets use the managed schema by default.
By default, if no schemaFactory is specified, then the default behavior is to use the “ClassicIndexSchemaFactory”:
<schemaFactory class=”ClassicIndexSchemaFactory”/>
The ClassicIndexSchemaFactory requires the use of a schema.xml file, which can be edited manually and
is only loaded only when the collection is loaded. This setting disallows Schema API methods that modify the
schema.

首先通过默认方式启动solr 并创建core(这里命名为core1), 这样会在solr-5.5.0/server/solr/core1/conf 目录下生成managed-schema,将此文件拷贝至同目录下名字为schema.xml。

然后编辑/solr-5.5.0/server/solr/core1/conf/solrconfig.xml,将以下代码注释掉:

<schemaFactory class="ManagedIndexSchemaFactory">
  <bool name="mutable">true</bool>
 <str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>

同时新增

<schemaFactory class="ClassicIndexSchemaFactory"/>

最后重启solr即可。