Solr(六)javaAPI之solrj--查询

目录

1. 全查询

2. 分页

3. 排序

4. 高亮

5. 范围

6. 过滤

7. 合并域

8. 综合查询


1. 全查询

    @Test
    public void queryAll() throws Exception {
        HttpSolrClient httpSolrClient = HttpSolrClientUtils.getHttpSolrClient();
        String keywords="*:*";
        //创建一个查询条件对象
        SolrQuery solrQuery=new SolrQuery(keywords);
        //查询
        QueryResponse query = httpSolrClient.query(solrQuery);
        //取出结果
        SolrDocumentList results = query.getResults();
        System.out.println("总条数:"+results.getNumFound());
        for (SolrDocument result : results) {
            System.out.println(result);
        }
    }

2. 分页

    @Test
    public void queryForPage() throws Exception{
        HttpSolrClient httpSolrClient = HttpSolrClientUtils.getHttpSolrClient();
        String keywords="*:*";
        //创建一个查询条件对象
        SolrQuery solrQuery=new SolrQuery(keywords);
        int page=2;
        int limit=3;
        solrQuery.setStart((page-1)*limit);//设置从哪里开始查,不查页码
        solrQuery.setRows(limit);//设置每页显示多少条
        //查询
        QueryResponse query = httpSolrClient.query(solrQuery);
        //取出结果
        SolrDocumentList results = query.getResults();
        System.out.println("总条数:"+results.getNumFound());
        for (SolrDocument result : results) {
            System.out.println(result);
        }
    }

3. 排序

    @Test
    public void queryForSort() throws Exception{
        HttpSolrClient httpSolrClient = HttpSolrClientUtils.getHttpSolrClient();
        String keywords="*:*";
        //创建一个查询条件对象
        SolrQuery solrQuery=new SolrQuery(keywords);
//        solrQuery.setSort("id",SolrQuery.ORDER.desc); //只能根据一个属性进行排序
        solrQuery.setSort("age",SolrQuery.ORDER.asc);

        //查询
        QueryResponse query = httpSolrClient.query(solrQuery);
        //取出结果
        SolrDocumentList results = query.getResults();
        System.out.println("总条数:"+results.getNumFound());
        for (SolrDocument result : results) {
            System.out.println(result);
        }
    }

4. 高亮

    @Test
    public void queryHeightLight() throws Exception{
        HttpSolrClient httpSolrClient = HttpSolrClientUtils.getHttpSolrClient();
        List<Person> personList=new ArrayList<>();
        String keywords="name:吕布";
        //创建一个查询条件对象
        SolrQuery solrQuery=new SolrQuery(keywords);
        //开户高亮
        solrQuery.setHighlight(true);
        //设置要进行高亮的属性
        solrQuery.addHighlightField("name");
        solrQuery.addHighlightField("remark");
        //设置高亮的前后缀
        solrQuery.setHighlightSimplePre("<font color=red>");
        solrQuery.setHighlightSimplePost("</font>");

        //查询
        QueryResponse query = httpSolrClient.query(solrQuery);
        //取出结果
        SolrDocumentList results = query.getResults();
        //取出高亮的结果
        Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();
        System.out.println("总条数:"+results.getNumFound());
        for (SolrDocument result : results) {//搜索处理的每个文档,进文档里面的内容进行高亮
            Person person=new Person();
            person.setId(Integer.valueOf(result.getFieldValue("id").toString()));
            person.setName(result.getFieldValue("name").toString());
            person.setAge(Integer.valueOf(result.getFieldValue("age").toString()));
            person.setSex(result.getFieldValue("sex").toString());
            person.setSalary(Double.valueOf(result.getFieldValue("salary").toString()));
            person.setRemark(result.getFieldValue("remark").toString());
//            System.out.println(result);
            String id= (String) result.getFieldValue("id");
            Map<String, List<String>> listMap = highlighting.get(id);
            if(null!=listMap&&!listMap.isEmpty()){
                List<String> name = listMap.get("name");
                List<String> remark = listMap.get("remark");
//                System.out.println(name.get(0)+"  "+remark.get(0));
                if(!StringUtils.isEmpty(name.get(0))){
                    person.setName(name.get(0));
                }
                if(!StringUtils.isEmpty(remark.get(0))){
                    person.setRemark(remark.get(0));
                }

            }
            personList.add(person);
        }
        for (Person person : personList) {
            System.out.println(person);
        }
    }

5. 范围

    @Test
    public void queryForRange() throws Exception{
        HttpSolrClient httpSolrClient = HttpSolrClientUtils.getHttpSolrClient();
        //创建条件
        SolrQuery solrQuery=new SolrQuery("*:*");
        //限定范围 20-40岁之间的
        solrQuery.setFilterQueries("age:[20 TO 40]");

        QueryResponse query = httpSolrClient.query(solrQuery);
        //取出结果
        SolrDocumentList results = query.getResults();
        System.out.println("总条数:"+results.getNumFound());
        for (SolrDocument result : results) {
            System.out.println(result);
        }
    }

