菜鸟日志:记录在面对需求时我的解决办法,欢迎各位指正,学习交流。
solr 将字段(field)的类型(fieldtype)由string修改成date
需求:
已存在索引库,但是其中某个字段ADDTIME的f配置文件如下:
<field name="ADDTIME" type="string" indexed="true" stored="true" multiValued="false" />
现因业务需要将改成如下:
<field name="ADDTIME" type="date" indexed="true" stored="true" multiValued="false" />
并且有如下要求:原来的索引数据不能丢失,(数据库已经没有原始数据库了)也就是说不能索引重建。
思考&&解决过程:
- 直接更改schemal.xml配置文件类型然后重启solr,经过测试不行:这样由于string和date的格式不一样索引会报错。
- 直接更新索引字段中ADDTIME的值使其符合DATE类型的要求的格林威治时间(不了解网上可以搜)的格式。但是这样也不行。因此得出结论索引中string不可能直接转换成date的格式,无论它的值符不符合。
- 最后解决办法如下:
首先增加一个字段ADDTIMETEMP(修改schemal.xml然后重启solr)利用solrj读出ADDTIME中的值转换成date的格式插入ADDTIMETEMP中,其中需要利用solr的原子操作<span style="font-size:18px;"> SolrInputDocument ddd = new SolrInputDocument();</span>
<span style="font-size:18px;"> ddd.addField("ID", ID); </span>
<span style="font-size:18px;"> HashMap setOper = new HashMap<String,String>();</span>
<span style="font-size:18px;"> setOper.put("set", ADDTIME); </span>
<span style="font-size:18px;"> System.out.print(setOper);</span>
<span style="font-size:18px;"> ddd.addField("ADDTIME", setOper);</span>
根据ID主键的作用来更新每个ADDTMETEMP的值与ADDTIME一样但ADDTMETEMP的类型是date
然后删除ADDTIME字段,过程是先利用原子操作将其值为空,然后在配置文件中直接删除就可以了。
再增加ADDTIME字段(修改schemal.xml然后重启solr)其类型为date,再走一遍上述的操作将ADDTIMETEMP值更新到ADDTIME然后删除ADDTIMETEMP 最后重启即可
总结:
总的来说也就是在过程中增加一个临时的过度字段,以为solr的配置文件中字段不能重名,类型也不能直接转所以迂回解决了一下。