Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 424|回复: 0

[默认分类] 通过solrj对solr进行开发

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-30 10:10:11 | 显示全部楼层 |阅读模式

    应用场景

      当安装部署完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中添加域,标识域的属性,是否存储,是否索引等。



      添加域:
      


      删除域:
      


      更新域:
      


      示例:
      
    1. [code]     /** * 添加域或删除域 *  @throws Exception * */
    2.     @Test
    3.     public void addFields() throws Exception{
    4.         //创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
    5.         HttpSolrClient server = new  HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
    6.         //相当于在managed-schema文件中加入一个field
    7.         Map<String, Object> fields = new LinkedHashMap<>();
    8.         fields.put("name","product_name");    //域名
    9.         fields.put("type","text_ik");         //域的类型,可以是string,int,如果需要分词设为text_ik
    10.         fields.put("indexed",true);           //是否索引,默认为true
    11.         fields.put("stored",true);            //是否存储,默认为true
    12.         fields.put("multiValued",false);      //是否多值,默认为false
    13.         fields.put("required",false);         //是否必须,默认false,schema文件中有一个id已默认必须
    14.         //添加域
    15.         SchemaRequest.AddField addFieldtoSchema = new SchemaRequest.AddField(fields);
    16.         server.request(addFieldtoSchema);
    17.         //删除域
    18. // SchemaRequest.DeleteField delFieldtoSchema = new SchemaRequest.DeleteField("product_name");
    19. // server.request(delFieldtoSchema);
    20.         //更新域
    21. // SchemaRequest.ReplaceField repFieldtoSchema = new SchemaRequest.ReplaceField(fields);
    22. // server.request(repFieldtoSchema);
    23.      }
    复制代码
    [/code]
    4 新增索引

      步骤:
      

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


      说明:
      

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



      添加,并提交:
      


      示例:
      
    1. [code]    /** * 添加域值或修改域值 *  @throws Exception * 根据id来添加,如果id存在则看成是修改进行覆盖,如果id不存在则是添加 */
    2.     @Test
    3.     public void addFieldValue() throws Exception{
    4.         //创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
    5.         HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
    6.         //创建SolrInputDocument对象,然后通过它来添加域值。
    7.         SolrInputDocument document = new SolrInputDocument();
    8.         // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的,也就是上一步操作了
    9.         // 第二个参数:域的值
    10.         // 注意:id的域不能少,因为底层schema配置文件决定,id是required的
    11.         document.addField("id", "001");
    12.         document.addField("product_name", "张家港特产沙洲优黄");
    13.         document.addField("product_info", "沙洲优黄是江苏省张家港酿酒有限公司的著名产品。江苏省张家港酿酒有限公司是江苏酿酒行业重点骨干企业,紧靠张家港保税区和对外开放港口张家港,区域经济发达,自然条件优越,投资兴业环境优良。");
    14.         //通过HttpSolrServer对象将SolrInputDocument添加到索引库。
    15.         // 执行添加操作,如果该id存在,则进行修改
    16.         server.add(document);
    17.         //提交
    18.         server.commit();
    19.     }
    复制代码
    [/code]
    5 修改索引

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

    6 删除索引

      步骤:
      

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


      说明:
      

      这一步主要通过solrj对已建的索引进行删除操作。
      主要有以下三种形式:


      根据id来删除索引:
      


      根据查询条件来删除:
      


      全部删除,注意慎用:
      


      示例:
      
    1. [code]    /** * 删除域值 *  @throws Exception * 根据id来进行删除 */
    2.     @Test
    3.     public void delFieldValue() throws Exception{
    4.         //创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
    5.         HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
    6.         // 根据id删除
    7. // server.deleteById("001");
    8.         // 根据查询条件删除
    9.         server.deleteByQuery("product_name:沙洲优黄");
    10.         // 全部删除、慎用!!!!
    11. // server.deleteByQuery("*:*");
    12.         // 提交
    13.         server.commit();
    14.     }
    复制代码
    [/code]
    7 查询索引

      步骤:
      

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


      说明:
      

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



      创建solrQuery对象:
      


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


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


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


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


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


      设置默搜索域df:
      


      设置高亮:
      


      执行搜索获得返回值:
      


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


      结果展示:
      


      示例:
      
    1. [code]    @Test
    2.     public void search() throws Exception {
    3.         // 创建HttpSolrServer,可以访问solr服务
    4.         // 参数就是solr服务的url
    5.         HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
    6.         // 创建solrQuery对象
    7.         SolrQuery query = new SolrQuery();
    8.         // 设置q,查询条件
    9.         //query.setQuery("product_name:张家港");
    10.         query.set("q", "product_name:沙洲优黄");
    11.         // 设置fq,过滤查询条件
    12.         //query.setFilterQueries("product_info:张家港");
    13.         query.set("fq", "product_info:江苏省");
    14.         // 设置sort,排序
    15.         //query.setSort("id", ORDER.desc);
    16.         query.set("sort", "id desc");
    17.         // 设置start、rows,分页信息(写上默认值)
    18.         query.setStart(0);
    19.         query.setRows(10);
    20.         // 设置fl,即要显示的域的列表
    21.         query.set("fl", "id,product_name","product_info");
    22.         // 设置默认搜索域
    23.         query.set("df", "product_info,product_name,id");
    24.         // 设置高亮
    25.         query.setHighlight(true);
    26.         query.addHighlightField("product_info");
    27.         query.addHighlightField("product_name");
    28.         query.setHighlightSimplePre("<font style="color:red">");
    29.         query.setHighlightSimplePost("</font>");
    30.         // 执行搜索,并获得返回值
    31.         QueryResponse response = server.query(query);
    32.         // 根据查询条件匹配出的结果对象
    33.         SolrDocumentList list = response.getResults();
    34.         // 匹配出的结果总数
    35.         long count = list.getNumFound();
    36.         //输出查询结果
    37.         System.out.println("匹配出的结果总数:" + count);
    38.         for (SolrDocument solrDocument : list) {
    39.             System.out.println("商品id:" + solrDocument.get("id"));
    40.             System.out.println("商品名称:" + solrDocument.get("product_name"));
    41.             System.out.println("商品信息:" + solrDocument.get("product_info"));
    42.         }
    43.         System.out.println("----------------------------------------------------");
    44. }
    复制代码
    [/code]
    8 高亮设置

      步骤:
      

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


      说明:
      

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


      获取高亮列表:
      


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


      示例:
      
    1. [code]  @Test
    2.     public void search() throws Exception {
    3.         // 创建HttpSolrServer,可以访问solr服务
    4.         // 参数就是solr服务的url
    5.         HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
    6.         // 创建solrQuery对象
    7.         SolrQuery query = new SolrQuery();
    8.         // 设置q,查询条件
    9.         //query.setQuery("product_name:张家港");
    10.         query.set("q", "product_name:沙洲优黄");
    11.         // 设置fq,过滤查询条件
    12.         //query.setFilterQueries("product_info:张家港");
    13.         query.set("fq", "product_info:江苏省");
    14.         // 设置sort,排序
    15.         //query.setSort("id", ORDER.desc);
    16.         query.set("sort", "id desc");
    17.         // 设置start、rows,分页信息(写上默认值)
    18.         query.setStart(0);
    19.         query.setRows(10);
    20.         // 设置fl,即要显示的域的列表
    21.         query.set("fl", "id,product_name","product_info");
    22.         // 设置默认搜索域
    23.         query.set("df", "product_info,product_name,id");
    24.         // 设置高亮
    25.         query.setHighlight(true);
    26.         query.addHighlightField("product_info");
    27.         query.addHighlightField("product_name");
    28.         query.setHighlightSimplePre("<font style="color:red">");
    29.         query.setHighlightSimplePost("</font>");
    30.         // 执行搜索,并获得返回值
    31.         QueryResponse response = server.query(query);
    32.         // 根据查询条件匹配出的结果对象
    33.         SolrDocumentList list = response.getResults();
    34.         // 匹配出的结果总数
    35.         long count = list.getNumFound();
    36.         //获取高亮列表
    37.         Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
    38.         for (SolrDocument solrDocument : list) {
    39.             System.out.println("商品id:" + solrDocument.get("id"));
    40.             System.out.println("商品名称:" + solrDocument.get("product_name"));
    41.             System.out.println("商品信息:" + solrDocument.get("product_info"));
    42.             //获得本文档的高亮信息
    43.             List<String> list2 = highlighting.get(solrDocument.get("id")).get("product_info");
    44.             if(list2!=null){
    45.                 System.out.println("高亮后的信息:"+list2.get(0));
    46.             }
    47.             //获得本文档的高亮信息
    48.             List<String> list3 = highlighting.get(solrDocument.get("id")).get("product_name");
    49.             if(list2!=null){
    50.                 System.out.println("高亮后的信息:"+list3.get(0));
    51.             }
    52.         }
    53.     }
    复制代码
    [/code]

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-5-9 00:02 , Processed in 0.308618 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表