1,为了支持增量建索引,我们需要把上述文中的mysql-data-config.xml内容改为
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/basic" user="root" password="123"/>
<document>
<entity name="article" transformer="HTMLStripTransformer"
query="SELECT id, title, content FROM article"
deltaImportQuery="SELECT id, title, content FROM article
WHERE id='${dataimporter.delta.id}'"
deltaQuery="SELECT id FROM article
WHERE update_time > '${dataimporter.last_index_time}'">
<field column="id" name="id" />
<field column="title" name="title" />
<field column="content" name="content" stripHTML="true" />
</entity>
</document>
</dataConfig>
2,我们在上述文中最后Execute时,使用firebug或其他调试插件拿到真实请求的地址(去掉了一些无用参数):
增量建索引链接
http://localhost:8983/solr/collection1/dataimport?command=delta-import&clean=false&commit=true&entity=article&optimize=false
全量建索引链接
http://localhost:8983/solr/collection1/dataimport?command=full-import&clean=true&commit=true&optimize=true
3,有了地址不难总结出solrj调用方法:
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import base.util.ConfigUtil;
public class SolrService {
private static Logger log = Logger.getLogger(SolrService.class);
private static HttpSolrServer solrServer;
static {
solrServer = new HttpSolrServer(ConfigUtil.getValue("solr.url"));
solrServer.setConnectionTimeout(5000);
}
/**
* 增量/全量建立索引 。
*
* @param delta ture,增量建立索引;false,重建所有索引
*/
public static void buildIndex(boolean delta) {
SolrQuery query = new SolrQuery();
// 指定RequestHandler,默认使用/select
query.setRequestHandler("/dataimport");
String command = delta ? "delta-import" : "full-import";
String clean = delta ? "false" : "true";
String optimize = delta ? "false" : "true";
query.setParam("command", command)
.setParam("clean", clean)
.setParam("commit", "true")
.setParam("entity", "article")
.setParam("optimize", optimize);
try {
solrServer.query(query);
} catch (SolrServerException e) {
log.error("建立索引时遇到错误,delta:" + delta, e);
}
}
}
4,然后在你需要的位置,如文章发布、修改后删除等候调用即可。
其实这个方法不用SolrJ的对像,用httpclient甚至java.net.URL都可以,只要能访问url就行。
相关说明:
主要原理:是利用率每次我们进行import的时候在solr.home的conf下面生成的dataimport.properties文件,此文件里面有最近一次导入的相关信息,如:
我的文件位置为
/root/solr-4.5.1/example/solr/collection1/conf
我的文件内容为
#Mon Dec 09 14:06:03 CST 2013
last_index_time=2013-12-09 14\:06\:00
article.last_index_time=2013-12-09 14\:06\:00
last_index_time是最近一次增量或全量索引的时间,通过比较这个时间和我们数据库表中的update_time列即可得出哪些是之后修改或者添加的。
data-config.xml说明:
query是获取全部数据的SQL
deltaImportQuery是获取增量数据时使用的SQL
deltaQuery是获取主键的SQL
参数说明:
clean:设置建索引前是否删除之前的索引;
commit:设置建索引后是否自动提交;
entity:mysql-data-config.xml entity name中配置的名称,如果配有多个,且这里不指定,所有entity都会被执行;
optimize:设置建索引后是否自动优化。