solr的全量索引

紧接上篇ansj分词整合后,开始需要做索引。索引分增量和全量,可以直接连接数据库去做,也可以通过程序去做,以下实现连接数据库去做,相对来说比较简单。

1.修改multicore/new_core/conf/solrconfig.xml文件(上篇提到过的),在里面新增

Xml代码

1.<requestHandlername="/dataimport"class="org.apache.solr.handler.dataimport.DataImportHandler">

2.<lstname="defaults">

3.<strname="config">data-config.xml</str>

4.</lst>

5.</requestHandler>

6.<requestHandlername="/deltaimport"class="org.apache.solr.handler.dataimport.DataImportHandler">

7.<lstname="defaults">

8.<strname="config">delta-data-config.xml</str>

9.</lst>

10.</requestHandler>

其中第一段是专门做全量索引的,第二段做增量索引(主要是靠DataImportHandler类实现)

2.新增multicore/new_core/conf/data-config.xml文件

Xml代码

1.<dataConfig>

2.<dataSourcename="jdbc"driver="com.mysql.jdbc.Driver"

3.url="jdbc:mysql://192.168.0.81:3306/new_mall?zeroDateTimeBehavior=convertToNull&amp;characterEncoding=utf8&amp;useUnicode=true"

4.user="root"password="HyS_Db@2014"/>

5.<documentname="mall_goods">

6.<entityname="MallGoods"pk="id"

7.query="select*frommall_goodslimit${dataimporter.request.length}offset${dataimporter.request.offset}"

8.transformer="RegexTransformer">

9.<fieldcolumn="goods_id"name="id"/>

10.<fieldcolumn="title"name="title"/>

11.<fieldcolumn="subtitle"name="subtitle"/>

12.<fieldcolumn="cover_img_path"name="coverImgPath"/>

13.<fieldcolumn="description"name="description"/>

14.<fieldcolumn="update_date"name="updateDate"/>

15.</entity>

16.</document>

17.</dataConfig>

dataSource不用说了,数据源配置来的

entity文档中的实体配置(注意pk="id"不能随便改,需要和schema.xml中的<uniqueKey>id</uniqueKey>匹配,否则会报“org.apache.solr.common.SolrException:DocumentismissingmandatoryuniqueKeyfield:id”)

query查询语句(可分页)

transformer暂时不清楚干啥

field定义列名

3.新增multicore/new_core/conf/delta-data-config.xml文件

Xml代码

1.<dataConfig>

2.<dataSourcename="jdbc"driver="com.mysql.jdbc.Driver"

3.url="jdbc:mysql://192.168.0.81:3306/new_mall?zeroDateTimeBehavior=convertToNull&amp;characterEncoding=utf8&amp;useUnicode=true"

4.user="root"password="HyS_Db@2014"/>

5.<documentname="mall_goods">

6.<entityname="MallGoods"pk="id"

7.query="select*frommall_goods"

8.deltaImportQuery="select*frommall_goodswheregoods_id='${dih.delta.id}'"

9.deltaQuery="selectgoods_idasidfrommall_goodswhereupdate_date&gt;'${dih.last_index_time}'"

10.transformer="RegexTransformer">

11.<fieldcolumn="goods_id"name="id"/>

12.<fieldcolumn="title"name="title"/>

13.<fieldcolumn="subtitle"name="subtitle"/>

14.<fieldcolumn="cover_img_path"name="coverImgPath"/>

15.<fieldcolumn="description"name="description"/>

16.<fieldcolumn="update_date"name="updateDate"/>

17.</entity>

18.</document>

19.</dataConfig>

deltaQuery查询出有更改过的id

deltaImportQuery根据id查询

4.修改multicore/new_core/conf/schema.xml文件,定义field索引配置

Xml代码

1.<fieldname="id"type="string"indexed="true"stored="true"required="true"multiValued="false"/>

2.<fieldname="title"type="text_ansj"indexed="true"stored="true"required="true"multiValued="false"/>

3.<fieldname="subtitle"type="text_ansj"indexed="true"stored="true"required="false"multiValued="false"/>

4.<fieldname="coverImgPath"type="string"indexed="false"stored="true"required="true"multiValued="false"/>

5.<fieldname="description"type="text_ansj"indexed="true"stored="true"required="false"multiValued="false"/>

6.<fieldname="updateDate"type="text_ansj"indexed="true"stored="true"required="false"multiValued="false"/>

7.

注意上面选择一下text_ansj

5.solr的war包可能还缺少部分jar包,需要把mysql的jar,以及solr项目中dist目录下的jar包都放到solr的web站点中

6.开始运行

全量:http://solr.xxxx.com:8082/new_core/dataimport?command=full-import&commit=true&clean=false&offset=0&length=100000(其中0到100000的数据建立索引)

增量:http://solr.ehaoyao.com:8082/new_core/deltaimport?command=delta-import&entity=MallGoods

entity:是document下面的标签(data-config.xml)。使用这个参数可以有选择的执行一个或多个entity。使用多个entity参数可以使得多个entity同时运行。如果不选择此参数那么所有的都会被运行。

clean:选择是否要在索引开始构建之前删除之前的索引,默认为true

commit:选择是否在索引完成之后提交。默认为true

optimize:是否在索引完成之后对索引进行优化。默认为true

debug:是否以调试模式运行,适用于交互式开发(interactivedevelopmentmode)之中。

请注意,如果以调试模式运行,那么默认不会自动提交,请加参数“commit=true”

注意:在做增量索引的时候

很容易出现deltaQueryhasnocolumntoresolvetodeclaredprimarykeypk='id'这种异常

主要是因为ID"mustbeusedasitisin'deltaQuery'selectstatementas"selectIDfrom..."

(ifyoudifferentnameforIDcolumnindatabase,thenuse'as'keywordinselectstatement.InmycaseIhad'studentID'asprimarykeyinstudenttable.SoIuseditas"selectstudentIDasIDfrom..."

-->Thesameappliesto'deletedPkQuery'

Atpresentitsworkingfineforme.AnyupdationindatabaseisreflectedinSolraswell.

所以,delta-data-config.xml文件需要注意一下pk的值

参考连接:

http://shiyanjun.cn/archives/444.html

http://blog.duteba.com/technology/article/70.htm

http://www.devnote.cn/article/89.html

http://zzstudy.offcn.com/archives/8104

http://blog.csdn.net/duck_genuine/article/details/5426897

相关推荐