solr 英文模拟mysql like查询xml_solr 模拟数据库like查询(不使用分词)

solr 模拟数据库like查询(不使用分词)

发布时间:2020-03-24作者:laosun阅读(1098)

0f9e8264915948f7a1174b4a48c40c63.gif

IK分词个别拆分的不够完美,另外个别业务逻辑是需要替代数据库的like查询。所以本篇文章是介绍如何在solr中使用类似数据库的like查询。

本片文章是介绍如何在solr中使用类似数据库的like操作。

首先我们抛弃text_ik。IK分词,因为使用的是like操作,所以这块不能在使用分词了。

我们需要在在conf目录下找到managed-schema配置文件。

增加节点如下:                        

另外配置一下查询字段,如下所示:

这种简单的配置即可完成like操作。

另外上边的配置增加 LowerCaseFilterFactory 。也就是忽略大小写的意思。

现在博主贴出一个query测试案例:public static Page querySellerFromSolrByName(Integer pageNumber, Integer pageSize, Kv cond) {        Page page = new Page();        if(StringUtils.isNotBlank(cond.getStr("name"))){        String name = StringKit.escapeQueryChars(cond.getStr("name"));        cond.set("name", name);        }                SolrQuery query = new SolrQuery();        query.setHighlight(false);        query.addHighlightField("name");        query.setHighlightSimplePre("");        query.setHighlightSimplePost("");        query.setStart((pageNumber-1)*pageSize);        query.setRows(pageSize);        String sql = Const.BLANK;        if(StringUtils.isNotBlank(cond.getStr("name"))) {        sql += " AND name:*"+cond.getStr("name")+"*";        }        if(StringUtils.isNotBlank(cond.getStr("companyId"))) {        sql += " AND company_id:"+cond.getStr("companyId");        }        sql = sql.substring(5, sql.length());        query.set("q", sql);                List articles = new ArrayList();        SolrClient solrClient = createSolrServer(SolrUrlEnum.SOLR_SELLER.getValue());        try {            QueryResponse response = solrClient.query(query);            SolrDocumentList docList = response.getResults();            Iterator it = docList.iterator();            while (it.hasNext()) {                SolrDocument doc = it.next();                String id = doc.getFieldValue("id").toString();                String name = doc.getFieldValue("name")==null?null:doc.getFieldValue("name").toString();                Long key = doc.getFieldValue("key")==null?0L:Long.valueOf(doc.getFieldValue("key").toString());                String shortName = doc.getFieldValue("short_name")==null?null:doc.getFieldValue("short_name").toString();                String companyId = doc.getFieldValue("company_id")==null?null:doc.getFieldValue("company_id").toString();                                 TScanqrSeller seller = new TScanqrSeller();                seller.set("id", id);                seller.put("name_text", name);                seller.set("key", key);                seller.set("short_name", shortName);                seller.set("company_id", companyId);                                if(StringUtils.isNotBlank(cond.getStr("name"))) {                Pattern p = Pattern.compile(cond.getStr("name"), Pattern.CASE_INSENSITIVE);                      Matcher m = p.matcher(name);                      while(m.find()) {                    for(int i=0; i<=m.groupCount(); i++){                    String oldValue = m.group(i);                    name = name.replaceFirst(StringKit.escapeQueryChars(oldValue), ""+oldValue+"");            }                    }                    seller.set("name", name);                }                //              name = name.replaceAll("(?i)"+reqparam, ""+"(?i)"+reqparam+"");                articles.add(seller);            }            Integer totalRow = Integer.valueOf(docList.getNumFound()+"");            Integer totalPage = (int) (totalRow % pageSize == 0 ? totalRow / pageSize : Math.ceil((double)totalRow / (double)pageSize)) ;            page = new Page(articles, pageNumber, pageSize, totalPage, totalRow);        } catch (SolrServerException e) {            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        } finally{            try {                solrClient.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return page;    }public static String escapeQueryChars(String s) {        StringBuilder sb = new StringBuilder();        for (int i = 0; i 

上边有一点需要谨记,多条件查询的时候,连接符AND,要使用大写才能生效。

af499b9437efec8e1b25c2bb396e60d7.png

4 +1

版权声明

发表评论

请文明留言

发表

共 2 条评论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值