【ES使用】Java API操作ES宝典(8.x版本)

这篇具有很好参考价值的文章主要介绍了【ES使用】Java API操作ES宝典(8.x版本)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,我是老坛。 

本篇文章全部代码资源请关注同名公众号:老坛聊开发

回复:"8.x模板" 即可获取

Elasticsearch是一个分布式的RESTful 风格的搜索和数据分析引擎,它使用方便,查询速度快,因此也被越来越多的开发人员使用。

在Java项目中,使用ES的场景也十分常见。除了作为某些特定资源的存储之外也可以作为像ELK这样的日志收集系统里的存储引擎。总之,对于非关系型而查找需求较多的场景,ES的表现还是非常不错的。

本篇文章介绍的是8.x版本的ES相关Java API操作,如果你使用的版本是7.x及其以下的话可以去看我的另一篇文章:

【ES使用】Java API操作ES宝典(7.x版本及其以下)https://blog.csdn.net/qq_34263207/article/details/127793370

目录

1. 准备工作

1.1 引入依赖

1.2 配置文件

2. ES操作

2.1 简单操作

2.1.1 插入数据

2.1.2 查询数据

2.1.3 修改数据

2.1.4 删除数据

2.2 复杂查询

2.2.1 match查询

2.2.2 term查询

2.2.3 match_phrase查询

2.2.4 multi_match查询

2.2.5 fuzzy查询

2.2.6 range查询

2.2.7 bool查询

2.3 排序和分页

 3.代码模板

4.总结


1. 准备工作

在使用api之前,需要进行一些准备工作。这里我们要进行依赖的引入与config配置文件的编写。

1.1 引入依赖

从8.x开始,spring boot data目前还是不支持的,需要所以没有starter来给我们引入,这里需要引入的是两个其它的依赖:

<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>8.1.1</version>
</dependency>
<dependency>
    <groupId>jakarta.json</groupId>
    <artifactId>jakarta.json-api</artifactId>
    <version>2.0.1</version>
</dependency>

8.1.1版本我用起来是没有问题的,8.0.1版本我用起来会报错,目前也没有查到原因,大家和我引入的版本保持一致即可。

这里我默认大家使用的都是spring的环境,如果没有引入spirng-web包的小伙伴请再自行引入jackson-core包!

关于不同版本的ES和Java API版本对应关系大家可以查阅我的这篇文章:

【ES知识】es版本与java api版本对照一览https://blog.csdn.net/qq_34263207/article/details/127790216

1.2 配置文件

我们先在yml里写一下ES相关的配置信息,方便config使用:

es:
  address: 127.0.0.1
  port: 9200
  scheme: http
  username: admin
  password: admin

然后写一下config文件:

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticSearchConfig {

    @Value("${spring.es.address}")
    String address;

    @Value("${spring.es.port}")
    Integer port;

    @Value("${spring.es.scheme}")
    String scheme;

    @Value("${spring.es.username}")
    String username;

    @Value("${spring.es.password}")
    String password;

    @Bean
    public ElasticsearchClient esRestClientWithCred(){
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        // 配置连接ES的用户名和密码,如果没有用户名和密码可以不加这一行
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(address, port, scheme))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                        return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });
        RestClient restClient = restClientBuilder.build();
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());
        ElasticsearchClient client = new ElasticsearchClient(transport);
        return client;
    }
}

大家直接粘走使用即可,亲测可用。

2. ES操作

我将ES操作定义为了简单操作和复杂操作两部分。简单操作主要是围绕ES的id去做增删改查,而复杂操作是进行复杂查询时候所用到的。

2.1 简单操作

该部分主要是针对id去对ES做了增删改查,而这里的API使用到的类也比较有特点,我简单画了一张图方便大家理解:

