552、Elasticsearch详细入门教程系列 -【分布式全文搜索引擎 Elasticsearch(三)】 2023.05.19

这篇具有很好参考价值的文章主要介绍了552、Elasticsearch详细入门教程系列 -【分布式全文搜索引擎 Elasticsearch(三)】 2023.05.19。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Elasticsearch——使用Java API实现ES中的索引、映射、文档操作

1.1 简单介绍

之前是对ES中的创建/查看/删除索引、创建定义映射、创建/查看/修改/删除文档的这些操作有了一定的了解认识,但是是通过Postman + JSON串的方法来实现的
那么之后仍然是对ES中的索引、映射、文档进行操作,只是方法换成了Java API。

1.2 案例详情

首先需要创建一个maven工程,必然要添加ES相关的依赖。
同时双击ES安装目录的bin目录下的 elasticsearch.bat ,先启动ES服务端。

  • pom文件
       <dependency>
           <groupId>org.elasticsearch</groupId>
           <artifactId>elasticsearch</artifactId>
           <version>7.8.0</version>
       </dependency>
       <!-- elasticsearch 的客户端 -->
       <dependency>
           <groupId>org.elasticsearch.client</groupId>
           <artifactId>elasticsearch-rest-high-level-client</artifactId>
           <version>7.8.0</version>
       </dependency>
       <!-- elasticsearch 依赖 2.x 的 log4j -->
       <dependency>
           <groupId>org.apache.logging.log4j</groupId>
           <artifactId>log4j-api</artifactId>
           <version>2.8.2</version>
       </dependency>
       <dependency>
           <groupId>org.apache.logging.log4j</groupId>
           <artifactId>log4j-core</artifactId>
           <version>2.8.2</version>
       </dependency>
       <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId>
           <version>2.9.9</version>
       </dependency>
       <!-- junit 单元测试 -->
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
       </dependency>
1.2.1 创建ES客户端:完成与ES服务端连接

后边都是按照这个模板代码来的

package com.szh.es;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;

import java.io.IOException;

/**
*
*/
public class ESTestClient {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //关闭ES客户端
       esClient.close();
   }
}
1.2.2 创建索引
//创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //创建索引 --- 请求对象
       CreateIndexRequest request = new CreateIndexRequest("user");
       //发送请求 --- 获取响应
       CreateIndexResponse response = esClient.indices().create(request, RequestOptions.DEFAULT);

       //响应状态
       boolean acknowledged = response.isAcknowledged();
       System.out.println("索引操作:" + acknowledged);

       //关闭ES客户端
       esClient.close();
1.2.3 查看索引

public class ESTestIndexSearch {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //查询索引 --- 请求对象
       GetIndexRequest request = new GetIndexRequest("user");
       //发送请求 --- 获取响应
       GetIndexResponse response = esClient.indices().get(request, RequestOptions.DEFAULT);

       //响应状态
       System.out.println(response.getAliases());
       System.out.println(response.getMappings());
       System.out.println(response.getSettings());

       //关闭ES客户端
       esClient.close();
   }
}
1.2.4 删除索引

public class ESTestIndexDelete {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //删除索引 --- 请求对象
       DeleteIndexRequest request = new DeleteIndexRequest("user");
       //发送请求 --- 获取响应
       AcknowledgedResponse response = esClient.indices().delete(request,RequestOptions.DEFAULT);

       //响应状态
       System.out.println(response.isAcknowledged());

       //关闭ES客户端
       esClient.close();
   }
}

1.2.5 创建文档

索引有了,就相当于有了数据库。接下来就需要向数据库中建表、添加数据。建表自然要有表结构(有哪些属性、这些属性分别都是什么数据类型),也就是ES中的映射,在Java代码中就可以采用实体类来实现。

public class User {

   private String name;
   private String sex;
   private Integer age;

   //getter and setter
}
public class ESTestDocInsert {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //创建文档 --- 请求对象
       IndexRequest request = new IndexRequest();
       //设置索引及索引中文档的唯一性标识id(如果不指定,则ES会默认随机生成一个id)
       request.index("user").id("1001");

       //创建数据对象(文档内容)
       User user = new User();
       user.setName("张起灵");
       user.setSex("man");
       user.setAge(21);

       //向ES中插入数据,必须将数据格式转换为JSON
       ObjectMapper objectMapper = new ObjectMapper();
       String userJson = objectMapper.writeValueAsString(user);
       request.source(userJson, XContentType.JSON);

       //发送请求 --- 获取响应
       IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
       System.out.println(response.getResult());

