通过solrj对solr进行开发-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

通过solrj对solr进行开发

简介: 应用场景 当安装部署完solr之后,我们可以通过solrj来连接solr,进行新建,删除索引等等操作,达到全文检索的效果。

应用场景

当安装部署完solr之后,我们可以通过solrj来连接solr,进行新建,删除索引等等操作,达到全文检索的效果。

操作步骤

1. Solrj的使用

1.1什么是solrj

solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:

这里写图片描述

Solrj和图形界面操作的区别就类似于数据库中你使用jdbc和mysql客户端的区别一样。

1.2 添加solrj jar包

Solrj的包

这里写图片描述

Solr服务的依赖包

这里写图片描述

solrj5.4.0的jar包下载地址

2 初始化

  • 步骤:

创建HttpSolrClient对象(solrj4的HttpSolrServer被废弃),通过它和Solr服务器建立连接;

  • 说明:

这一步是第一步,通过URL来调用搭建的solr服务,让solr服务给我们提供增删改查索引服务:

这里写图片描述

3 添加域

  • 步骤:

1、调用SchemaRequest.AddField,添加域的一个Map;
2、通过HttpSolrClient对象的request方法进行添加域属性;

  • 说明:

这一步主要是向schema.xml中添加域,标识域的属性,是否存储,是否索引等。

这里写图片描述

  • 添加域:

这里写图片描述

  • 删除域:

这里写图片描述

  • 更新域:

这里写图片描述

  • 示例:
     /**
     *  添加域或删除域
     *  @throws Exception 
     *   
     */ 
    @Test
    public void addFields() throws Exception{
        //创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
        HttpSolrClient server = new  HttpSolrClient("http://192.168.199.23:8080/solr/collection1");

        //相当于在managed-schema文件中加入一个field
        Map<String, Object> fields = new LinkedHashMap<>();
        fields.put("name","product_name");    //域名
        fields.put("type","text_ik");         //域的类型,可以是string,int,如果需要分词设为text_ik
        fields.put("indexed",true);           //是否索引,默认为true
        fields.put("stored",true);            //是否存储,默认为true
        fields.put("multiValued",false);      //是否多值,默认为false
        fields.put("required",false);         //是否必须,默认false,schema文件中有一个id已默认必须

        //添加域
        SchemaRequest.AddField addFieldtoSchema = new SchemaRequest.AddField(fields);
        server.request(addFieldtoSchema);
        //删除域
//        SchemaRequest.DeleteField delFieldtoSchema = new SchemaRequest.DeleteField("product_name");
//        server.request(delFieldtoSchema);
        //更新域
//        SchemaRequest.ReplaceField repFieldtoSchema = new SchemaRequest.ReplaceField(fields);
//        server.request(repFieldtoSchema);
     }

4 新增索引

  • 步骤:

1、创建SolrInputDocument对象,然后通过它来添加域值;
2、调用SolrInputDocument的对象的addField方法添加域值;
3、通过HttpSolrClient对象将SolrInputDocument添加到索引库;(如果id存在,则进行修改操作);
4、调用HttpSolrClient对象的commit方法进行提交。

  • 说明:

这一步主要是给值添加索引。其中域id是必须需要添加的,这是由底层配置文件决定的,id中有一个属性叫required,是唯一一个,如果不添加id,会报错。

这里写图片描述

  • 添加,并提交:

这里写图片描述

  • 示例:
    /**
     *  添加域值或修改域值
     *  @throws Exception 
     *  根据id来添加,如果id存在则看成是修改进行覆盖,如果id不存在则是添加 
     */ 
    @Test
    public void addFieldValue() throws Exception{
        //创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
        HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");

        //创建SolrInputDocument对象,然后通过它来添加域值。
        SolrInputDocument document = new SolrInputDocument();

        // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的,也就是上一步操作了
        // 第二个参数:域的值
        // 注意:id的域不能少,因为底层schema配置文件决定,id是required的
        document.addField("id", "001");
        document.addField("product_name", "张家港特产沙洲优黄");
        document.addField("product_info", "沙洲优黄是江苏省张家港酿酒有限公司的著名产品。江苏省张家港酿酒有限公司是江苏酿酒行业重点骨干企业,紧靠张家港保税区和对外开放港口张家港,区域经济发达,自然条件优越,投资兴业环境优良。");

        //通过HttpSolrServer对象将SolrInputDocument添加到索引库。
        // 执行添加操作,如果该id存在,则进行修改
        server.add(document);
        //提交
        server.commit();
    }

5 修改索引

注:修改索引其实是和新增一样的,新增索引的时候域id是必须的,id也是唯一的:
如果新增的时候id不存在,则进行新增或添加操作;
如果新增的时候id存在,则进行修改操作,覆盖原来已添加的;
代码与新增过程保持不变。

6 删除索引

  • 步骤:

1、通过调用HttpSolrClient对象的deleteByQuery方法进行删除操作;
2、调用HttpSolrClient对象的commit方法进行提交。

  • 说明:

这一步主要通过solrj对已建的索引进行删除操作。

主要有以下三种形式:

  • 根据id来删除索引:

这里写图片描述

  • 根据查询条件来删除:

这里写图片描述

  • 全部删除,注意慎用:

这里写图片描述

  • 示例:
    /**
     *  删除域值
     *  @throws Exception 
     *  根据id来进行删除 
     */ 
    @Test
    public void delFieldValue() throws Exception{
        //创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
        HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");

        // 根据id删除
//        server.deleteById("001");
        // 根据查询条件删除
        server.deleteByQuery("product_name:沙洲优黄");
        // 全部删除、慎用!!!!
//        server.deleteByQuery("*:*");

        // 提交
        server.commit();
    }

7 查询索引

  • 步骤:

