生成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();
		}
	}
}

4aa91cc7f9cd76e472cf7586cd4fefccd25.jpg

转载于:https://my.oschina.net/Thinkeryjgfn/blog/3083231

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值