6. 过滤

    @Test
    public void queryForFilter() throws Exception{
        HttpSolrClient httpSolrClient = HttpSolrClientUtils.getHttpSolrClient();
        //创建条件
        SolrQuery solrQuery=new SolrQuery("*:*");
        //限定条件 年龄=33
        solrQuery.setFilterQueries("age:33");

        QueryResponse query = httpSolrClient.query(solrQuery);
        //取出结果
        SolrDocumentList results = query.getResults();
        System.out.println("总条数:"+results.getNumFound());
        for (SolrDocument result : results) {
            System.out.println(result);
        }
    }

7. 合并域

7.1 在配置/usr/local/solr-7.7.3/server/solr/db2-core/conf/managed-schema中添加

  <field name="keywords" type="text_en" uninvertible="false" multiValued="true" indexed="true" stored="true"/>
  <copyField source="name" dest="keywords"/>
  <copyField source="remark" dest="keywords"/>

7.2 控制台添加 

7.3 重启solr

7.4 清空之前的数据,重新添加数据,查询

    @Test
    public void queryForArea() throws Exception{
        HttpSolrClient httpSolrClient = HttpSolrClientUtils.getHttpSolrClient();
        //创建条件
        SolrQuery solrQuery=new SolrQuery("keywords:吕布");
        QueryResponse query = httpSolrClient.query(solrQuery);
        //取出结果
        SolrDocumentList results = query.getResults();
        System.out.println("总条数:"+results.getNumFound());
        for (SolrDocument result : results) {
            System.out.println(result);
        }
    }

8. 综合查询

 @Test
    public void queryZhongHe() throws Exception{
        Map<String, String> filter=new HashMap<>();
        //filter.put("age","33");
        List<Map<String, Object>> list = queryAll("*", 1, 10, 1, "0-40", filter);
        for (Map<String, Object> map : list) {
            System.out.println(map);
        }
    }

    public   List<Map<String,Object>> queryAll(String keywords,int page,int limit,int ageSort,String ageRange,Map<String,String> filter){
        HttpSolrClient httpSolrClient = HttpSolrClientUtils.getHttpSolrClient();
        //条件构造
        SolrQuery solrQuery=new SolrQuery("keywords:"+keywords);

        //分页处理
        solrQuery.setStart((page-1)*limit);
        solrQuery.setRows(limit);

        //排序
        switch (ageSort){
            case 0:
                solrQuery.addSort("age",SolrQuery.ORDER.desc);
                break;
            case 1:
                solrQuery.addSort("age",SolrQuery.ORDER.asc);
                break;
        }
        //范围和过滤条件的处理
        List<String> fqList=new ArrayList<>();
        if(!StringUtils.isEmpty(ageRange)){
            if(!ageRange.contains("-")){
                throw new RuntimeException("年龄范围参数不合法");
            }
            String[] split = ageRange.split("-");
            fqList.add("age:["+split[0]+" TO "+split[1]+"]");
        }
        if(filter!=null&&!filter.isEmpty()){
            filter.forEach((k,v)->{
                fqList.add(k+":"+v);
            });
        }

        if(!fqList.isEmpty()){
            solrQuery.setFilterQueries(fqList.toArray(new String[]{}));
        }

        //处理高亮
        //设置要进行高亮的属性
        solrQuery.addHighlightField("name");
        solrQuery.addHighlightField("remark");
        //设置高亮的前后缀
        solrQuery.setHighlightSimplePre("<font color=red>");
        solrQuery.setHighlightSimplePost("</font>");

        try
        {
            List<Map<String,Object>> listMaps=new ArrayList<>();
            QueryResponse query = httpSolrClient.query(solrQuery);
            SolrDocumentList results = query.getResults();
            Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();
            System.out.println("总条数:"+results.getNumFound());

            for (SolrDocument result : results) {
                Map<String,Object> map=new HashMap<>();
                map.put("id",result.getFieldValue("id"));
                map.put("name",result.getFieldValue("name"));
                map.put("age",result.getFieldValue("age"));
                map.put("sex",result.getFieldValue("sex"));
                map.put("salary",result.getFieldValue("salary"));
                map.put("remark",result.getFieldValue("remark"));

                Map<String, List<String>> listMap = highlighting.get(map.get("id"));
                if(null!=listMap&&!listMap.isEmpty()){
                    String name = listMap.get("name").get(0);
                    String remark = listMap.get("remark").get(0);
                    map.put("name",name);
                    map.put("remark",remark);

                }
                listMaps.add(map);
            }

            return listMaps;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值