solr与.net系列课程(八)solr中重跑索引的注意事项

8/10/2015来源:ASP.NET技巧人气:2209

solr与.net系列课程(八)solr中重跑索引的注意事项

solr与.net系列课程(八)solr中重跑索引的注意事项

我们如果在项目中使用solr,那肯定就是把数据库中的数据跑进solr服务器中,solr有两种操作一种是新建索引,一种是增量索引,这里我们来说一说新建索引的一下注意事项

终止跑索引 http://192.168.0.9:8080/solr/collection1/dataimport?command=abort

开始索引 http://192.168.0.9:8080/solr/collection1/dataimport?command=full-import

当我们第一次执行索引时,因为solr中没有数据,所以一切都会是按照我们想象的结果发生,但当我们需要重新执行索引的时候,在用上面的链接执行,就会出现一个问题,执行时是solr中的所有数据都消失了,然后在一点点的增加,这样肯定是不行的,因为当数据量很大是,执行一次索引要花费很长时间,这时用户登录你的系统就会发现你的数据不够,会出问题的,只有执行全部完成时数据才会完整,导致这个原因是因为solr默认的所以机制是,先移除原有的所有数据(其实是转移到另一个位置,当索引完成时在删除,索引异常时会回滚),然后在一条条的往里面跑,但是我们可以选择重跑索引时不移除数据,而是逐条覆盖原有数据,这样就不会影响用户使用的,但是会增加索引的时间,

执行语句为 http://192.168.0.9:8080/solr/collection1/dataimport?command=full-import&clean=false

在图形界面如下操作:

然后我们在来说一说多表索引的问题,当我们的数据是从多张表中获取的,如下

<dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.0.9;DatabaseName=test" user="sa" passWord="123"/>    <document name="Info">        <entity name=" test1 "  transformer="ClobTransformer" pk="id"                 query="select id, name address,phone,class,addtime from tableA"                         deltaImportQuery=" select id, name address,phone,class,addtime from tableA"                     deltaQuery="SELECT id FROM tableA where adddate > '${dataimporter.last_index_time}'">                              <field column="id"      name="id"      />                      <field column="name"      name="solrname"      />                      <field column="address "      name=“address "      />                      <field column="phone "      name="phone "      />                     <field column="class "      name="class "      />                      <field column="addtime "      name="addtime "      />          </entity><entity name=" test2 "  transformer="ClobTransformer" pk="id"                 query="select id, name address,phone,class,addtime from tableB"                         deltaImportQuery=" select id, name address,phone,class,addtime from tableB"                     deltaQuery="SELECT id FROM tableB where adddate > '${dataimporter.last_index_time}'">                              <field column="id"      name="id"      />                      <field column="name"      name="solrname"      />                      <field column="address "      name=“address "      />                      <field column="phone "      name="phone "      />                     <field column="class "      name="class "      />                      <field column="addtime "      name="addtime "      />          </entity>    </document>    </dataConfig>

这个数据源就是从tableA与tableB中获取数据,当然了,两张表的id不能重复,否则后进来的会覆盖先进入的数据,那么当我们只想重新索引其中一张表怎么办,

http://192.168.0.9:8080/solr/collection1/dataimport?command=full-import,这个语句会重跑所有的数据(两个table都会重跑),其实solr是可以根据entity的name单个索引的,其他表的数据不变

方法如下:

http://192.168.0.9:8080/solr/collection1/dataimport?entity=test1&command=full-import,当然也可以加上clean=false,

图形界面操作方式: