一.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>

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

<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()
.withSocketTimeout()
.build();
System.out.println(solrClient);
}
}

三.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);
}
}

四.SolrJ的增删改查

这里测试单机版APi操作

1.创建索引

1)指定id单条创建索引

@Test
public 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","");
doc.addField("name","红豆");
doc.addField("price","1.2");
//3.将文档写入索引库中
solrClient.add(doc);
solrClient.commit();
}

2)批量创建索引

@Test
public 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", "");
doc1.addField( "name", "绿豆");
doc1.addField( "price", 1.8 );
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField( "id", "" );
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();
//发起搜索请求
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();
}

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();
}

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","");
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("");
ids.add("");
solrClient.deleteById(ids);
//[3]提交
solrClient.commit();
//[4]关闭资源
solrClient.close();
}

五.代码报错问题

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

解决方法:

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

2.自定义索引字段

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

参考文档:

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

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

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

Solr7.4.0的API(Solrj)操作的更多相关文章

  1. Solr7.4.0的API(Solrj)操作及项目中的使用

    一.SolrJ的概念 solr单机版服务搭建:https://www.cnblogs.com/frankdeng/p/9615253.html solr集群版服务搭建:https://www.cnbl ...

  2. (五)solr7.1.0之solrJ的使用

    (五)solr7.1.0之solrJ的使用 下面是solr7的官网API介绍: 网页翻译的不是很准确,只能了解个大概,基本能获取如下信息: 一.构建和运行SolrJ应用程序 对于用Maven构建的项目 ...

  3. solr7.4.0+mysql+solrj(简而优美)

    目录: 1 solr7部署+创建核心2 solr mysql 连接 2.1 导入相关 jar包 2.2 配置连接信息 2.3 配置中文分析器3 solrj JAVA客户端应用 3.1 solrj 构建 ...

  4. 利用SolrJ操作solr API完成index操作

    使用SolrJ操作Solr会比利用httpClient来操作Solr要简单.SolrJ是封装了httpClient方法,来操作solr的API的.SolrJ底层还是通过使用httpClient中的方法 ...

  5. Solr 14 - SolrJ操作SolrCloud集群 (Solr的Java API)

    目录 1 pom.xml文件的配置 2 SolrJ操作SolrCloud 1 pom.xml文件的配置 项目的pom.xml依赖信息请参照: Solr 09 - SolrJ操作Solr单机服务 (So ...

  6. Solr 09 - SolrJ操作Solr单机服务 (Solr的Java API)

    目录 1 SolrJ是什么 2 SolrJ对索引的CRUD操作 2.1 创建Maven工程(打包方式选择为jar) 2.2 配置pom.xml文件, 加入SolrJ的依赖 2.3 添加和修改索引 2. ...

  7. Spark 下操作 HBase(1.0.0 新 API)

    hbase1.0.0版本提供了一些让人激动的功能,并且,在不牺牲稳定性的前提下,引入了新的API.虽然 1.0.0 兼容旧版本的 API,不过还是应该尽早地来熟悉下新版API.并且了解下如何与当下正红 ...

  8. 使用solrj操作solr索引库,solr是lucene服务器

    客户端开发 Solrj 客户端开发 Solrj Solr是搭建好的lucene服务器 当然不可能完全满足一般的业务需求 可能 要针对各种的架构和业务调整 这里就需要用到Solrj了 Solrj是Sol ...

  9. 使用solrJ操作solr常用方法 【注释非常详细,非常好】

    转: 使用solrJ操作solr常用方法 2017年08月07日 22:49:06 成都往右 阅读数:8990   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

随机推荐

  1. 32个Python爬虫实战项目,满足你的项目慌

    爬虫项目名称及简介 一些项目名称涉及企业名词,小编用拼写代替 1.[WechatSogou]- weixin公众号爬虫.基于weixin公众号爬虫接口,可以扩展成其他搜索引擎的爬虫,返回结果是列表,每 ...

  2. bzoj1040 骑士

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...

  3. 【AGC006F】Blackout

    Description 题目链接 Solution 首先,把输入矩阵看成邻接矩阵,将问题转化到图上. 现在的问题变成:给定一个有向图,如果存在\((u,v)\)和\((v,w)\),则连边\((w,u ...

  4. Linux上常用的基本命令

    复制:copy [keysystem@localhost happydzy]$ cp file1 file2 [keysystem@localhost happydzy]$ ll total -rw- ...

  5. Mac OS X下:TensorBoard可视化问题

    花了1,2个小时,Tensorboard Garphs一直不显示,最后发现竟然是多了一个“=”号

  6. 包学会之浅入浅出Vue.js:开学篇(转)

    包学会之浅入浅出Vue.js:开学篇 蔡述雄,现腾讯用户体验设计部QQ空间高级UI工程师.智图图片优化系统首席工程师,曾参与<众妙之门>书籍的翻译工作.目前专注前端图片优化与新技术的探研. ...

  7. UDP ------ UDP打洞

    为什么需要UDP打洞 处于两个不同局域网的主机不能直接进行UDP通信 UDP"打洞"原理 1.       NAT分类 根据Stun协议(RFC3489),NAT大致分为下面四类 ...

  8. Scala进阶之路-高级数据类型之集合的使用

    Scala进阶之路-高级数据类型之集合的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala 的集合有三大类:序列 Seq.集 Set.映射 Map,所有的集合都扩展自 ...

  9. spring boot 分布式事务实现(XA方式)

    关于spring boot 支持分布式事务,XA是常用的一种方式. 这里把相关的配置记下,方便以后使用. 首先配置两个不同的数据源 : 订单库.持仓库. /** * Created by zhangj ...

  10. POJ - 2299 Ultra-QuickSort(归并排序)

    https://vjudge.net/problem/POJ-2299 题意 求对于给定的无序数组,求出经过最少多少次相邻元素的交换之后,可以使数组从小到大有序. 分析 很明显是求逆序对的数目,那就要 ...