void co.elastic.clients.transport.rest_client.restclienttransport.<init>(org,java,elasticsearch,开发语言

可以看到,我们的所有操作都是基于ElasticsearchClient的,而该client定义在之前我们的config里面,要用到的时候注入过来就好了。对于增删改查的每一种操作,都有相应的request和response类来给我们使用,因为对于ES的操作本质上还是发送http请求。

更多优质文章资源请关注同名公众号:老坛聊开发

 先介绍一下我用到的实体对象:

@Data
public class TextBook {

    String bookName;

    String author;

    Integer num;
}

2.1.1 插入数据

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void insertSingle() throws IOException {
        // 创建要插入的实体
        TextBook textBook = new TextBook();
        textBook.setBookName("老坛聊开发");
        textBook.setEdition("老坛");
        textBook.setEditionTime("20221109");
        // 方法一
        IndexRequest<Object> indexRequest = new IndexRequest.Builder<>()
                .index(index)
                .document(textBook)
                .build();
        IndexResponse indexResponse1 = client.index(indexRequest);
    }
}

相比于7.x版本的api,这里使用了builder的方式来创建request,但实际上结合java8的lambda表达式可以写的更清爽:

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void insertSingle() throws IOException {
        // 创建要插入的实体
        TextBook textBook = new TextBook();
        textBook.setBookName("老坛聊开发");
        textBook.setEdition("老坛");
        textBook.setEditionTime("20221109");
        // 方法二
        IndexResponse indexResponse2 = client.index(b -> b
                .index(index)
                .document(textBook)
        );
    }
}

用这种方式我们甚至都不用管中间的一些类和过程,直接就可以从client出发完成整个流程拿到response,这也是我用了8.x的api后最为惊艳的地方,这里我也建议大家这样去写,非常简洁快速,后面的各种操作我也会用这种方式来书写。

2.1.2 查询数据

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void grepSingle(String id) throws IOException {
        GetResponse<TextBook> response = client.get(g -> g
                        .index(index)
                        .id(id),
                TextBook.class
        );

        if (response.found()) {
            TextBook textBook = response.source();
            log.info("返回结果 " + JSON.toJSONString(textBook));
        } else {
            log.info ("textBook not found");
        }
    }
}

这里我们使用GetResponse时要先指定一个泛型,就是我们要查询的实体,同时该类型也作为参数传入查询方法中。

这里使用了GetResponse的found方法先确认一下是否取到了数据,取到了就可以进行获取。

2.1.3 修改数据

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void updateSingle(String id) throws IOException {
        // 创建要更新的实体
        TextBook textBook = new TextBook();
        textBook.setBookName("老坛聊开发");
        textBook.setEdition("老坛");
        textBook.setEditionTime("20221109");
        UpdateResponse updateResponse = client.update(u -> u
                        .doc(textBook)
                        .id(id),
                TextBook.class
        );
    }
}

2.1.4 删除数据

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void deleteSingle(String id) throws IOException {
        DeleteResponse deleteResponse = client.delete(d -> d
                .index(index)
                .id(id)
        );
    }
}

2.2 复杂查询

下面介绍一下ES的复杂查询,也是我们使用更多一些的查询方式,这里面和ES的语法会结合的更紧密一些,强烈建议大家有一定的ES语法基础之后再来阅读。关于ES的基础语法的学习大家可以看我的这篇文章:

【ES知识】ES基础查询语法一览https://blog.csdn.net/qq_34263207/article/details/127849806

有了labmda表达式的简化加成,这部分相比于7.x的api清爽了相当多,任何形式的查询真的都是一行代码搞定。

2.2.1 match查询

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void grepTextBook() throws IOException {
        SearchResponse<TextBook> matchSearch = client.search(s -> s
                        .index(index)
                        .query(q -> q
                                .match(t -> t
                                        .field("bookName")
                                        .query("老坛")
                                )
                        ),
                TextBook.class);
        for (Hit<TextBook> hit: matchSearch.hits().hits()) {
            TextBook pd = hit.source();
            System.out.println(pd);
        }
    }
}

 对应了ES的match查询,它等价的ES语法就是:

