java操作ElasticSearch(包含增删改查及基础语法操作)(一)

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: java操作ElasticSearch(包含增删改查及基础语法操作)

ElasticSearch流程图


20210617165116434.png

ElasticSearch简介


Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎


ElasticSearch环境搭建


引入依赖

<dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>${elasticsearch.version}</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>x-pack-transport</artifactId>
        <version>${elasticsearch.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${log4j.version}</version>
    </dependency>


初始化客户端


跟操作数据库一样,写入地址、账号密码,获取一个客户端,有兴趣的可以看org.springframework.data.elasticsearch.client.ClusterNodesspring boot是怎么解析集群的

private TransportClient client;
private String[] nodes = new String[]{"127.0.0.1:9200"};
@Before
public void initClint() {
    Settings settings = Settings.builder()
            // es 集群的名称
            .put("cluster.name", "elasticsearch")
            .put("client.transport.sniff", "true")
            //账号密码
            .put("xpack.security.user", "elastic:123456")
            .build();
    client = new PreBuiltXPackTransportClient(settings)
            //添加集群节点
            .addTransportAddresses(parseAddress());
}

创建索引


可以理解为创建一个mysql数据库表

@Test
public void createIndex() {
    client.admin()
            .indices()
            .prepareCreate("elastic").get();
    client.close();
}

设置mappings


mappings可以理解为mysql的表字段(json数据)


对应的json格式:

{
    "properties": {
            "id": {
                "type": "long",
                        "store": true
            },
            "name": {
                "type": "text",
                        "store": true
            },
            "age": {
                "type": "integer",
                        "store": true
           }
    }
}

对应的Java格式:

XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject() // 相当于json的'{'
                    .startObject("properties")
                        .startObject("id")
                            .field("type", "long") //字段类型
                            .field("store", true) //是否存储
                        .endObject() //相当于json的'}'
                        .startObject("name")
                            .field("type", "text")
                            .field("store", true)
                            .field("analyzer", "ik_smart") //采用ik_smart分词 "search_analyzer": "ik_smart"
                        .endObject()
                        .startObject("age")
                            .field("type", "integer")
                            .field("store", true)
                        .endObject()
                        .startObject("desc")
                            .field("type", "text")
                            .field("store", true)
                            .field("analyzer", "ik_max_word")
                        .endObject()
                        .startObject("registerTime")
                            .field("type", "date")
                            .field("store", true)
                            .field("format", "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")
                        .endObject()
                   .endObject()
                .endObject();
        client.admin().indices()
                .preparePutMapping("elastic")
                .setType("user") //对应数据库的表名称
                .setSource(builder)
                .get();
        client.close();


基础语法


1.1常用查询


1、查询全部:match_all


2、模糊匹配: match (类似sql 的 like)


3、全句匹配: match_phrase (类似sql 的 = )


4、多字段匹配:muti_match (多属性查询)


5、语法查询:query_string (直接写需要配置的 关键字 )


6、字段查询 : term (针对某个属性的查询,这里注意 term 不会进行分词,比如 在 es 中 存了 “火锅” 会被分成 “火/锅” 当你用 term 去查询 “火时能查到”,但是查询 “火锅” 时,就什么都没有,而 match 就会将词语分成 “火/锅”去查)


7、范围查询:range ()


1.2 增删改查


1.2.1.插入操作


Java插入操作代码:


示例一:

String index = "test1";
  String type = "_doc";
  // 唯一编号
  String id = "1";
  IndexRequest request = new IndexRequest(index, type, id);
  String jsonString = "{" + "\"uid\":\"1234\","+ "\"phone\":\"12345678909\","+ "\"msgcode\":\"1\"," + "\"sendtime\":\"2019-03-14 01:57:04\","
      + "\"message\":\"xuwujing study Elasticsearch\"" + "}";
  request.source(jsonString, XContentType.JSON);
  IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

示例二:

 String index = "test1";
  String type = "_doc";
  // 唯一编号
  String id = "1";
  IndexRequest request = new IndexRequest(index, type, id);
  Map<String, Object> jsonMap = new HashMap<>();
  jsonMap.put("uid", 1234);
  jsonMap.put("phone", 12345678909L);
  jsonMap.put("msgcode", 1);
  jsonMap.put("sendtime", "2019-03-14 01:57:04");
  jsonMap.put("message", "xuwujing study Elasticsearch");
  request.source(jsonMap);
  IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

示例三:

String index = "test1";
  String type = "_doc";
  // 唯一编号
  String id = "1";
  IndexRequest request = new IndexRequest(index, type, id);
  XContentBuilder builder = XContentFactory.jsonBuilder();
  builder.startObject();
  {
    builder.field("uid", 1234);
    builder.field("phone", 12345678909L);
    builder.field("msgcode", 1);
    builder.timeField("sendtime", "2019-03-14 01:57:04");
    builder.field("message", "xuwujing study Elasticsearch");
  }
  builder.endObject();
  request.source(builder);
  IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

1> 使用自定义的id


使用put方式,并自己提供id


类似于下面的格式

PUT /{index}/{type}/{id}
{
  "field": "value",
  ...
}

请求

PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "Just trying this out...",
  "date":  "2014/01/01"
}

