亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Solr7.4.0的API(Solrj)操作

標簽:
Java

一.SolrJ的概念

solr单机版服务搭建:https://www.cnblogs.com/frankdeng/p/9615253.html

solr集群版服务搭建:https://www.cnblogs.com/frankdeng/p/9597680.html

        SolrJ是一个API,它使用Java(或任何基于JVM的语言)编写的应用程序可以轻松地与Solr交谈。SolrJ隐藏了许多连接到Solr的细节,并允许您的应用程序通过简单的高级方法与Solr交互。SolrJ支持大多数Solr API,并且具有高度可配置性。

官方API参考文档: http://lucene.apache.org/solr/guide/7_4/using-solrj.html#using-solrj

这里使用Maven构建项目,请将以下内容放入pom.xml

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

https://img1.sycdn.imooc.com//5b972b290001b0e813580496.jpg

为了方便测试,导入单元测试依赖和日志依赖

复制代码

<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-nop</artifactId>
    <version>1.7.25</version>
</dependency>

复制代码

二.SolrJ的单机连接

SolrClient是一个抽象类,下边有很多被实现的子类,HttpSolrClient - 面向以查询为中心的工作负载,但也是一个很好的通用客户端。直接与单个Solr节点通信。

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

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

例如:

复制代码

package com.xyg.solr;

import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.junit.Test;/**
 * Author: Mr.Deng
 * Date: 2018/9/10
 * Desc: 测试连接客户端 */public class testConnectionClient {

    @Test    public void testConnectionClient(){        //设置solr客户端url地址
        String solrUrl = "http://node21:8080/solr/new_core";        //创建solrClient同时指定超时时间,不指定走默认配置
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        System.out.println(solrClient);
    }
}

复制代码

https://img1.sycdn.imooc.com//5b972b310001562b07690217.jpg

三.SolrJ的集群连接

 CloudSolrClient - 面向与SolrCloud部署的通信。使用已记录的ZooKeeper状态来发现并将请求路由到健康的Solr节点。

复制代码

package com.xyg.solrCloud;

import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.junit.Test;/**
 * Author: Mr.Deng
 * Date: 2018/9/10
 * Desc: 测试连接客户端 */public class ConnectionCloudSolrClient {

    @Test    public void connectionCloudSolrClient(){        // 第一种方式:使用运行中的某一台solr节点        //final String solrUrl = "http://192.168.100.21:8983/solr";        //CloudSolrClient solrClient = new CloudSolrClient.Builder().withSolrUrl(solrUrl).build();        // 第二种方式:使用zookeeper节点连接(推荐)
        final String zkHost = "node21:2181,node22:2181,node23:2181/solr";
        CloudSolrClient solrClient = new CloudSolrClient.Builder().withZkHost(zkHost).build();
        System.out.println(solrClient);
    }
}

复制代码

https://img1.sycdn.imooc.com//5b972b3a0001836812470513.jpg

四.SolrJ的增删改查

这里测试单机版APi操作

1.创建索引

1)指定id单条创建索引 

复制代码

@Testpublic void addIndexById() throws IOException, SolrServerException {
    String solrUrl = "http://node21:8080/solr/new_core";
    HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();    //创建索引文档对象
    SolrInputDocument doc = new SolrInputDocument();    // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的    // 第二个参数:域的值,注意:id的域不能少
    doc.addField("id","1");
    doc.addField("name","红豆");
    doc.addField("price","1.2");    //3.将文档写入索引库中    solrClient.add(doc);
    solrClient.commit();
}

复制代码

2)批量创建索引 

复制代码

@Testpublic void addIndexByListId() throws Exception {
    String solrUrl = "http://node21:8080/solr/new_core";
    HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();    //创建索引文档对象
    SolrInputDocument doc1 = new SolrInputDocument();
    doc1.addField( "id", "2");
    doc1.addField( "name", "绿豆");
    doc1.addField( "price", 1.8 );
    SolrInputDocument doc2 = new SolrInputDocument();
    doc2.addField( "id", "3" );
    doc2.addField( "name", "黑豆" );
    doc2.addField( "price", 2.6 );
    Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
    docs.add(doc1);
    docs.add(doc2);    //3.将文档写入索引库中    solrClient.add(docs);
    solrClient.commit();
}

复制代码

2.查询索引

1)匹配查询