GET textbook/_search
{
  "query": {
    "match": {
      "bookName":"老坛"
    }
  }
}

大家还可以发现这种写法的另一个好处就是写起来更像是去写原生的ES查询命令了,隐藏了Java API复杂各种类和中间过程的使用。

2.2.2 term查询

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void grepTextBook() throws IOException {
        SearchResponse<TextBook> termSearch = client.search(s -> s
                        .index(index)
                        .query(q -> q
                                .term(t -> t
                                        .field("bookName")
                                        .value("老坛")
                                )
                        ),
                TextBook.class);
        for (Hit<TextBook> hit: termSearch.hits().hits()) {
            TextBook pd = hit.source();
            System.out.println(pd);
        }
    }
}

 对应了ES的term查询,它等价的ES语法就是:

GET textbook/_search
{
  "query": {
    "term": {
      "bookName":"老坛"
    }
  }
}

2.2.3 match_phrase查询

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void grepTextBook() throws IOException {
        SearchResponse<TextBook> matchPhraseSearch = client.search(s -> s
                        .index(index)
                        .query(q -> q
                                .matchPhrase(m -> m
                                        .field("bookName")
                                        .query("老坛")
                                )
                        ),
                TextBook.class);
        for (Hit<TextBook> hit: matchPhraseSearch.hits().hits()) {
            TextBook pd = hit.source();
            System.out.println(pd);
        }
    }
}

 对应了ES的match_phrase查询,它等价的ES语法就是:

更多优质文章资源请关注同名公众号:老坛聊开发

GET textbook/_search
{
  "query": {
    "match_phrase": {
      "bookName":"老坛"
    }
  }
}

2.2.4 multi_match查询

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void grepTextBook() throws IOException {
        SearchResponse<TextBook> multiMatchSearch = client.search(s -> s
                        .index(index)
                        .query(q -> q
                                .multiMatch(m -> m
                                        .query("老坛")
                                        .fields("author", "bookName")
                                )
                        ),
                TextBook.class);
        for (Hit<TextBook> hit: multiMatchSearch.hits().hits()) {
            TextBook pd = hit.source();
            System.out.println(pd);
        }
    }
}

 对应了ES的multi_match查询,它等价的ES语法就是:

GET textbook/_search
{
	"query": {
		"multi_match": {
			"query": "老坛",
			"fields": ["author","bookName"]
		}
	}
}

2.2.5 fuzzy查询

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void grepTextBook() throws IOException {
        SearchResponse<TextBook> fuzzySearch = client.search(s -> s
                        .index(index)
                        .query(q -> q
                                .fuzzy(f -> f
                                        .field("bookName")
                                        .fuzziness("2")
                                        .value("老坛")
                                )
                        ),
                TextBook.class);
        for (Hit<TextBook> hit: fuzzySearch.hits().hits()) {
            TextBook pd = hit.source();
            System.out.println(pd);
        }
    }
}

 对应了ES的fuzzy查询,它等价的ES语法就是:

GET textbook/_search
{
  "query": {
    "fuzzy": {
      "bookName":{
        "value":"老坛",
        "fuzziness":2
      }
    }
  }
}

2.2.6 range查询

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void grepTextBook() throws IOException {
        SearchResponse<TextBook> rangeSearch = client.search(s -> s
                        .index(index)
                        .query(q -> q
                                .range(r -> r
                                        .field("bookName")
                                        .gt(JsonData.of(20))
                                        .lt(JsonData.of(20))
                                )
                        ),
                TextBook.class);
        for (Hit<TextBook> hit: rangeSearch.hits().hits()) {
            TextBook pd = hit.source();
            System.out.println(pd);
        }
    }
}

 对应了ES的range查询,它等价的ES语法就是:

GET textbook/_search
{ 
  "query": {
    "range": { 
      "num": { 
          "gt":20, 
          "lt":30 
      } 
    }
  } 
}

