• Solr学习笔记(3) —— SolrJ管理索引库&集群


    一、什么是SolrJ

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

      

    二、SolrJ的基本操作

    2.1 添加文档

    • 实现步骤:

      第一步:创建一个java工程

      第二步:导入相关jar包

         

      第三步:和Solr服务器建立连接。HttpSolrServer对象建立连接

      第四步:创建一个SolrInputDocument对象,然后添加域

      第五步:将SolrInputDocument添加到索引库

      第六步:提交

    • 代码实现
      //向索引库中添加索引
          @Test
          public void addDocument() throws Exception {
              //和solr服务器创建连接
              //参数:solr服务器的地址
              SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
              //创建一个文档对象
              SolrInputDocument document = new SolrInputDocument();
              //向文档中添加域
              //第一个参数:域的名称,域的名称必须是在schema.xml中定义的
              //第二个参数:域的值
              document.addField("id", "c0001");
              document.addField("title_ik", "使用solrJ添加的文档");
              document.addField("content_ik", "文档的内容");
              document.addField("product_name", "商品名称");
              //把document对象添加到索引库中
              solrServer.add(document);
              //提交修改
              solrServer.commit();
          } 

    2.2 删除文档

    • 根据id删除

      //删除文档,根据id删除
          @Test
          public void deleteDocumentByid() throws Exception {
              //创建连接
              SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
              //根据id删除文档
              solrServer.deleteById("c0001");
              //提交修改
              solrServer.commit();
          } 
    • 根据查询删除

      //根据查询条件删除文档
          @Test
          public void deleteDocumentByQuery() throws Exception {
              //创建连接
              SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
              //根据查询条件删除文档
              solrServer.deleteByQuery("*:*");
              //提交修改
              solrServer.commit();
          }

    2.3 修改文档

      在solrJ中修改没有对应的update方法,只有add方法,只需要添加一条新的文档,和被修改的文档id一致就,可以修改了。本质上就是先删除后添加

    2.4 查询文档

    • 简单查询
      //查询索引
          @Test
          public void queryIndex() throws Exception {
              //创建连接
              SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
              //创建一个query对象
              SolrQuery query = new SolrQuery();
              //设置查询条件
              query.setQuery("*:*");
              //执行查询
              QueryResponse queryResponse = solrServer.query(query);
              //取查询结果
              SolrDocumentList solrDocumentList = queryResponse.getResults();
              //共查询到商品数量
              System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());
              //遍历查询的结果
              for (SolrDocument solrDocument : solrDocumentList) {
                  System.out.println(solrDocument.get("id"));
                  System.out.println(solrDocument.get("product_name"));
                  System.out.println(solrDocument.get("product_price"));
                  System.out.println(solrDocument.get("product_catalog_name"));
                  System.out.println(solrDocument.get("product_picture"));
              }
          }
    • 复杂查询(其中包含查询、过滤、分页、排序、高亮显示等处理)
      //复杂查询索引
          @Test
          public void queryIndex2() throws Exception {
              //创建连接
              SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
              //创建一个query对象
              SolrQuery query = new SolrQuery();
              //设置查询条件
              query.setQuery("钻石");
              //过滤条件
              query.setFilterQueries("product_catalog_name:幽默杂货");
              //排序条件
              query.setSort("product_price", ORDER.asc);
              //分页处理
              query.setStart(0);
              query.setRows(10);
              //结果中域的列表
              query.setFields("id","product_name","product_price","product_catalog_name","product_picture");
              //设置默认搜索域
              query.set("df", "product_keywords");
              //高亮显示
              query.setHighlight(true);
              //高亮显示的域
              query.addHighlightField("product_name");
              //高亮显示的前缀
              query.setHighlightSimplePre("<em>");
              //高亮显示的后缀
              query.setHighlightSimplePost("</em>");
              //执行查询
              QueryResponse queryResponse = solrServer.query(query);
              //取查询结果
              SolrDocumentList solrDocumentList = queryResponse.getResults();
              //共查询到商品数量
              System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());
              //遍历查询的结果
              for (SolrDocument solrDocument : solrDocumentList) {
                  System.out.println(solrDocument.get("id"));
                  //取高亮显示
                  String productName = "";
                  Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
                  List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
                  //判断是否有高亮内容
                  if (null != list) {
                      productName = list.get(0);
                  } else {
                      productName = (String) solrDocument.get("product_name");
                  }
                  
                  System.out.println(productName);
                  System.out.println(solrDocument.get("product_price"));
                  System.out.println(solrDocument.get("product_catalog_name"));
                  System.out.println(solrDocument.get("product_picture"));
                  
              }
          } 

     三、使用SolrJ管理集群

    3.1 添加文档

      使用步骤:

      第一步:把solrJ相关的jar包添加到工程中。

      第二步:创建一个SolrServer对象,需要使用CloudSolrServer子类。构造方法的参数是zookeeper的地址列表。  

      第三步:需要设置DefaultCollection属性

      第四步:创建一SolrInputDocument对象。

      第五步:向文档对象中添加域

      第六步:把文档对象写入索引库。

      第七步:提交。

      @Test
        public void testSolrCloudAddDocument() throws Exception {
            // 第一步:把solrJ相关的jar包添加到工程中。
            // 第二步:创建一个SolrServer对象,需要使用CloudSolrServer子类。构造方法的参数是zookeeper的地址列表。
            // 参数是zookeeper的地址列表,使用逗号分隔
            CloudSolrServer solrServer = new CloudSolrServer("192.168.25.135:2181,192.168.25.135:2182,192.168.25.135:2183");
            // 第三步:需要设置DefaultCollection属性。
            solrServer.setDefaultCollection("collection2");
            // 第四步:创建一SolrInputDocument对象。
            SolrInputDocument document = new SolrInputDocument();
            // 第五步:向文档对象中添加域
            document.addField("id", "test01");
            document.addField("item_title", "测试商品");
            document.addField("item_price", "100");
            // 第六步:把文档对象写入索引库。
            solrServer.add(document);
            // 第七步:提交。
            solrServer.commit();
        }

    3.2 查询文档

      创建一个CloudSolrServer对象,其他处理和单机版一致。

    @Test
          public void testSolrCloudQueryDocument() throws Exception {
            CloudSolrServer cloudSolrServer = new CloudSolrServer("192.168.25.135:2181,192.168.25.135:2182,192.168.25.135:2183");
            cloudSolrServer.setDefaultCollection("collection2");
            // 创建一个query对象
            SolrQuery query = new SolrQuery();
            // 设置查询条件
            query.setQuery("*:*");
            // 执行查询
            QueryResponse queryResponse = cloudSolrServer.query(query);
            // 取查询结果
            SolrDocumentList solrDocumentList = queryResponse.getResults();
            // 共查询到商品数量
            System.out.println("共查询到商品数量:"+solrDocumentList.getNumFound());
            // 遍历查询结果
            for (SolrDocument solrDocument : solrDocumentList) {
                System.out.println(solrDocument.get("id"));
                System.out.println(solrDocument.get("item_title"));
                System.out.println(solrDocument.get("item_price"));
            }
        }

     四、把搜索功能切换到集群版

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans4.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context4.2.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx4.2.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util4.2.xsd">
    
        <!-- 单机版solr服务配置 -->
        <!-- <bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
            <constructor-arg name="baseURL" value="http://192.168.25.135:8080/solr"></constructor-arg>
        </bean> -->
        <!-- 集群版solr服务 -->
        <bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
            <constructor-arg name="zkHost" value="192.168.25.135:2181,192.168.25.135:2182,192.168.25.135:2183"></constructor-arg>    
            <property name="defaultCollection" value="collection2"></property>
        </bean>
    </beans>
  • 相关阅读:
    在Fedora 20下使用TexturePacker
    实战微信JS SDK开发:贺卡制作与播放(1)
    Fedora 20下安装Google PinYin输入法
    Netty5 时间服务器 有粘包问题
    Netty5入门学习笔记003-TCP粘包/拆包问题的解决之道(下)
    Netty5入门学习笔记002-TCP粘包/拆包问题的解决之道(上)
    11g Rac 添加日志组
    工作中的生长与完善——Leo鉴书86
    搜集直方图repeat和skewonly
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxError Exception
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10107022.html
Copyright © 2020-2023  润新知