       //关闭ES客户端
       esClient.close();
   }
}
1.2.6 修改文档
public class ESTestDocUpdate {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //修改文档 --- 请求对象
       UpdateRequest request = new UpdateRequest();
       //配置修改参数 --- 表示要修改user索引中id为1001的文档内容
       request.index("user").id("1001");
       //将修改后的内容,以JSON格式写入请求体中
       request.doc(XContentType.JSON,"age",18);

       //发送请求 --- 获取响应
       UpdateResponse response = esClient.update(request,RequestOptions.DEFAULT);
       System.out.println(response.getResult());

       //关闭ES客户端
       esClient.close();
   }
}
1.2.7 查看文档
public class ESTestDocSearch {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //查询文档 --- 请求对象
       GetRequest request = new GetRequest();
       //设置请求参数 --- 表示要查询user索引中id为1001的文档内容
       request.index("user").id("1001");

       //发送请求 --- 获取响应
       GetResponse response = esClient.get(request,RequestOptions.DEFAULT);
       System.out.println(response.getSourceAsString());

       //关闭ES客户端
       esClient.close();
   }
}
1.2.8 删除文档
public class ESTestDocDelete {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //删除文档 --- 请求对象
       DeleteRequest request = new DeleteRequest();
       //设置请求参数 --- 表示要删除user索引中id为1001的文档
       request.index("user").id("1001");
       
       //发送请求 --- 获取响应
       DeleteResponse response = esClient.delete(request,RequestOptions.DEFAULT);
       System.out.println(response.getResult());

       //关闭ES客户端
       esClient.close();
   }
}
1.2.9 批量创建文档
public class ESTestDocInsertBatch {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //批量新增文档 --- 请求对象
       BulkRequest request = new BulkRequest();
       //以JSON格式批量新增文档 --- 存入请求体中
       request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "张起灵","sex","boy","age",21));
       request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "小哥","sex","boy","age",18));
       request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "小宋","sex","boy","age",20));

       //发送请求 --- 获取响应
       BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
       System.out.println(response.getTook());

       //关闭ES客户端
       esClient.close();
   }
}
1.2.10 批量删除文档
public class ESTestDocDeleteBatch {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //批量删除文档 --- 请求对象
       BulkRequest request = new BulkRequest();
       //将要删除的文档id存入请求体中
       request.add(new DeleteRequest().index("user").id("1001"));
       request.add(new DeleteRequest().index("user").id("1002"));
       request.add(new DeleteRequest().index("user").id("1003"));

       //发送请求 --- 获取响应
       BulkResponse response = esClient.bulk(request,RequestOptions.DEFAULT);
       System.out.println(response.getTook());
       System.out.println(response.getItems());

       //关闭ES客户端
       esClient.close();
   }
}
1.2.11 全量查询

因为上面两个代码案例分别进行了批量创建、批量删除。所以这里首先执行一次批量创建的代码,确保索引中有多条数据供我们查询。

public class ESTestDocInsertBatch {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //批量新增文档 --- 请求对象
       BulkRequest request = new BulkRequest();
       //以JSON格式批量新增文档 --- 存入请求体中
       request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "张起灵","sex","boy","age",21));
       request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "小哥","sex","boy","age",18));
       request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "小宋","sex","boy","age",20));
       request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "冷少","sex","boy","age",25));
       request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "Java软件工程师","sex","girl","age",40));

       //发送请求 --- 获取响应
       BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
       System.out.println(response.getTook());

       //关闭ES客户端
       esClient.close();
   }
}

下面首先进行全量查询操作。

public class ESTestDocQuery {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //1.查询索引中的全部文档 --- matchAllQuery 全量查询
       //创建搜索请求对象
       SearchRequest request = new SearchRequest();
       //设置参数 --- 表示查询哪个索引中的文档内容
       request.indices("user");
       //构建查询的请求体 --- 存入搜索请求对象中
       request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));

       //发送请求 --- 获取响应
       SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
       //获取查询到的结果集
       SearchHits hits = response.getHits();
       System.out.println(hits.getTotalHits()); //结果集的条数
       System.out.println(response.getTook());  //总耗时
       //遍历结果集
       for (SearchHit hit : hits) {
           System.out.println(hit.getSourceAsString());
       }

       //关闭ES客户端
       esClient.close();
   }
}
1.2.12 条件查询

做匹配查询,查询年龄age=21的文档内容。

public class ESTestDocQuery {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //2.条件查询--- termQuery age=21
       //创建搜索请求对象
       SearchRequest request = new SearchRequest();
       //设置参数 --- 表示查询哪个索引中的文档内容
       request.indices("user");
       //构建查询的请求体 --- 存入搜索请求对象中
       request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age",21)));

       //发送请求 --- 获取响应
       SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
       //获取查询到的结果集
       SearchHits hits = response.getHits();
       System.out.println(hits.getTotalHits()); //结果集的条数
       System.out.println(response.getTook());  //总耗时
       //遍历结果集
       for (SearchHit hit : hits) {
           System.out.println(hit.getSourceAsString());
       }

