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&characterEncoding=utf8&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&characterEncoding=utf8&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>'${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