响应

{
   "_index":    "website",
   "_type":     "blog",
   "_id":       "123",
   "_version":  1,
   "created":   true
}


自动生成的 ID 是 URL-safe、 基于 Base64 编码且长度为20个字符的 GUID 字符串。 这些 GUID 字符串由可修改的 FlakeID 模式生成,这种模式允许多个节点并行生成唯一 ID ,且互相之间的冲突概率几乎为零。


1.2.2.更改操作


Java示例代码:


private static void update() throws IOException {
  String type = "_doc";
  String index = "test1";
  // 唯一编号
  String id = "1";
  UpdateRequest upateRequest = new UpdateRequest();
  upateRequest.id(id);
  upateRequest.index(index);
  upateRequest.type(type);
  // 依旧可以使用Map这种集合作为更新条件
  Map<String, Object> jsonMap = new HashMap<>();
  jsonMap.put("uid", 12345);
  jsonMap.put("phone", 123456789019L);
  jsonMap.put("msgcode", 2);
  jsonMap.put("sendtime", "2019-03-14 01:57:04");
  jsonMap.put("message", "xuwujing study Elasticsearch");
  upateRequest.doc(jsonMap);
  // upsert 方法表示如果数据不存在,那么就新增一条
  upateRequest.docAsUpsert(true);
  client.update(upateRequest, RequestOptions.DEFAULT);
  System.out.println("更新成功!");
}

控制台输入

PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "Just trying this out...",
  "date":  "2014/01/01"
}


在响应体中,我们能看到 Elasticsearch 已经增加了 _version 字段值,created 标志设置成 false ,是因为相同的索引、类型和 ID 的文档已经存在。


{
  "_index": "website",
  "_type": "blog",
  "_id": "123",
  "_version": 2,
  "created": false
}

1.2.3.删除操作


Java示例代码:


示例一(正常根据ID删除):

private static void delete() throws IOException {
  String type = "_doc";
  String index = "test1";
  // 唯一编号
  String id = "1";
  DeleteRequest deleteRequest = new DeleteRequest();
  deleteRequest.id(id);
  deleteRequest.index(index);
  deleteRequest.type(type);
  // 设置超时时间
  deleteRequest.timeout(TimeValue.timeValueMinutes(2));
  // 设置刷新策略"wait_for"
  // 保持此请求打开,直到刷新使此请求的内容可以搜索为止。此刷新策略与高索引和搜索吞吐量兼容,但它会导致请求等待响应,直到发生刷新
  deleteRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
  // 同步删除
  DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
}   


示例二(条件删除):

private static void deleteByQuery() throws IOException {
  String type = "_doc";
  String index = "test1";
  DeleteByQueryRequest request = new DeleteByQueryRequest(index,type);
  // 设置查询条件
  request.setQuery(QueryBuilders.termsQuery("uid",1234));
  // 同步执行
  BulkByScrollResponse bulkResponse = client.deleteByQuery(request, RequestOptions.DEFAULT);
}
DELETE /website/blog/123

如果找到该文档,Elasticsearch 将要返回一个 200 ok 的 HTTP 响应码,和一个类似以下结构的响应体。注意,字段 _version 值已经增加:

{
  "found" :    true,
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 3
}


如果文档没有 找到,我们将得到 404 Not Found 的响应码和类似这样的响应体:


{
  "found" :    false,
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 4
}
相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
4月前
|
存储 Java 容器
Java基本语法详解
本文深入讲解了Java编程的基础语法,涵盖数据类型、运算符、控制结构及数组等核心内容,帮助初学者构建坚实的编程基础。
|
3月前
|
存储 SQL NoSQL
Redis-常用语法以及java互联实践案例
本文详细介绍了Redis的数据结构、常用命令及其Java客户端的使用,涵盖String、Hash、List、Set、SortedSet等数据类型及操作,同时提供了Jedis和Spring Boot Data Redis的实战示例,帮助开发者快速掌握Redis在实际项目中的应用。
298 1
Redis-常用语法以及java互联实践案例
|
3月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
154 1
|
5月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
240 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
4月前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
232 0
|
5月前
|
存储 安全 Java
从基础语法到实战应用的 Java 入门必备知识全解析
本文介绍了Java入门必备知识,涵盖开发环境搭建、基础语法、面向对象编程、集合框架、异常处理、多线程和IO流等内容,结合实例帮助新手快速掌握Java核心概念与应用技巧。
122 0
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
142 2
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
157 1
|
存储 分布式计算 大数据
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
206 3
|
9月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。