当前位置: 首页 > 架构相关 > solr搜索服务配置笔记,与生产项目结合使用

solr搜索服务配置笔记,与生产项目结合使用

在上一篇写了solr服务的搭建:solr搜索服务搭建笔记 这一篇主要写配置,solr搜索服务的配置主要就是两个文件,一个是schema.xml另一个是solrconfig.xml,前者是solr的模式关联文件,与数据库关联的字段都在这里配置,在这里可以指定字段的类型、是否索引、是否存储,分词器的配置也在此配置等。后者,配置的是包含依赖的jar和solr的一些插件、组件信息的配置,还有配置了各种web请求处理器、请求响应处理器、日志、缓存等。在搭建过程中要根据自己的项目来配置,项目不同可能相关配置不同,但是步骤就这么几步,不会出错。下面开始配置。

一、schema.xml的配置

主要配置与数据库需要搜索、存储的自动相对应。

1、保留_version_ 这个field,按数据库字段添加需要的field,并删除其他field

vim /opt/solr/server/solr/proj/conf/schema.xml

将需要的自动添加进去,比如:

<field name="id" type="string" indexed="true" stored="true" required="true" 
multiValued="false" />
<field name="firstImgId" type="int" indexed="false" stored="true" multiValued="false" />
<field name="insertTime" type="string" indexed="false" stored="true" multiValued="false" />
<field name="view" type="int" indexed="false" stored="true" multiValued="false" />
<field name="cate" type="textMaxword" indexed="true" stored="true" multiValued="false" />
<field name="title" type="textMaxword" indexed="true" stored="true" multiValued="false" />
<field name="descript" type="textMaxword" indexed="false" stored="true" multiValued="false"/>
<field name="source" type="textMaxword" indexed="false" stored="true" multiValued="false" />
<field name="tags" type="textMaxword" indexed="true" stored="true" multiValued="false" />
<field name="content" type="textMaxword" indexed="true" stored="false" multiValued="false"/>
<field name="text" type="textMaxword" indexed="true" stored="false" multiValued="true" />

type的值不是瞎取的,应该存在name为这个值的fieldType,比如上面的“textMaxword” 就是自己安装的中文分词mmseg4j,在schema.xml中添加了该fieldType的name等于textMaxword。

indexed :是否索引。

stored:是否存储。

multiValued:见下面的介绍。

2、还是在schema.xml文件中,找到uniqueKey,修改为自己的项目中的主键索引

<uniqueKey>id</uniqueKey>

3、schema.xml中设置默认搜索字段

这个是强烈要求建议添加的,如果你多个自动需要查询的话,这个可以成倍的提高性能(这个在solr5.+以后的版本不需要,所以这个步骤忽略,但是在4.+版本是需要的)

<defaultSearchField>text</defaultSearchField> //因为下文中将字段合并到了text中,所以我这里选择text

4、schema.xml中多字段合并同时查询,可以显著提高性能,就如上面所说的

<field name="text" type="textMaxword" indexed="true" stored="false" multiValued="true" />
<copyField source="cate" dest="text" />
<copyField source="title" dest="text" />
<copyField source="tags" dest="text" />
<copyField source="content" dest="text" />

   

二、配置solrconfig.xml

配置solr与数据库的关联 并全量/DIH增量从MYSQL数据库导入数据

1、在<requestHandler name="/select" class="solr.SearchHandler">前面上加上一个dataimport的处理的Handler

vim /opt/solr/server/solr/proj/conf/solrconfig.xml

添加如下代码(data-config就是要进行增量索引时与数据库关联的配置文件):

<requestHandler name="/dataimport" 
class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
        <str name="config">data-config.xml</str>
    </lst>
</requestHandler>

2、在/opt/solr/server/solr/proj/conf/目录下新增data-config.xml文件

并将下面的代码添加到data-config.xml文件中,数据库、数据库用户名,数据库密码都是在这里配置,务必要有一个文字更改时间字段,我这里是updateTime,至于为什么会用到FROM_UNIXTIME这个函数,会在下面进行介绍。(因为我的数据是两个表中都要用到,所以我用多个entry进行多表的数据查询)

至于多服务器多个库的查询的请查看:http://blog.csdn.net/awj3584/article/details/10326439 

<?xml version="1.0" encoding="utf-8"?>
<dataConfig>
    <dataSource type="JdbcDataSource" name="ds-1" driver="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/xxdbname" user="" password="" />
    <document>
        <entity dataSource="ds-1" name="follow1" pk="id" query="select id,firstImgId,insertTime,
        view,cate,title,descript,tags from xxx-article-table" deltaImportQuery="select 
        id,firstImgId,insertTime,view,cate,title,descript,tags from blog_article_info where 
        id='${dih.delta.id}'" deltaQuery="select id from xxx-article-table where 
        FROM_UNIXTIME(updateTime)&gt;'${dih.last_index_time}'">
            <field column="id" name="id" />
            <field column="firstImgId" name="firstImgId" />
            <field column="insertTime" name="insertTime" />
            <field column="view" name="view" />
            <field column="cate" name="cate" />
            <field column="title" name="title" />
            <field column="descript" name="descript" />
            <field column="tags" name="tags" />
            <entity dataSource="ds-1" name="xxx-article-content" query="select 
            content from blog_article_content where articleId='${follow1.id}'">
                <field column="content" name="content" />
            </entity>
        </entity>
    </document>