2.2.7 bool查询

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void grepTextBook() throws IOException {
        SearchResponse<TextBook> boolSearch = client.search(s -> s
                        .index(index)
                        .query(q -> q
                                .bool(b -> b
                                        .must(m -> m
                                                .term(t -> t
                                                        .field("author")
                                                        .value("老坛")
                                                )
                                        )
                                        .should(sh -> sh
                                                .match(t -> t
                                                        .field("bookName")
                                                        .query("老坛")
                                                )
                                        )

                                )
                        ),
                TextBook.class);
        for (Hit<TextBook> hit: boolSearch.hits().hits()) {
            TextBook pd = hit.source();
            System.out.println(pd);
        }
    }
}

 对应了ES的bool查询,它等价的ES语法就是:

GET textbook/_search
{
    "query":{
        "bool":{
            "should":{
                "match":{
                    "bookName":"老坛"
                }
            },
            "must":{
                "term":{
                    "author":"老坛"
                }
            }
        }
    }
}

2.3 排序和分页

排序和分页直接像ES的语法一样,体现在和query的平级即可。这里已match为例进行介绍。

@SpringBootTest
@Slf4j
public class ESTest {

    @Resource
    ElasticsearchClient client;

    String index = "textbook";

    @Test
    public void grepTextBook() throws IOException {
        SearchResponse<TextBook> matchSearch = client.search(s -> s
                        .index(index)
                        .query(q -> q
                                .match(t -> t
                                        .field("bookName")
                                        .query("老坛")
                                )
                        )
                        .from(1)
                        .size(100)
                        .sort(so -> so
                                .field(f -> f
                                        .field("num")
                                        .order(SortOrder.Desc)
                                )
                        ),
                TextBook.class);
        for (Hit<TextBook> hit: matchSearch.hits().hits()) {
            TextBook pd = hit.source();
            System.out.println(pd);
        }
    }
}

这是一个根据num字段进行降序排序的查询,按页容量为100对数据进行分页,取第二页数据。

它等价的ES语法就是:

GET textbook/_search
{
    "query":{
        "match":{
            "bookName":"老坛"
        }
    },
    "from":1,
    "size":100,
    "sort":{
        "num":{
            "order":"desc"
        }
    }
}

 3.代码模板

本篇文章中介绍的全部es操作老坛已整理成模板项目了:

