在做某电商搜索的时候,由于需要根据规格搜索。所以我们将商品的数据同步到solr,于是出现了动态域乱码问题
当时,需要对规格数据进行处理,我们将动态域的格式设置为item_spec_*当时的思路是:将规格的字段名作为索引,如某手机规格为:“item_spec_运行内存”.
结果变成了这个样子:
问题在于,无法使用汉字,可是不使用汉字,也没有合适的数据作为动态域.
所以想到一种方法.只要不是汉字,数据同步到solr就不会出现乱码情况.于是同步时,将其使用URLEncoder.encode()方法格式为UTF-8.将其转码,由于是JDK自带的.所以不需要加依赖.在某方法中具体代码如下:TbItemExample example=new TbItemExample(); TbItemExample.Criteria criteria = example.createCriteria(); criteria.andStatusEqualTo("2");//已审核 //查到了所有已审核的 List<TbItem> itemList = itemMapper.selectByExample(example); System.out.println("===商品列表==="); for(TbItem item:itemList){ //为了转化动态域,得到数据库中String类型的JSON对象 String spec = item.getSpec(); //转化成匿名对象,用map装,转化时,map中有多少键值对,就转化多少个动态域 Map<String,String> map = JSONObject.parseObject(spec, Map.class); Map<String,String> newMap = new HashMap(); //得到迭代器 Iterator it = map.keySet().iterator(); while (it.hasNext()){//判断是否存在下一个 String key = (String)it.next(); try {//URLEncoder.encode(key,"UTF-8")是JDK自带的,网络转码,我们将转完码的当做键, 原来的值当做值 newMap.put(URLEncoder.encode(key,"UTF-8"),map.get(key)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } item.setSpecMap(newMap); } System.out.println("===结束==="); //将mysql中的数据同步给solr solrTemplate.saveBeans(itemList); solrTemplate.commit();
第一次做博客,代码太乱,请看截图:
来源:CSDN
作者:qq_45833163
链接:https://blog.csdn.net/qq_45833163/article/details/103831474