vlambda博客
学习文章列表

生成Solr增量索引配置xml


    主要是解决在Solr 配置增量索引的时候,如果数据库做了分表比如分了128张,那在配置Solr的data-config.xml的时候会很浪费时间,刚开始我也用dom4生成过,但总是感觉格式有问题,特别是entity的属性的时候deltaImportQuery deltaQuery 这些语句很长,想要换行什么的用dom4j支持并不友好,索性干脆自己用StringBuffer 拼接出来拉到!

package com.test;

import java.io.File;
import java.io.FileOutputStream;


/**
* 北极心
* 2019-08-04 12:39:03
* 生成Solr增量索引配置xml
* */

public class SolrMyXML {
//solr节点配置
private final static String documentName="docEvspgoods";
private final static String name="evspgoods";

//这个很有必要,因为其中的增量索引查询主键ID时需要
private final static String pkid="id";

// query查询是指 查询出表里所有的符合条件的数据,因为笔者测试的有删除业务,所以 where 后面有一个限定条件 意思为查询未被删除的数据 (注意这个query查询只对第一次全量导入有作用,对增量导入不起作用)
private final static String query ="SELECT id,goods_code,goods_name,CREATED_TIME from evsp_goods%s where audit_status=1 and is_sale=1";

//次查询是获取以上两步的ID,然后把其全部数据获取,根据获取的数据 对索引库进行更新操作,可能是删除,添加,修改 (此查询只对增量导入起作用,可以返回多个字段的值,一般情况下,都是返回所有字段的列)
private final static String deltaImportQuery ="select id,goods_code,goods_name,CREATED_TIME from evsp_goods%s where audit_status=1 and is_sale=1 and id='${dih.delta.id}'";

//deltaQuery的意思是,查询出所有经过修改的记录的ID 可能是修改操作,添加操作,删除操作产生的 (此查询只对增量导入起作用,而且只能返回ID值)
private final static String deltaQuery ="select id from evsp_goods%s where audit_status=1 and is_sale=1 and CREATED_TIME>'${dataimporter.last_index_time}'";

// 此操作值查询那些数据库里伪删除的数据的ID(即isdelete标识为1的数据) solr通过它来删除索引里面对应的数据 (此查询只对增量导入起作用,而且只能返回ID值)
private final static String deletedPkQuery ="select id from evsp_goods%s where audit_status=0 and is_sale=0";

//这里是分表规则
private final static int tablecount=1;


//这些常量不要修改
private final static String ENTER = "\r\n";
private final static String SPACE = " ";
private final static String SPACEDOUBLE = " ";
private final static String YH = "\"";
private final static String H = ">";

public static void main(String[] args) {

File xmlfile = new File("c://test.xml");
new SolrMyXML().createSolrDataConfig(xmlfile);
}

/**
* @param xmlfile
*/

/**
* @param xmlfile
*/

public void createSolrDataConfig(File xmlfile) {
try {

// 添加根节点
StringBuffer xmlstr = new StringBuffer("<document name=").append(YH).append(documentName).append(YH).append(H);

// 在根节点下添加第一个子节点
for(int i = 0 ;i<tablecount ;i++) {
xmlstr.append(ENTER);
xmlstr.append(SPACE).append("<entity name=").append(YH).append(name).append(String.valueOf(i)).append(YH).append(ENTER);
xmlstr.append(SPACEDOUBLE).append("dataSource=").append(YH).append("JdbcDataSource").append(YH).append(ENTER);//这里是指定数据源,根据自己实际情况定
xmlstr.append(SPACEDOUBLE).append("pk=").append(YH).append(pkid).append(YH).append(ENTER);
xmlstr.append(SPACEDOUBLE).append("query=").append(YH).append(String.format(query, String.valueOf(i))).append(YH).append(ENTER);
xmlstr.append(SPACEDOUBLE).append("deltaImportQuery=").append(YH).append(String.format(deltaImportQuery, String.valueOf(i))).append(YH).append(ENTER);
xmlstr.append(SPACEDOUBLE).append("deltaQuery=").append(YH).append(String.format(deltaQuery, String.valueOf(i))).append(YH).append(ENTER);
xmlstr.append(SPACEDOUBLE).append("deletedPkQuery=").append(YH).append(String.format(deletedPkQuery, String.valueOf(i))).append(YH).append(H).append(ENTER);
String querys = query.toLowerCase();
String fieldstr = querys.substring(querys.indexOf("select")+6, querys.lastIndexOf("from"));
String[] fields = fieldstr.split(",");
for(int k=0;k<fields.length;k++) {
xmlstr.append(SPACEDOUBLE);
xmlstr.append("<field ");
xmlstr.append("column=").append(YH).append(fields[k].replaceAll(" ", "")).append(YH);
xmlstr.append(" name=").append(YH).append(fields[k].replaceAll(" ", "")).append(YH);
xmlstr.append(" /").append(H).append(ENTER);
}
xmlstr.append(SPACE);
xmlstr.append("</entity>");
}
xmlstr.append(ENTER);
xmlstr.append("</document>");

FileOutputStream out = new FileOutputStream(xmlfile);
out.write(String.valueOf(xmlstr).getBytes("utf-8"));
out.flush();
out.close();
System.out.println("OK!");
} catch (Exception e) {
e.printStackTrace();
}
}
}