Java操作ES
一、ES基本概念
1. 节点:Elastic是一个分布式数据库,每个数据库实例是一个节点Node,一台服务器上可以有多个Node,可以多台服务器协同工作
2. 集群:一组节点Node构成一个集群Cluster
3. 文档:存储数据的基本单元称为文档Document,使用json表示
4. 索引:索引Index是一类文档的集合,ES会索引所有字段,经过处理后写入一个反向索引
5. 类型:一个索引的逻辑分区叫类型Type
6. 分词器:把text类型的数据进行分词,分词后按照分词建立索引,可以按照分词进行查询;默认分词器为ik,可以设置为中文分词器ik_max_word
二、跟普通数据库mysql在数据结构上的区别
mysql:库->表->行->字段
ES:索引->类型->文档->字段
三、数据类型
1.ES在5.*版本之后,把string字段设置为了过时字段,引入text,keyword字段
2.text会自动分词,keyword不分词,因为全部字段分词,会浪费空间
3.如果不在mapping中定义字段类型,java的String类型会自动映射成text & keyword两种
4.如果ES中已经有数据,不支持修改字段类型
a.可以删除原来索引,重新建立
b.新建一个索引,把老数据迁移到新索引上面
c.如果数据比较多或者比较重要,可以新增一个字段
三、增删改查API
1.新增或者更新,/index/type/id已存在就会更新
put /index/type/id
{
"field1":"value1",
"field2":"value2"
}
2.删除
delete /index/type/id
3.查询
term:精确匹配一个字段
match:模糊查询或者分词查询一个字段
wildcard:使用通配符进行查询
四、Java操作ES的方式,建议使用rest方式
1.TransportClient,通过TCP方式访问ES,只支持java,以后可能废除,不建议使用
a.引入依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.7.1</version>
</dependency>
b.创建client
// 设置集群的名字
Settings settings = Settings.builder().put("cluster.name", clusterName)
.put("client.transport.sniff", false)
.put("request.headers.Authorization", basicAuthHeaderValue(userName, password))
.build();
// 创建集群client并添加集群节点地址
PreBuiltTransportClient c = new PreBuiltTransportClient(settings);
c.addTransportAddress(new TransportAddress(InetAddress.getByName(host), Integer.parseInt(port)));
c.使用client增删改查
2.JestClient
a.引入依赖
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
</dependency>
b.创建client
https://blog.csdn.net/weixin_42685328/article/details/111408562
c.使用client增删改查
3.RestClient,通过HTTP方式访问ES,没有语言限制,和transport不能同时使用
low-level-client
https://blog.csdn.net/weixin_33831673/article/details/91447794
4.RestHighLevelClient,推荐使用
a.引入jar包
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.7.1</version>
</dependency>
b.创建client
@Configuration
public class EsConfig {
private static final int HTTP_PORT = 9200;
private static final String IP = "aaa";
private static final String SecurityUser = "aaa";
private static final String SecurityPassword = "aaa"; private static CredentialsProvider init() {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(SecurityUser, SecurityPassword));
return credentialsProvider;
} @Bean
public RestClientBuilder restClientBuilder() {
//配置权限验证
RestClientBuilder restClientBuilder = RestClient.builder( new HttpHost(IP, HTTP_PORT, "http"))
.setHttpClientConfigCallback(httpClientBuilder ->
httpClientBuilder.setDefaultCredentialsProvider(init()));
return restClientBuilder;
} @Bean(name = "highLevelClient")
public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) {
return new RestHighLevelClient(restClientBuilder);
} }
c.写数据
IndexRequest request = new IndexRequest();
request.index(index).type(type).source(JSON.toJSONString(object), XContentType.JSON);
bulkRequest.add(request);
// 保存数据到ES
BulkResponse bulkResponse = highLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
d.读数据 BoolQueryBuilder的should/must,对应mysql的or/and
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 分页参数
searchSourceBuilder.from(1);
searchSourceBuilder.size(10);
searchSourceBuilder.sort("_id", SortOrder.DESC); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
// 精确匹配
.must(QueryBuilders.termQuery("field1","value1")
// 关键字模糊+分词匹配
.must(QueryBuilders.multiMatchQuery("keyword","field1","field2","field3","field4","field5")); searchSourceBuilder.query(boolQueryBuilder); SearchRequest searchRequest = new SearchRequest();
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
if (Objects.nonNull(searchResponse)) {
total = searchResponse.getHits().totalHits;
SearchHits searchHits = searchResponse.getHits();
for (int i = 0; i < searchHits.getHits().length; i++) {
String str = searchHits.getHits()[i].getSourceAsString();
}
}
e.删除数据
DeleteRequest deleteRequest = new DeleteRequest();
deleteRequest.index(index).type(type).id(id); try {
highLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
} catch (Exception ex) {
log.error("删除ES中的数据异常", ex);
}
5.Spring-data-elasticsearch
https://blog.csdn.net/qq_44657532/article/details/123622136
6.bboss框架
https://esdoc.bbossgroups.com/#/quickstart
参考:
https://www.cnblogs.com/javallh/p/13790486.html
https://www.cnblogs.com/dreamroute/p/8484457.html
https://www.cnblogs.com/zwt1990/p/7737747.html
http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html
https://www.cnblogs.com/yixinjishu/p/11057933.html
https://blog.csdn.net/qq_41937849/article/details/87368585
Java操作ES的更多相关文章
- Elasticsearch笔记五之java操作es
Java操作es集群步骤1:配置集群对象信息:2:创建客户端:3:查看集群信息 1:集群名称 默认集群名为elasticsearch,如果集群名称和指定的不一致则在使用节点资源时会报错. 2:嗅探功能 ...
- 2 - 基于ELK的ElasticSearch 7.8.x技术整理 - java操作篇 - 更新完毕
3.java操作ES篇 3.1.摸索java链接ES的流程 自行创建一个maven项目 3.1.1.依赖管理 点击查看代码 <properties> <ES-version>7 ...
- java操作ElasticSearch(es)进行增删查改操作
有时间是要了解一下ES这个东西的~ ---------------------------------------------------------------------------------- ...
- Es学习第十一课,使用java操作elasticsearch
前面十节课我们已经把ES的基本概念和使用讲的差不多了,现在我们就用基于java来实际开发一个操作ES的小项目,带大家来一起练练手. 1.我们用IDEA创建一个maven项目 项目结构如上图所示,然后我 ...
- 使用java操作elasticsearch之与es简历连接
Elasticsearch 的 Java 客户端非常强大:它可以建立一个嵌入式实例并在必要时运行管理任务. 运行一个 Java 应用程序和 Elasticsearch 时,有两种操作模式可供使用.该应 ...
- java操作elasticsearch实现组合桶聚合
1.terms分组查询 //分组聚合 @Test public void test40() throws UnknownHostException{ //1.指定es集群 cluster.name 是 ...
- java操作elasticsearch实现query String
1.CommonTersQuery: 指定字段进行模糊查询 //commonTermsQuery @Test public void test35() throws UnknownHostExcept ...
- java操作elasticsearch实现聚合查询
1.max 最大值 //max 求最大值 @Test public void test30() throws UnknownHostException{ //1.指定es集群 cluster.name ...
- java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询
1.前缀查询(prefix) //prefix前缀查询 @Test public void test15() throws UnknownHostException { //1.指定es集群 clus ...
- java操作elasticsearch实现条件查询(match、multiMatch、term、terms、reange)
1.条件match query查询 //条件查询match query @Test public void test10() throws UnknownHostException { //1.指定e ...
随机推荐
- Python连接hadoop-hive连接方法
import impala.dbapi as ipdbconn = ipdb.connect(host='IP', port= 端口, database='数据库名', auth_mechanism= ...
- QFileDialog实现同时选择文件和文件夹,确认取消按钮英文问题解决方法
如下图所示,需求是同时能够选择文件或者文件夹,但是QFileDialog文件窗口类要么只能选文件,要么只能选文件夹,无法同时去选择文件和文件夹: 要实现这样的需求,封装了一个类,实现同时选择文件和文件 ...
- 基于IGServer的Web地图要素空间分析
1. 引言 MapGIS IGServer 是中地数码的一款跨平台GIS 服务器产品,提供了空间数据管理.分析.可视化及共享服务 MapGIS IGServer的下载(试用)地址:MapGIS IGS ...
- XAF在页面中添加按钮
参考链接:XAF在DashboardView右下方添加SimpleAction - 幽梦紫曦的专栏 - TNBLOG
- Python基础语法复习笔记(一):字符串
python基础复习笔记 个人主页:JoJo的数据分析历险记 个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生 如果文章对你有帮助,欢迎关注.点赞.收藏.订阅专栏 本专栏主要 ...
- 阿里云服务器 jdk1.8 安装配置
阿里云服务器 jdk1.8 安装配置 下载/上传 jdk安装包 解压到指定目录 重命名解压后的文件夹名称 配置环境变量 验证JAVA环境是否安装成功 step 0.安装包准备 1 wget --no ...
- echarts饼图同时展示数量和百分比
要在ECharts中同时展示饼图数据的数量和百分比,可以使用ECharts中的formatter功能.下面是一个简单的示例,演示如何在饼图中显示数量和百分比: option = { tooltip: ...
- DFS略思维题做题记录
洛谷:P4399 [JSOI2008]Blue Mary的职员分配 链接 代码: #include<iostream> using namespace std; int n,x,y,z,A ...
- Java_类与对象
类与对象 概念 类是抽象的,概念的,代表一类事物,比如人类.猫类--,即它是数据类型. 对象是具体的,实际的,代表一个具体事物,即使实例. 类是对象的模板,对象是类的一个个体,对应一个实例 对象在内存 ...
- BLP(Bell–LaPadula模型)(MAC)
Bell-LaPadula模型侧重于数据的保密性和对机密信息的受控访问 基于状态机,该状态机在一个计算机系统中具有一组允许的状态,并且从一个状态到另一种状态的转换由状态转移函数定义. 该模型定义了一个 ...