一.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. Chemical table CodeForces - 1012B

    题意: 一个棋盘 对于任何一个棋盘中的矩形 如果 任意三角存在棋子 则第四个角会自动生成一个棋子  求铺满整个棋盘 我们至少要向棋盘里加多少枚棋子 解析: 这题就是求图中有多少个连通图,可以直接dfs ...

  2. STEM 是个怎样高大上的东西?

    近几年来,STEM 教育概念传入中国,并且越来越多地成为家长及教育机构关注的焦点. STEM教育概念同时成为了各大小教育机构及公司宣传造势的赚钱工具,可家长.学生.老师们真的理解究竟何为 STEM/S ...

  3. Mysql(二)函数与连接

    一.函数 1.if函数 if(exp1, exp2, exp3)     判断exp1是否为true(不为0,并且不为nlll),如果为true,返回 exp2的值,否则返回exp3的值. selec ...

  4. bzoj 4328 始祖鸟

    4328: JSOI2012 始祖鸟 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 76  Solved: 52[ ...

  5. oracle执行update语句时卡住问题分析及解决办法

    转载:http://www.jb51.net/article/125754.htm 这篇文章主要介绍了oracle执行update语句时卡住问题分析及解决办法,涉及记录锁等相关知识,具有一定参考价值, ...

  6. 数组指针与指针数组(good)

    数组指针和指针数组的区别 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p ...

  7. SQL提高查询效率【in、not in、between、like】等条件讲述

    在使用SQL语句查询数据库记录时,如果要查询相同的内容,有着不同的多种方法. 仍然,尽管使用多种方法可以得到相同的结果,但是,如果您使用不同的方法,在执行效益上是截然不同的.因此,我们得仔细考虑,如果 ...

  8. Spark记录-spark编程介绍

    Spark核心编程 Spark 核心是整个项目的基础.它提供了分布式任务调度,调度和基本的 I/O 功能.Spark 使用一种称为RDD(弹性分布式数据集)一个专门的基础数据结构,是整个机器分区数据的 ...

  9. html5 canvas 径向渐变

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 5个经典的javascript面试问题

    问题1:Scope作用范围 考虑下面的代码: (function() {   var a = b = 5;})(); console.log(b); 什么会被打印在控制台上? 回答 上面的代码会打印 ...