04_solr7.3之solrJ7.3的使用

04_solr7.3之solrJ7.3的使用

SolrJ is an API that makes it easy for Java applications to talk to Solr. SolrJ hides a lot of the details of connecting to Solr and allows your application to interact with Solr with simple high-level methods.

The center of SolrJ is the org.apache.solr.client.solrj package, which contains just five main classes. Begin by creating a SolrClient, which represents the Solr instance you want to use. Then send SolrRequests or SolrQuerys and get back SolrResponses.

SolrClient is abstract, so to connect to a remote Solr instance, you’ll actually create an instance of either HttpSolrClient, or CloudSolrClient. Both communicate with Solr via HTTP, the difference is that HttpSolrClient is configured using an explicit Solr URL, while CloudSolrClient is configured using the zkHost String for a SolrCloud cluster.

Single node Solr client

String urlString = "http://localhost:8983/solr/techproducts";
SolrClient solr = new HttpSolrClient.Builder(urlString).build();

SolrCloud client

// Using a ZK Host String
String zkHostString = "zkServerA:2181,zkServerB:2181,zkServerC:2181/solr";
SolrClient solr = new CloudSolrClient.Builder().withZkHost(zkHostString).build();

// Using already running Solr nodes
SolrClient solr = new CloudSolrClient.Builder().withSolrUrl("http://localhost:8983/solr").build();

以上内容来自solr官网。

一、构建和运行SolrJ应用程序

    对于用Maven构建的项目, 
pom.xml配置:

<dependency>
  <groupId>org.apache.solr</groupId>
  <artifactId>solr-solrj</artifactId>
  <version>7.3.1</version>
</dependency>

如果不用maven构建项目,只需要将
solr-solrj-7.3.1.jar 和 dist/solrj-lib目录中的依赖包加入到项目中即可

04_solr7.3之solrJ7.3的使用

