Solr实时建立增量或全量索引

1,为了支持增量建索引,咱们须要把上述文中的mysql-data-config.xml内容改成java

<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或其余调试插件拿到真实请求的地址(去掉了一些无用参数):mysql

增量建索引连接sql

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调用方法:apache

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就行。ui

相关说明:url

主要原理:是利用率每次咱们进行import的时候在solr.home的conf下面生成的dataimport.properties文件,此文件里面有最近一次导入的相关信息,如:
个人文件位置为.net

/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说明:

  1. query是获取所有数据的SQL

  2. deltaImportQuery是获取增量数据时使用的SQL

  3. deltaQuery是获取主键的SQL

参数说明:

  1. clean:设置建索引前是否删除以前的索引;

  2. commit:设置建索引后是否自动提交;

  3. entity:mysql-data-config.xml entity name中配置的名称,若是配有多个,且这里不指定,全部entity都会被执行;

  4. optimize:设置建索引后是否自动优化。

相关文章
相关标签/搜索