Solr技术分析及应用

时间:2021-07-11 04:07:46

solr 开发指南

1.1.1 官网介绍

Solr是一个基于Lucene的Java搜索引擎服务器。Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。Solr已经在众多大型的网站中使用,较为成熟和稳定。Solr 包装并扩展了 Lucene,所以Solr的基本上沿用了Lucene的相关术语。更重要的是,Solr 创建的索引与

Lucene 搜索引擎库完全兼容。通过对 Solr 进行适当的配置,某些情况下可能需要进行编码,

Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,很多 Lucene 工具(如 Nutch、 Luke)也可以使用Solr 创建的索引。 总结一下solr是一个java搜索引擎服务器(是一套war程序),内部集成了Lucene(apache提供的一些对搜索引擎做支持的jar包)。

1.2.2 solr 功能

Ø 保存数据

Ø 建立索引,维护索引

Ø 数据检索(全文搜索,高亮显示,精确搜索等)

1.2.3 solr 依赖环境

Ø Jdk  1.7+

Ø TOMCAT7+

Ø  课程选用版本:solr4.9.1

1.2 solr 服务器搭建

1.2.1 初始配置 solr 截止到文档编写前,solr目前的最新版本为6.5.1,在本次项目开发中,我们选用solr比较成

熟稳定的版本solr 4.9.1。

1.      官网下载solr4.9.1的程序安装包。

下载地址:http://archive.apache.org/dist/lucene/solr/

2.     解压solr的zip包,目录如下

3.      将dist\solr-4.9.1.war文件复制到tomcat的webapps目录下,并将文件命名为solr.war

4.     复制solr解压包下example\lib\ext 下所有的jar 到tomcat 的lib目录下

5.      在计算机本地新建一个文件夹solr_home(当然你可以随便起名字), 然后复制

solr-4.9.1\example\solr 下的所有文件到 solr_home下

6.      启动tomcat,待tomcat启动成功后,关闭tomcat。打开tomcat的webapps目录。注意,此时solr的war包以及被解压成solr文件夹。删除tomcat 的webapps目录下的solr的war

包,保留solr文件夹。

7.      修改配置文件apache-tomcat-7.0.67\webapps\solr\WEB-INF\web.xml 

<env-entry>

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

<env-entry-value> F:/solr_home</env-entry-value>

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

</env-entry>