1、创建solrQuery对象,来对对象设置查询条件;
2、创建QueryResponse对象,通过HttpSolrClient对象调用query方法,来获得执行搜索获得的返回值;
3、创建SolrDocumentList方法,通过QueryResponse对象调用getResults方法,来根据查询条件匹配出结果对象
4、最后进行遍历输出

  • 说明:

这一步主要对前面新建了索引的数据进行查询。
查询参数:

这里写图片描述

  • 创建solrQuery对象:

这里写图片描述

  • 设置查询条件(q),两种写法:

这里写图片描述

  • 设置过滤查询条件(fq),两种写法:

这里写图片描述

  • 设置排序(sort),两种写法:

这里写图片描述

  • 设置分页信息(start,rows):

这里写图片描述

  • 设置fl指定返回结果字段:

这里写图片描述

  • 设置默搜索域df:

这里写图片描述

  • 设置高亮:

这里写图片描述

  • 执行搜索获得返回值:

这里写图片描述

  • 根据查询条件匹配出结果对象:

这里写图片描述

  • 结果展示:

这里写图片描述

  • 示例:
    @Test
    public void search() throws Exception {

        // 创建HttpSolrServer,可以访问solr服务
        // 参数就是solr服务的url
        HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");

        // 创建solrQuery对象
        SolrQuery query = new SolrQuery();

        // 设置q,查询条件
        //query.setQuery("product_name:张家港");
        query.set("q", "product_name:沙洲优黄");

        // 设置fq,过滤查询条件
        //query.setFilterQueries("product_info:张家港");
        query.set("fq", "product_info:江苏省");

        // 设置sort,排序
        //query.setSort("id", ORDER.desc);
        query.set("sort", "id desc");

        // 设置start、rows,分页信息(写上默认值)
        query.setStart(0);
        query.setRows(10);

        // 设置fl,即要显示的域的列表
        query.set("fl", "id,product_name","product_info");

        // 设置默认搜索域
        query.set("df", "product_info,product_name,id");

        // 设置高亮
        query.setHighlight(true);
        query.addHighlightField("product_info");
        query.addHighlightField("product_name");
        query.setHighlightSimplePre("<font style=\"color:red\">");
        query.setHighlightSimplePost("</font>");

        // 执行搜索,并获得返回值
        QueryResponse response = server.query(query);

        // 根据查询条件匹配出的结果对象
        SolrDocumentList list = response.getResults();

        // 匹配出的结果总数
        long count = list.getNumFound();

        //输出查询结果
        System.out.println("匹配出的结果总数:" + count);
        for (SolrDocument solrDocument : list) {
            System.out.println("商品id:" + solrDocument.get("id"));
            System.out.println("商品名称:" + solrDocument.get("product_name"));
            System.out.println("商品信息:" + solrDocument.get("product_info"));
        }

        System.out.println("----------------------------------------------------");
}

8 高亮设置

  • 步骤:

1、创建solrQuery对象,来对对象设置查询条件;
2、创建QueryResponse对象,通过HttpSolrClient对象调用query方法,来获得执行搜索获得的返回值;
3、创建SolrDocumentList对象,通过QueryResponse对象调用getResults方法,来根据查询条件匹配出结果对象;
4、调用QueryResponse对象的getHighlighting方法获取高亮列表; 5、遍历结果列表,获得本文档的高亮信息;
6、循环遍历高亮后的信息,进行输出。

  • 说明:

这一步主要给查询条件给出的字段,给予高亮显示。

  • 获取高亮列表:

这里写图片描述

  • 获得文档高亮信息,以及高亮结果展示:

这里写图片描述

  • 示例:
  @Test
    public void search() throws Exception {

        // 创建HttpSolrServer,可以访问solr服务
        // 参数就是solr服务的url
        HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");

        // 创建solrQuery对象
        SolrQuery query = new SolrQuery();

        // 设置q,查询条件
        //query.setQuery("product_name:张家港");
        query.set("q", "product_name:沙洲优黄");

        // 设置fq,过滤查询条件
        //query.setFilterQueries("product_info:张家港");
        query.set("fq", "product_info:江苏省");

        // 设置sort,排序
        //query.setSort("id", ORDER.desc);
        query.set("sort", "id desc");

        // 设置start、rows,分页信息(写上默认值)
        query.setStart(0);
        query.setRows(10);

        // 设置fl,即要显示的域的列表
        query.set("fl", "id,product_name","product_info");

        // 设置默认搜索域
        query.set("df", "product_info,product_name,id");

        // 设置高亮
        query.setHighlight(true);
        query.addHighlightField("product_info");
        query.addHighlightField("product_name");
        query.setHighlightSimplePre("<font style=\"color:red\">");
        query.setHighlightSimplePost("</font>");

        // 执行搜索,并获得返回值
        QueryResponse response = server.query(query);

        // 根据查询条件匹配出的结果对象
        SolrDocumentList list = response.getResults();

        // 匹配出的结果总数
        long count = list.getNumFound();

        //获取高亮列表
        Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

        for (SolrDocument solrDocument : list) {
            System.out.println("商品id:" + solrDocument.get("id"));
            System.out.println("商品名称:" + solrDocument.get("product_name"));
            System.out.println("商品信息:" + solrDocument.get("product_info"));

            //获得本文档的高亮信息
            List<String> list2 = highlighting.get(solrDocument.get("id")).get("product_info");
            if(list2!=null){
                System.out.println("高亮后的信息:"+list2.get(0));
            }
            //获得本文档的高亮信息
            List<String> list3 = highlighting.get(solrDocument.get("id")).get("product_name");
            if(list2!=null){
                System.out.println("高亮后的信息:"+list3.get(0));
            }
        }
    }

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章
最新文章
相关文章