</dataConfig>

说明:

dataSource是数据库数据源。

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

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

3、拷贝mysql的连接、solr增量导入的jar文件

拷贝mysql-connector-java-5.1.22-bin.jar

和solr-dataimporthandler-4.10.3.jar

到/opt/tomcat/webapps/solr/WEB-INF/lib/。一个是mysql的java驱动,需要下载,另一个在/opt/solr/dist/目录里,是org.apache.solr.handler.dataimport.DataImportHandler所在的jar。

(前者下载地址:http://pan.baidu.com/s/1ntMM0mX  )

cp /opt/solr/dist/solr-dataimporthandler-4.10.3.jar /opt/tomcat/webapps/solr/WEB-INF/lib/
cp mysql-connector-java-5.1.22-bin.jar /opt/tomcat/webapps/solr/WEB-INF/lib/

接下来重启tomcat


三、测试增量导入,并设置为定时的增量导入

1、向数据库中添加一些数据

数据库会以当前时间赋值给updateTime字段。使用solr后台进行dataimport?command=delta-import增量导入,然后再用query进行查询,就可以查询到刚刚添加的数据。操作分别见下图:


看到右侧出现了你刚刚插入的数据,恭喜你成功了。假如你失败了,那么...请重新开始配置一边,你又可能忘记了某个步骤^_^。

2、将增量导入设置为定时任务

如果全量导入当数据量非常大的时候代价也非常大,所以建议以定时任务的方式设置为增量导入,其实就是一个增量导入的连接,你定时访问就可以,建议每天一次:

http://localhost:5218/solr/proj/dataimport?command=delta-import&clean=false&commit=true



写在最后

增量索引的原理是从数据库中根据deltaQuery指定的SQL语句查询出所有需要增量导入的数据的ID号。

然后根据deltaImportQuery指定的SQL语句返回所有这些ID的数据,即为这次增量导入所要处理的数据。

核心思想是:通过内置变量“${dih.delta.id}”和 “${dataimporter.last_index_time}”来记录本次要索引的id和最近一次索引的时间。

注意:刚新加上的updateTime字段也要在field属性中配置,同时也要在schema.xml文件中配置:

<field name="updateTime" type="date" indexed="true" stored="true"/>

增量导入即DIH增量从MYSQL数据库导入数据,还需要了解的一些东东:

1、数据库该有的东西

如果要增量导入,则数据库表中必须有一个时间字段,如:updateTime,类型为timestamp默认值为当前系统时间的字段 :CURRENT_TIMESTAMP(mysql),有了这样一个字段,Solr才能判断增量导入的时候,哪些数据是新的。因为Solr本身有一个默认值last_index_time,记录最后一次做full import或者是delta import(增量导入)的时间,这个值存储在文件conf目录的dataimport.properties文件中。(如果updateTime为int类型则需要用到mysql的FROM_UNIXTIME(updateTime))正如我上面就用到了。

2、data-config.xml中必要了解的属性

transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签

query:查询数据库表符合记录数据

deltaQuery:增量索引查询主键ID  注意这个只能返回ID字段   

deltaImportQuery:增量索引查询导入的数据 

deletedPkQuery:要删除的数据

有关“query”,“deltaImportQuery”, “deltaQuery”的解释,官方的解释如下:

The query gives the data needed to populate fields of the Solr document in full-import

The deltaImportQuery gives the data needed to populate fields when running a delta-import

The deltaQuery gives the primary keys of the current entity which have changes since the last index time

如果需要关联子表查询,则具体看上面配置data-config.xml的方式

3、关于删除

如果业务中还有删除操作,可以在数据库中加一个isDeleted字段来表明该条数据是否已经被删除,这时候Solr在更新index的时候,可以根据这个字段来更新哪些已经删除了的记录的索引。

这时候需要在dataConfig.xml中添加:

query="select * from article where isDeleted=0"

deltaImportQuery="select * from article where id='${dih.delta.id}'"

deltaQuery="select id from article where updateTime> '${dataimporter.last_index_time}' and isDeleted=0"

deletedPkQuery="select id from article where isDeleted=1"

那么Solr进行增量索引的时候,就会删除数据库中isDeleted=1的数据的索引。

    

祝成功。


转载时请以 超链接的形式 注明:转自Ferman

                  

About me