void co.elastic.clients.transport.rest_client.restclienttransport.<init>(org,java,elasticsearch,开发语言

请关注同名公众号:老坛聊开发

并回复:"8.x模板" 获取代码模板

只要大家根据自己的实际环境修改配置即可直接跑起来啦,亲测有效!

void co.elastic.clients.transport.rest_client.restclienttransport.<init>(org,java,elasticsearch,开发语言

4.总结

到这里Java对ES的操作基本上聊的差不多了,题主这里介绍的未必详尽,只是一些我们通常会用到的操作,如果还想详细了解更多的内容请阅读官方文档:

Javadoc and source code | Elasticsearch Java API Client [8.5] | Elastic

另外,题主这里只是为了给大家讲明白如何使用举了几个例子,并不一定效率最高或者使用常见最为恰当,还是需要大家学习一下ES的语法根据自己的实际业务场景去选用,谢谢大家~文章来源地址https://www.toymoban.com/news/detail-787554.html

到了这里,关于【ES使用】Java API操作ES宝典(8.x版本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch启动报updatejava.net.UnknownHostException: geoip.elastic.co错误

    :ES启动时尝试去连接geoip.elastic.co数据库,不解决也可正常访问 在 elasticsearch.yml 中加上一下代码,表示不去连接。 如果访问localhost:9200显示《该网页无法正常运作》如下: 原因:ssl地址访问到了默认地址 解决方法:在 elasticsearch.yml 中修改配置为 false 如下。 重启服务后如下

    2024年02月11日
    浏览(49)
  • 最新版ES8的client API操作 Elasticsearch Java API client 8.0

    作者:ChenZhen 本人不常看网站消息,有问题通过下面的方式联系: 邮箱:1583296383@qq.com vx: ChenZhen_7 我的个人博客地址:https://www.chenzhen.space/🌐 版权:本文为博主的原创文章,本文版权归作者所有,转载请附上原文出处链接及本声明。📝 如果对你有帮助,请给一个小小的s

    2024年02月04日
    浏览(41)
  • 使用postman和es插件操作elasticsearch API

    本文介绍了使用postman和es浏览器插件操作elasticsearch API的常用方法 本文使用的es浏览器插件时edge下的elasticvue,可以在edge的应用商店直接搜索安装,相较于es-head,这个插件一直在维护更新,使用还是很方便的     查看索引 查看索引主要使用get方法,可以查看单个or多个索引,

    2024年02月07日
    浏览(37)
  • Java SpringBoot API 实现ES(Elasticsearch)搜索引擎的一系列操作(超详细)(模拟数据库操作)

    小编使用的是elasticsearch-7.3.2 基础说明: 启动:进入elasticsearch-7.3.2/bin目录,双击elasticsearch.bat进行启动,当出现一下界面说明,启动成功。也可以访问http://localhost:9200/ 启动ES管理:进入elasticsearch-head-master文件夹,然后进入cmd命令界面,输入npm run start 即可启动。访问http

    2024年02月04日
    浏览(57)
  • 算法宝典——Java版本(持续更新)

    注:由于字数的限制,我打算把算法宝典做成一个系列,一篇文章就20题!!! 目录 一、链表的算法题(目前10道) 1. 移除链表元素(力扣;思路:前后指针) 2. 反转一个单链表 (力扣;思路:头插法) 3. 链表的中间结点(力扣;思路:快慢指针) 4. 链表中倒数第k个结点

    2024年02月09日
    浏览(45)
  • 【elastic search】JAVA操作elastic search

    目录 1.环境准备 2.ES JAVA API 3.Spring Boot操作ES 本文是作者ES系列的第三篇文章,关于ES的核心概念移步: https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502 关于ES的下载安装教程以及基本使用,移步: https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502 在前文

    2024年01月25日
    浏览(51)
  • 使用docker安装elastic search[ES]和kibana

    使用docker安装elastic search和kibana,版本均为7.17.1 docker pull# 去dockerhub看具体版本,这里用7.17.1 临时安装生成文件# 参数说明 -d 后台启动 –name 起别名即:NAMES -p 9200:9200 将端口映射出来 elasticsearch的9200端口是供外部访问使用;9300端口是供内部访问使用集群间通讯 -e “discovery.

    2024年02月14日
    浏览(49)
  • 4、Elasticsearch7.6.1 Java api操作ES(CRUD、两种分页方式、高亮显示)和Elasticsearch SQL详细示例

    1、介绍lucene的功能以及建立索引、搜索单词、搜索词语和搜索句子四个示例实现 2、Elasticsearch7.6.1基本介绍、2种部署方式及验证、head插件安装、分词器安装及验证 3、Elasticsearch7.6.1信息搜索示例(索引操作、数据操作-添加、删除、导入等、数据搜索及分页) 4、Elasticsearch7

    2024年02月16日
    浏览(79)
  • 【flink番外篇】9、Flink Table API 支持的操作示例(14)- 时态表的join(java版本)

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月02日
    浏览(55)
  • SpringBoot整合ES,使用java操作ES并发请求

    对于java操作整合es有两种方案我先分别介绍然后解释一下最后我的选择为什么 1)、9300:TCP    spring-data-elasticsearch:transport-api.jar;    通过对9300端口建立一个长连接,但是因为springboot 版本不同, transport-api.jar 不同,不能适配 es 版本,并且7.x 已经不建议使用,8 以后就要废

    2023年04月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包