8.      访问solr(http://localhost:端口号/solr/),如出现以下界面则solr部署成功。

1.2.2 新建数据配置 core

1.             新建core(solr中把配置的每一个模块都叫core),在solr_home目录下,拷贝collection1文件夹,并起名为test。打开test文件夹,修改core.properties文件,将name修改为test

2.             重新启动tomcat,并访问solr,如出现以下界面,则表示新建testcore成功。

3.             重新启动tomcat,并访问solr,如出现以下界面,则表示新建testcore成功。


1.2.3 新增数据库配置

到目前为止,我们已经完成了solr的基础配置,并且创建了test core,接下来我们需要把数据的数据和搜索引擎连接起来,让搜索引擎可以读取数据库的数据。

1.       拷贝数据库连接jar包(mysql-connector-java-5.1.18.jar)到tomcat的lib目录

2.       以创建test core的方式新建hotel core

3.       打开hotel的conf文件夹中的solrconfig.xml文件,在requestHandler name="/select"class="solr.SearchHandler">前面上加上一个dataimport的处理的Handler

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">

<lst name="defaults">

         <str name="config">data-config.xml</str>

</lst>

</requestHandler>

4. 在hotel的conf文件夹下并新建data-config.xml文件,配置如下

<?xml version="1.0" encoding="UTF-8"?>

<dataConfig>

<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb" user="root" password="root" /> <document name="hotel_doc">

<entity name="hotel" pk="id"  query=" select id,hotelName,address from itrip_hotel">

<field column="id" name="id"/>

<field column="hotelName" name="hotelName"/>

<field column="address" name="address"/>

</entity>

</document>

</dataConfig>

Ø dataSource是数据库数据源。

Ø Entity就是一张表对应的实体,pk是主键,query是查询语句。

Ø Field对应一个字段,column是数据库里的column名,后面的name属性对应着Solr的Filed 的名字。

5. 打开hotel的conf目录下的schema.xml文件

(1)保留_version_ 这个field

(2)添加索引字段:这里每个field的name要和data-config.xml里的entity的field的name

一样,一一对应。

<?xml version="1.0" encoding="UTF-8"?>

<dataConfig>

<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb" user="root" password="root" />

<document name="hotel_doc">

<entity name="hotel" pk="id"  query=" select id,hotelName,address from itrip_hotel">

<field column="id" name="id"/>

<field column="hotelName" name=" hotelName"/>

<field column="address" name=" address"/>

</entity>

</document>

</dataConfig>

修改同目录下的schema.xml(schema.xml 是solr对数据库里的数据进行索引管理和数据字段展示管理的配置文件)

Ø 删除多余的field,保留_version_ 和test这两个field(注意不要删除fieldType)

Ø 添加索引字段:这里每个field的name要和data-config.xml里的entity的field的name一样,

一一对应。红色加粗部分为新增内容。

<fieldname="_version_" type="long" indexed="true"stored="true"/>

<field name="id"type="string" indexed="true" stored="true"/>

<fieldname="hotelName" type="string" indexed="true"stored="true"/>

<fieldname="address" type="string" indexed="true"stored="true"/>

<uniqueKey>id</uniqueKey>

<field name="text" type="text_general"indexed="true" stored="false"multiValued="true"/>

6.       将导入数据的JAR包拷贝到webapps/solr的lib目录下

7.       启动Tomcat,执行数据导入

8.      查询数据

到目前为止,我们已经将数据库的数据导入到solr当中了,并且已经查询成功。

1.2.4 配置增量更新

以上的步骤我们实现了如何将数据库的数据导入到solr中,接下来需要配置solr的增量更新,即定时将数据库的数据导入到solr中。

1.       将资料中提供的apache-solr-dataimports-cheduler.jar包添加至solr的lib目录下 注:apachesolrdataimportscheduler.jarjar包是apache提供的用于增量更新的jar包,但

apache提供的原jar包中,代码有BUG。该bug在教学资料提供的jar包中已经被修复,具体可参

考提供的apachesolrdataimportscheduler的源码,在此不再赘述。

2.       将资料中提供的apache-solr-dataimports-cheduler.jar包添加至solr的lib目录下

3.       增加增量更新配置文件,在solr_home文件夹下新建conf文件夹,并新建名为 dataimport.properties的配置文件,配置如下,标红的地方为需要修改的地方

#################################################

#                                              #

#      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=test,hotel

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

#  solr server port

#  [defaults to 80 if empty] port=8080

#  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=1

#  重做全量索引的时间间隔,单位分钟,默认7200,即5天;

#  为空,为0,或者注释掉:表示永不重做索引

#reBuildIndexInterval=7200

#  重做索引的参数

reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true

#  重做索引时间间隔的计时开始时间,第一次真正执行的时间

=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;  

#  两种格式:2012-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期  

reBuildIndexBeginTime=03:10:00

4.       新增增量更新数据的监听器,在solr的web.xml中加入以下监听器

<listener>

<listener-class> org.apache.solr.handler.dataimport.scheduler.ApplicationListener </listener-class>  

</listener>

5.       修改导入数据查询SQL

<?xml version="1.0"encoding="UTF-8"?>

<dataConfig>

<dataSource type="JdbcDataSource"driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb"user="root" password="root" />

<document name="hotel_doc">

         <entity name="hotel" pk="id"  query="select id,hotelName,address fromitrip_hotel"                 deltaImportQuery="selectid,hotelName,address from itrip_hotel where id

='${dih.delta.id}'"

                deltaQuery="SELECT id as id  FROM itrip_hotel  where modifyDate >

'${dih.last_index_time}'"> 

                <field column="id"name="id"/>

                <field column="hotelName"name="hotelName"/>

                <field column="address"name="address"/>

         </entity>

</document>

</dataConfig>

说明:deltaQuery是根据dataimport.properties配置文件中的更新时间,从数据库中查询出,修

改日期在最后一次更新日期之后的酒店数据,并记录其id,而deltaImportQuery的目的是将 deltaQuery查询出的数据导入到solr中。 6. 启动Tomcat进行测试

Ø 启动Tomcat,访问hotel模块

Ø 修改数据库中的酒店数据并同时修改该数据的modifyDate时间,

Ø 1分钟后查询酒店数据,确定数据是否更新

1.2.5 配置分词器

 


Ø 分词器: 是从用户输入的一段文本中提取关键词,用于其它业务操作。

Ø 常见的 JAVA分词器: word 分词器Ansj 分词器Stanford 分词器IKAnalyzer 分词器

Ø 课程选用分词器:IKAnalyzer分词器

Ø solr如果是 3.x 版本的用 IKAnalyzer2012_u6.zip 如果是 4.x 版本的用 IK Analyzer

2012FF_hf1.zip,一定要对应上,要不然会配置失败

Ø IK 分词器下载地址:http://download.csdn.net/download/tjcyjd/8420639

1.       首先,下载IKAnalyzer 。 

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

3.       在webapps\solr\WEB-INF\下新建classes文件夹,IKAnalyzer.cfg.xml和stopword.dic

文件拷贝到改文件夹下。

4.       在 solr_home\hotel\conf\schema.xml 增加如下配置

<fieldType name="text_ik" class="solr.TextField">

 

<analyzer       type="index"

class="org.wltea.analyzer.lucene.IKAnalyzer"/>

isMaxWordLength="false"

    <analyzer       type="query"

class="org.wltea.analyzer.lucene.IKAnalyzer"/>   

</fieldType>

isMaxWordLength="true"

5.       修改solr_home\hotel\conf\schema.xml将hotelName和address指定成为text_ik类型

<field name="hotelName" type="text_ik"indexed="true" stored="true"/>

<field name="address" type="text_ik"indexed="true" stored="true"/>

6.      重启Tomcat,访问solr测试分词器

7.       如果分词器出现上边的显示结果,则表示分词器配置成功。

1.3常见异常

1.3.1 删除了默认字段(text 或者_version_)

1.3.2 没有加入增量更新的 jar 包

1.3.3 没有加入增量更新的配置文件

1.4调试技巧

在 solr 配置的过程中,难免会碰到各种各样的问题。如,在配置过程中,出现问题,可

以通过以下日志对配置进行排查。

1.4.1solr 日志

 

1.4.2 tomcat 日志

1.5 solr 应用

1.5.1 举例 爱旅行项目搜索分析

以上我们已经成功的搭建了solr的服务,那么solr服务如何集成到我们项目当中,首先我们

来分析爱旅行项目中的酒店搜索的需求:

Ø  搜索条件包括目的地、入住时间、退房时间、关键词、位置、价格、酒店级别、酒店特

色。

Ø  关键词和目的地需要对多个字段进行检索,比如酒店名称、酒店地址、酒店描述等。

Ø  酒店搜索关联多个数据库表,这其中包括酒店表、区域表、酒店区域关联表、房间表、特色表、酒店特色关联表、酒店评论表、图片表。

Ø  搜索过程中包括一些复杂搜索,包括平均分计算、评论人数统计、点评人数统计、库存

计算等。

Ø 搜索过程中,需要对关键词。 如果我们使用传统的技术来实现以上的酒店搜索的功能会有以下问题:

Ø 传统的like关键词匹配大字段效率低下。

Ø 每次查询都执行复杂SQL,数据库压力很大。

 

1.5.2 solr 基本查询语法

Ø q – 查询字符串。

Ø fl – 指定返回那些字段内容,用逗号或空格分隔多个。

Ø start – 返回第一条记录在完整找到结果中的偏移位置,0 开始,一般分页用。

Ø rows – 指定返回结果最多有多少条记录,配合 start 来实现分页。

Ø sort – 排序,格式:sort=<field name>+<desc|asc>[,<fieldname>+<desc|asc>]„ 。示例:

(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性

降序。

Ø wt – (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3 增加的,

要用通知我们,因为默认没有打开。

Ø fq – (filterquery)过虑查询,作用:在 q 查询符合结果中同时是 fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字 mm,并且 date_time 是

1.5.3 solr 多字段匹配针对关键词多字段的搜索,solr中提供了相应的检索机制。

1.             在hotel/conf/schema.xml文件中新增filed字段存储多字段的值(红色内容为新增部分)

<field name="_version_" type="long"indexed="true" stored="true"/>

<field name="id" type="long"indexed="true" stored="true"/>

<field name="hotelName" type="text_ik"indexed="true" stored="true"/>

<field name="address" type="text_ik"indexed="true" stored="true"/>

<field name="keyword" type="text_ik"indexed="true" stored="true"multiValued="true"/>

<copyField source="hotelName"dest="keyword"/>

<copyField source="address"  dest="keyword"/>  

2.             重新执行数据导入,并查询,出现以下结果则多字段配置正确。

3.             关键词搜索,查看查询结果是否正确

1.5.4 solrj 集成 solr 应用以上的操作中,我们根据业务,完善了solr服务器,接下来我们将学习,如何把solr项目集成到项目中来。solr本身提供了对外调用的Http接口,利用Http请求可以直接从solr中获取数据。 为了方便Java程序员调用solr,Apache提供了基于solr操作的solrj程序包。

1.下载solrj程序包

Ø 系统中选用的solrj版本:5.3.1

Ø solrj下载:maven方式

<dependency>

<groupId>org.apache.solr</groupId>

<artifactId>solr-solrj</artifactId>

<version>5.3.1</version>

        </dependency>

2.      在程序中创建solr查询的接收对象(省略get、set)

3.       创建main程序调用solr应用

1.6上传服务器

在本地配置好solr和solr_home后,可以将装载有solr的tomcat和solr_home文件夹直接拷贝

到Linux服务器。此处注意要修改solr中的web.xml的solr_home的地址修改为solr_home在服务

器的实际目录。