二、solr7 API

 在solr5系之后跟solr4最大的区别是被发布成了一个独立的应用。而不再需要tomcat等容器。在其内部集成了jetty服务器,他可以通过bin目录的脚本直接运行启动。solr5有两种运行模式,独立模式和云模式,独立模式是以core来管理,云模式是以collection来管理。

  SolrClient是一个抽象类,下边有很多被实现的子类,

        HttpSolrClient是通用客户端。 可以与一个Solr节点直接通信。),  

        LBHttpSolrClient,CloudSolrClient,ConcurrentUpdateSolrClient

 HttpSolrClient的创建需要用户指定一个或多个Solr基础URL,然后客户端使用Solr发送HTTP请求。

  1. 一个URL的路径指向一个特定的core/collection(例如, http://host:8983/solr/core1 )

  2. 一个URL指向根Solr路径(例如, http://host:8983/solr )。 当没有指定core/collection的基URL,可以请求任何core/collection,但受影响的core/collection必须指定collection的所有请求。

一般来说,如果你的 SolrClient 只会被用在一个core/collection,包括实体的路径是最方便的。

三、创建工程

创建个maven工程(普通的java工程都可以不过需要自己导包),添加依赖如下:



创建Test类,测试SolrJ相关API

1. 添加\修改索引

/*
    根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。
     */
    @Test
    public void addDocument() throws IOException, SolrServerException {
        /*
        步骤
        1、创建	HttpSolrClient对象,通过它和Solr服务器建立连接。
        2、	创建SolrInputDocument对象,然后通过它来添加域。
        3、	通过HttpSolrClient对象将SolrInputDocument添加到索引库。
        4、	提交。
         */
        final String solrUrl = "http://localhost:8983/solr/test_Core";
        //创建solrClient同时指定超时时间,不指定走默认配置
        HttpSolrClient solrServer = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        // 2、 创建SolrInputDocument对象,然后通过它来添加域。
        SolrInputDocument document = new SolrInputDocument();
        // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
        // 第二个参数:域的值
        // 注意:id的域不能少
        document.addField("id", "c0001");
        document.addField("title_ik", "使用solrJ添加的文档");
        document.addField("content_ik", "文档的内容");
        document.addField("product_name", "商品名称");
        // 3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。
        solrServer.add(document);
        // 4、 提交。
        solrServer.commit();
    }

不同solr版本solrj 的创建方式有所不同

//solr4创建方式
//SolrServer solrServer = new HttpSolrServer("http://127.0.0.1:8983/solr");  
//solr5创建方式,在url中指定core名称:core1
//HttpSolrClient solrServer=new HttpSolrClient("http://127.0.0.1:8983/solr/core1");
//solr7创建方式,在url中指定core名称:core1
HttpSolrClient solrServer= new HttpSolrClient.Builder("http://127.0.0.1:8983/solr/core1").build();

查询测试

04_solr7.3之solrJ7.3的使用

删除索引( 根据ID删除)

  //根据ID删除索引
    @ Test
    public void deleteDocument() throws IOException, SolrServerException {
        final String solrUrl = "http://localhost:8983/solr/test_Core";
        //创建solrClient同时指定超时时间,不指定走默认配置
        HttpSolrClient solrServer = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        //根据ID删除
        solrServer.deleteById("c0001");
        //提交
        solrServer.commit();
    }
 查询测试

04_solr7.3之solrJ7.3的使用

根据条件删除

//根据条件删除
    @Test
    public void deleteDocumentByQuery() throws Exception {

        final String solrUrl = "http://localhost:8983/solr/test_Core";
        //创建solrClient同时指定超时时间,不指定走默认配置
        // 1、 创建HttpSolrClient对象,通过它和Solr服务器建立连接。
        // 参数:solrUrl服务器的访问地址
        HttpSolrClient solrServer = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        // 根据ID删除
        solrServer.deleteByQuery("id:c0001");
        // 全部删除
        // server.deleteByQuery("*:*");
        // 提交
        solrServer.commit();
    }

 简单查询

/**
     * 简单查询
     * @throws Exception
     */
    @Test
    public void queryIndex() throws Exception {
        final String solrUrl = "http://localhost:8983/solr/test_Core";
        //创建solrClient同时指定超时时间,不指定走默认配置
        // 1、 创建HttpSolrClient对象,通过它和Solr服务器建立连接。
        // 参数:solrUrl服务器的访问地址
        HttpSolrClient solrServer = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();

        // 创建SolrQuery对象
        SolrQuery query = new SolrQuery();
        // 设置查询条件,名称“q”是固定的且必须 的
        query.set("q", "id:2");

        // 调用server的查询方法,查询索引库
        QueryResponse response = solrServer.query(query);

        // 查询结果
        SolrDocumentList results = response.getResults();

        // 查询结果总数
        long cnt = results.getNumFound();
        System.out.println("查询结果总数:" + cnt);

        for (SolrDocument solrDocument : results) {
            System.out.println(solrDocument.get("id"));
            System.out.println(solrDocument.get("product_name"));
            System.out.println(solrDocument.get("product_sale_price"));
            System.out.println(solrDocument.get("product_sort_name"));
            System.out.println(solrDocument.get("product_pic"));

        }
    }

复杂查询

复杂查询中包括高亮的处理

/**
     * 复杂查询  包括高亮显示
     * @throws Exception
     */
    @Test
    public void queryIndex2() throws Exception {
        final String solrUrl = "http://localhost:8983/solr/test_Core";
        //创建solrClient同时指定超时时间,不指定走默认配置
        // 1、 创建HttpSolrClient对象,通过它和Solr服务器建立连接。
        // 参数:solrUrl服务器的访问地址
        HttpSolrClient solrServer = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        // 创建SolrQuery对象
        SolrQuery query = new SolrQuery();

        // 设置查询条件
        query.setQuery("钻石");
        // 设置过滤条件
        query.setFilterQueries("product_sort_name:幽默杂货");
        // 设置排序
        query.setSort("product_sale_price",SolrQuery.ORDER.desc);
        // 设置分页信息
        query.setStart(0);
        query.setRows(10);

        // 设置显得的域的列表
        query.setFields("id", "product_name", "product_sale_price",
                "product_sort_name", "product_pic");

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

        // 设置高亮
        query.setHighlight(true);
        query.addHighlightField("product_name");
        query.setHighlightSimplePre("<em>");
        query.setHighlightSimplePost("</em>");

        // 调用server的查询方法,查询索引库
        QueryResponse response = solrServer.query(query);

        // 查询结果
        SolrDocumentList results = response.getResults();

        // 查询结果总数
        long cnt = results.getNumFound();
        System.out.println("查询结果总数:" + cnt);

        for (SolrDocument solrDocument : results) {
            System.out.println(solrDocument.get("id"));

            String productName = (String) solrDocument.get("product_name");

            //获取高亮列表
            Map<String, Map<String, List<String>>> highlighting = response
                    .getHighlighting();
            //获得本文档的高亮信息
            List<String> list = highlighting.get(solrDocument.get("id")).get(
                    "product_name");
            //如果有高亮,则把商品名称赋值为有高亮的那个名称
            if (list != null) {
                productName = list.get(0);
            }

            System.out.println(productName);
            System.out.println(solrDocument.get("product_sale_price"));
            System.out.println(solrDocument.get("product_sort_name"));
            System.out.println(solrDocument.get("product_pic"));

        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111280.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java flowable工作流_flowable工作流免费视频

    java flowable工作流_flowable工作流免费视频1.2基本操作1.2.1编码准备这里一官网请假流程案例为例resources目录下新建一个holiday-request.bpmn20.xml文件1.2.2初始化DB运行脚本后会初始化相关表,后面一点点介绍查看act_re_deployment表查看act_ge_bytearray,记录xml文本字节数组,通过deployment_id关联,查看相关的api有列表查询、分页查询等1.2.4发起流程修改holiday-request.bpmn2

    2022年10月27日
  • gitee pycharm_怎么把git上放到pycharm

    gitee pycharm_怎么把git上放到pycharm好久没有使用git,都忘记git的操作流程了,只能强制回忆一下:今天接到领导通知,要把我这边写的代码提交到远程仓库,然后就想,他那边仓库里的代码源码都是我提供的,我本地在pycharm中也是添加了git管理的,所以就想直接我这边的仓库代码直接push到远程仓库上去,先pull,然后在push就行了,结果搞了半天,一直提示我这边的版本在远程仓库之前的版本:hint:Updateswererejectedbecausethetipofyourcurrentbranchisbehi

  • js 数组倒序排列

    <!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><title>js倒序排列</title></head><body><script>vararray=[‘我’,’喜’,’欢’,…

  • Java 集合类图[通俗易懂]

    Java 集合类图[通俗易懂]有序否允许元素重复否Collection否是List是是SetAbstractSet否否HashSetTreeSet是(用二叉树排序)MapAbstractMap否使用key-value来映射和存储数据,Key必须惟一,value可以重复HashMapTreeMap是(用二叉树排序)

  • 御用导航提示页面_终实现微信位置发送到汽车导航 越用越好用

    御用导航提示页面_终实现微信位置发送到汽车导航 越用越好用我们使用微信,其中一个非常好用的功能就是发送位置。在朋友聚会或者去朋友家做客时,只需朋友发送一个微信用微信位置,我们就非常清楚的得知目的地,直接把这个位置推送给手机里的导航软件,并发起导航。然而对于习惯使用中控屏导航的车友来说,这个过程脱节了。微信位置只能使用手机导航,不能直接推送到车载导航。手动输入,无疑更加烦躁,担心输错,还要确认好几次。在最新的高德地图车机版中,我们留意到更新中“手…

  • Spring整合Hibernate的步骤

    Spring整合Hibernate的步骤

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号