复制代码

    @Test    public void findIndex1() throws IOException, SolrServerException {
        String solrUrl = "http://node21:8080/solr/new_core";
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();        // 创建搜索对象
        SolrQuery query = new SolrQuery();        // 设置搜索条件
        query.set("q","*:*");        //设置每页显示多少条
        query.setRows(2);        //发起搜索请求
        QueryResponse response = solrClient.query(query);        // 查询结果
        SolrDocumentList docs = response.getResults();        // 查询结果总数
        long cnt = docs.getNumFound();
        System.out.println("总条数为"+cnt+"条");        for (SolrDocument doc : docs) {
          System.out.println("id:"+ doc.get("id") + ",name:"+ doc.get("name") + ",price:"+ doc.get("price"));
        }
        solrClient.close();
    }

复制代码

https://img1.sycdn.imooc.com//5b972b4400014a3a06250175.jpg

2)条件过滤查询

复制代码

 @Test    public void findIndex2() throws IOException, SolrServerException {
        String solrUrl = "http://node21:8080/solr/new_core";
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();        //2 封装查询参数
        Map<String, String> queryParamMap = new HashMap<String, String>();
        queryParamMap.put("q", "*:*");        //3 添加到SolrParams对象,SolrParams 有一个 SolrQuery 子类,它提供了一些方法极大地简化了查询操作
        MapSolrParams queryParams = new MapSolrParams(queryParamMap);        //4 执行查询返回QueryResponse
        QueryResponse response = solrClient.query(queryParams);        //5 获取doc文档
        SolrDocumentList docs = response.getResults();        // 查询结果总数
        long cnt = docs.getNumFound();
        System.out.println("总条数为" + cnt + "条");        //[6]内容遍历
        for (SolrDocument doc : docs) {
            System.out.println("id:" + doc.get("id") + ",name:" + doc.get("name") + ",price:" + doc.get("price"));
        }
        solrClient.close();
    }

复制代码

https://img1.sycdn.imooc.com//5b972b4d00011d3805900175.jpg

3.更新索引

复制代码

    @Test    public void updateIndex() throws IOException, SolrServerException {
        String solrUrl = "http://node21:8080/solr/new_core";
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();        //创建索引文档对象
        SolrInputDocument doc = new SolrInputDocument();        //把红豆价格修改为1.5
        doc.addField("id","1");
        doc.addField("name","红豆");
        doc.addField("price","1.5");        //3.将文档写入索引库中        solrClient.add(doc);
        solrClient.commit();        //提交        solrClient.commit();

    }

复制代码

4.删除索引 

1)单一条件删除

复制代码

    @Test    public void deleteIndexById() throws IOException, SolrServerException {
        String solrUrl = "http://node21:8080/solr/new_core";
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();        //全删        //solrClient.deleteByQuery("*:*");        //模糊匹配删除(带有分词效果的删除)
        solrClient.deleteByQuery("name:红");        //指定id删除        //solrClient.deleteById("1");        solrClient.commit();
    }

复制代码

2)批量条件删除

复制代码

    @Test    public void deleteIndexByListId() throws IOException, SolrServerException {
        String solrUrl = "http://node21:8080/solr/new_core";
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();        //通过id删除
        ArrayList<String> ids = new ArrayList<String>();
        ids.add("2");
        ids.add("3");
        solrClient.deleteById(ids);        //[3]提交        solrClient.commit();        //[4]关闭资源        solrClient.close();
    }

复制代码

五.代码报错问题

1.代码添加索引报405问题

https://img1.sycdn.imooc.com//5b972b570001133512720600.jpg

解决方法:

在使用Tomcat部署Solr后,new_core的地址为:http://node21:8080/solr/#/new_core,但使用SolrJ进行索引的时候,应该使用http://node21:8080/solr/new_core,即无中间的#号。

2.自定义索引字段

https://img1.sycdn.imooc.com//5b972b5e0001377408350233.jpg

上图报错提示未识别索引字段

 

参考文档:

https://www.w3cschool.cn/solr_doc/solr_doc-g1az2fmd.html

https://www.cnblogs.com/gaogaoyanjiu/p/7815558.html

https://www.jianshu.com/p/11fb9cfdb2fd

原文出处:https://www.cnblogs.com/frankdeng/p/9615856.html

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 1
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消