Solr索引的修改方式:
1.使用Solr Data Import的 delta_import部分增量导入的功能:
Solr通过数据库导入有两种方式,full-import和delta-import,delta-import增量导入的原理是利用每次我们进行import的时候在solr.home\conf下面生成的dataimport.properties文件
item.last_index_time=2014-01-24 18\:31\:47
last_index_time=2014-01-24 18\:31\:47
其实last_index_time是最近一次索引(full-import或者delta-import)的时间。
通过比较这个时间和我们数据库表中的timestamp列即可得出哪些是之后修改或者添加的
可通过http://<host>:<port>/solr/dataimport查看
修改data-config.xml如下:
<entity name="item" pk="PRODUCT_ID" query="SELECT PRODUCT_ID FROM product" deltaQuery="SELECT PRODUCT_ID FROM product WHERE UPDATE_TIME >
'${dataimporter.last_index_time}'" parentDeltaQuery="SELECT PRODUCT_ID FROM product WHERE PRODUCT_ID='${item.PRODUCT_ID}'" >
<entity name="brand" pk="BRAND_ID" query="SELECT BRAND_NAME FROM brand_info WHERE BRAND_ID='${item.PRODUCT_BRAND_ID}'" deltaQuery="SELECT
BRAND_ID FROM brand_info WHERE LAST_UPDATE_DATE > '${dataimporter.last_index_time}'" parentDeltaQuery="SELECT PRODUCT_ID FROM product WHERE
PRODUCT_BRAND_ID='${brand.BRAND_ID}'">
<field column="BRAND_NAME" name="PRODUCT_BRAND_NAME"/>
</entity>
</entity>
其中 query是获取全部数据的SQL,deltaImportQuery是获取增量数据时使用的Sql,deltaQuery是获取pk的SQL,parentDeltaQuery是获取父Entity的pk的SQL
Full Import工作流程,执行EntityQuery获取所有数据,针对每个行数据Row,获取pk,组装子Entity的Query,执行子Entity的Query,获取子Entity的数据
Delta Import工作流程 查找子Entity直到没有为止,执行Entity的deltaQuery获取变化的pk合并子Entity parentDeltaQuery得到的pk,针对每个pk Row,组装父Entity的
parentDeltaQuery,执行parentDeltaQuery,获取父Entity的pk,执行deltaImportQuery获取自身所有的变化数据,如果没有deltaImportQuery,就执行Query进行原来的拼接
注意:
子Entity的query必须引用父Entity的pk
子Entity的parentDeltaQuery必须引用自己的pk
子Entity的parentDeltaQuery必须返回父Entity的pk
deltaImportQuery引用的必须是自己的pk
item.last_index_time=2014-01-24 18\:31\:47中的item表示data-config.xml中的document下面的标签,可以有选择的指定一个或多个,使用多个可以使得多个entity同时运行
如果不选择此参数那么所有的都会被运行
clean 表示删除索引,默认为true
commit 表示是否索引完成后提交,默认为true
opimize 对索引进行优化,默认为true,每次操作索引最后执行它,但是如果操作很频繁的话,就需要选择性的执行它
debug 是否以调试模式运行,适用于开发中,注意每次以调试模式运行,那么默认不会自动提交,请加参数commit=true才行
当对索引修改时,可以编写过滤器来HTTP请求调用这个来操作索引,http://192.168.2.123/solr/dataimport?command=delta-import&clean=false&commit=true&optimize=true
由于deltaImport是要比对配置文件和数据库数据的最后修改时间,那么如果想要先物理删除数据库中的某条记录,再去删除索引这就不行了,因为数据库中没有这条数据,无
法和配置文件的最后修改时间进行比对。
2. 利用xml格式进行索引的修改
<add> <doc> <field name="employeeId">05991</field> <field name="office" update="set">Walla Walla</field> <field name="skills" update="add">Python</field> </doc> </add>
Set 表示修改 ,add表示新增
<delete><id>05991</id></delete>delete的时候必须要有id
可以通过去数据库查找数据后,拼接成XML,通过HTTP请求将数据流提交到Solr服务器。