       //关闭ES客户端
       esClient.close();
   }
}
1.2.13 分页查询

做全量查询,对查询结果进行分页显示,每页2条数据,查询第1页。
查看第几页:(页码 - 1)*每页条数

public class ESTestDocQuery {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //3.分页查询
       //创建搜索请求对象
       SearchRequest request = new SearchRequest();
       //设置参数 --- 表示查询哪个索引中的文档内容
       request.indices("user");
       //构建查询的请求体
       SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
       builder.from(0);
       builder.size(2);
       //将构建好的查询请求体存入搜索请求对象中
       request.source(builder);

       //发送请求 --- 获取响应
       SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
       //获取查询到的结果集
       SearchHits hits = response.getHits();
       System.out.println(hits.getTotalHits()); //结果集的条数
       System.out.println(response.getTook());  //总耗时
       //遍历结果集
       for (SearchHit hit : hits) {
           System.out.println(hit.getSourceAsString());
       }

       //关闭ES客户端
       esClient.close();
   }
}
1.2.14 排序查询

做全量查询,对查询结果中的年龄age字段做降序排序。

public class ESTestDocQuery {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //4.对查询结果进行排序
       //创建搜索请求对象
       SearchRequest request = new SearchRequest();
       //设置参数 --- 表示查询哪个索引中的文档内容
       request.indices("user");
       //构建查询的请求体
       SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
       builder.sort("age", SortOrder.DESC);
       //将构建好的查询请求体存入搜索请求对象中
       request.source(builder);

       //发送请求 --- 获取响应
       SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
       //获取查询到的结果集
       SearchHits hits = response.getHits();
       System.out.println(hits.getTotalHits()); //结果集的条数
       System.out.println(response.getTook());  //总耗时
       //遍历结果集
       for (SearchHit hit : hits) {
           System.out.println(hit.getSourceAsString());
       }

       //关闭ES客户端
       esClient.close();
   }
}
1.2.15 过滤字段查询

做全量查询,同时排除性别sex字段。

public class ESTestDocQuery {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //5.过滤字段
       //创建搜索请求对象
       SearchRequest request = new SearchRequest();
       //设置参数 --- 表示查询哪个索引中的文档内容
       request.indices("user");
       //构建查询的请求体
       SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
       String[] excludes = {"sex"};
       String[] includes = {};
       builder.fetchSource(includes,excludes);
       //将构建好的查询请求体存入搜索请求对象中
       request.source(builder);

       //发送请求 --- 获取响应
       SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
       //获取查询到的结果集
       SearchHits hits = response.getHits();
       System.out.println(hits.getTotalHits()); //结果集的条数
       System.out.println(response.getTook());  //总耗时
       //遍历结果集
       for (SearchHit hit : hits) {
           System.out.println(hit.getSourceAsString());
       }

       //关闭ES客户端
       esClient.close();
   }
}
1.2.16 组合条件查询

查询年龄 age=18 或者 name=张起灵 的文档内容。

public class ESTestDocQuery {
   public static void main(String[] args) throws IOException {
       //创建ES客户端
       RestHighLevelClient esClient = new RestHighLevelClient(
               RestClient.builder(new HttpHost("localhost",9200,"http"))
       );

       //6.组合查询
       //创建搜索请求对象
       SearchRequest request = new SearchRequest();
       //设置参数 --- 表示查询哪个索引中的文档内容
       request.indices("user");
       //构建查询的请求体
       SearchSourceBuilder builder = new SearchSourceBuilder();
       BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
       boolQueryBuilder.should(QueryBuilders.matchQuery("age",18));
       boolQueryBuilder.should(QueryBuilders.matchQuery("name","张起灵"));
       builder.query(boolQueryBuilder);
       //将构建好的查询请求体存入搜索请求对象中
       request.source(builder);

       //发送请求 --- 获取响应
       SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
       //获取查询到的结果集
       SearchHits hits = response.getHits();
       System.out.println(hits.getTotalHits()); //结果集的条数
       System.out.println(response.getTook());  //总耗时
       //遍历结果集
       for (SearchHit hit : hits) {
           System.out.println(hit.getSourceAsString());
       }

       //关闭ES客户端
       esClient.close();
   }
}
 RestClient.builder(new HttpHost("localhost",9200,"http"))

二、参考链接

[01] 分布式全文搜索引擎 Elasticsearch文章来源地址https://www.toymoban.com/news/detail-474575.html

