关于solr7之后版本的动态域,不能使用中文作为拼接索引

可紊 提交于 2020-01-04 14:37:03

在做某电商搜索的时候,由于需要根据规格搜索。所以我们将商品的数据同步到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();
第一次做博客,代码太乱,请看截图:
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!