到了这里,关于552、Elasticsearch详细入门教程系列 -【分布式全文搜索引擎 Elasticsearch(三)】 2023.05.19的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【虚幻4】UE4初学者系列教程(蓝图篇)-全中文新手入门教程(含蓝图节点详细介绍,即时更新~)

    蓝图篇 目录 蓝图基础逻辑 知识点1:蓝图是可视化编程 知识点2:蓝图是面向对象的编译型可视化编程语言 知识点3:关卡蓝图和蓝图类的区别 知识点4:蓝图数据类型 知识点5:节点的介绍 知识点6:引脚的介绍 知识点7:节点的执行顺序 知识点8:节点的类型 知识点9:节点

    2024年02月04日
    浏览(72)
  • 【Python系列】Python教程合辑-史上最全最详细-从入门到入土,看这一篇就够了

    目录 Python合辑汇总列表 用Python自动办公,做职场高手【完结】     玩转Python3入门到精通视频教程     数据分析资料包  全民一起玩Python     千锋教育Python700集零基础入门到精通(爬虫 办公自动化 数据分析)     慕课网实战课-畅销3年的Python分布式爬虫课程-原版提取  

    2024年02月22日
    浏览(95)
  • pytorch中分布式训练DDP教程(新手快速入门!)

    PyTorch是深度学习领域广泛使用的开源深度学习框架之一。随着深度学习模型的不断增大和数据集的不断增长,单机训练往往不能满足我们的需求。为了加速训练过程,我们可以使用分布式训练技术。在PyTorch中,分布式数据并行(Distributed Data Parallel,简称DDP)是一种常见的分

    2024年02月16日
    浏览(45)
  • 分布式协同AI基准测试KubeEdge-Ianvs快速入门教程

    目录 简介 依赖环境 安装Ianvs 案例演示 1. 准备测试环境 2. 准备测试算法 3. 准备基准测试工作 4. 运行基准测试工作 5. 查看测试结果 附录 分布式协同AI基准测试KubeEdge-Ianvs是KubeEdge SIG AI孵化的一个全新的社区子项目,主要来解决工业界如下核心痛点: 1. 业务数据集及其配套算

    2024年02月09日
    浏览(43)
  • Elasticsearch 入门教程

    按下 Ctrl + C,Elastic 就会停止运行。 默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的 config/elasticsearch.yml 文件,去掉 network.host 的注释,将它的值改成 0.0.0.0 ,然后重新启动 Elastic。 network.host: 0.0.0.0 上面代码中,设成 0.0.0.0 让任何人都可以

    2024年04月14日
    浏览(33)
  • Elasticsearch入门使用教程 _1

    目录 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK技术栈 1.1.3.elasticsearch和lucene 1.1.4.为什么不是其他搜索技术? 1.1.5.总结 1.2.倒排索引 1.2.1.正向索引 1.2.2.倒排索引 1.2.3.正向和倒排 1.3.es的一些概念 1.3.1.文档和字段 1.3.2.索引和映射 1.3.3.mysql与elasticsearch 1.4.安装es、

    2024年02月03日
    浏览(42)
  • ElasticSearch入门教程--集群搭建和版本比较

    Elasticsearch 集群有一个唯一的名字,默认就是”elasticsearch”。,一个节点只能通过指定某个集群的名字,来加入这个集群。 集群搭建如下: 复制ES的安装目录三份:esnode-1,esnode-2,esnode-3,分别编辑config/elasticsearch.yml 配置文件 node-1: node-2: node-3: 2、分别启动,浏览器访问 http://

    2024年02月16日
    浏览(53)
  • Elasticsearch 入门教程 – bool 过滤器

    在了解之前,先来理解filter与query不同: Query与Filter     查询在Query查询上下文和Filter过滤器上下文中,执行的操作是不一样的: 查询上下文:      在查询上下文中,查询会回答这个问题——“这个文档匹不匹配这个查询,它的相关度高么?”       如何验证匹配很好理解

    2024年04月28日
    浏览(31)
  • 视频教程 | 长安链推出系列视频教程合集(入门)

    区块链技术脱离数字货币实现产业化应用的时间还相对短,处于逐步融入产业化发展的初期;同时区块链技术涉及到密码学、存储、网络、共识算法等多个领域,是一门跨学科、复合型的技术。“新”和“复合”使得部分开发者,尤其是刚开始面对数字化转型的行业开发者对

    2023年04月17日
    浏览(68)
  • WPF入门教程系列一——基础

    一、 前言            最近在学习WPF,学习WPF首先上的是微软的MSDN,然后再搜索了一下网络有关WPF的学习资料。为了温故而知新把学习过程记录下来,以备后查。这篇主要讲WPF的开发基础,介绍了如何使用Visual Studio 2013创建一个WPF应用程序。 首先说一下学习WPF的基础知

    2024年02月07日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包