《EalsticSearch从入门到实战》-CRUD+JAVA常用操作

news2025/2/24 15:40:32

目录

《EalsticSearch从入门到实战》

  1. windows环境安装elasticsearch+kibana并完成JAVA客户端查询
  2. 《EalsticSearch从入门到实战》-CRUD+JAVA常用操作

前言

上一篇《windows环境安装elasticsearch+kibana并完成JAVA客户端查询》中我们已经完成了EalsticSearch+Kibana环境的安装,并使用JAVA Client完成了数据的查询,本文主要介绍EalsticSearch RestFull ApiJAVA Client对数据增加修改删除批量增加批量删除以及对索引的增加删除重建等操作

索引管理

创建索引

我们使用PUT /indexName来创建索引,如果没有索引EalsticSearch会给我们默认创建索引,不过创建的索引可能不满足我们的需求,所以最好禁用自动创建索引。 在elasticsearch.yml中增加配置项可禁用自动创建索引 action.auto_create_index:false

PUT /article
{
  "settings": {
    "number_of_shards": 6,
    "number_of_replicas": 1,
    "refresh_interval": "1s",
    "max_result_window":"20000"
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "long"
      },
      "title": {
        "type": "text",
        "analyzer": "standard"
      },
      "tags": {
        "type": "keyword"
      },
      "read_count": {
        "type": "long"
      },
     "like_count": {
        "type": "long"
      },
     "comment_count": {
        "type": "long"
      },
      "rank": {
        "type": "double"
      },
      "location": {
          "type": "geo_point"
        },
      "pub_time": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

我们将article配置参数保存成article.json放入项目的resources目录下使用JAVA操作创建索引:

    @Test
    public void testCreateIndex() throws IOException {
        URL url = this.getClass().getClassLoader().getResource("article.json");
        var indexSetting= Files.readString(Path.of(url.getPath().substring(1)), Charset.defaultCharset());
        JSONObject json=JSON.parseObject(indexSetting);
        JSONObject settings=json.getJSONObject("settings");
        JSONObject indexMapping=json.getJSONObject("mappings");
        CreateIndexRequest request = new CreateIndexRequest("article").mapping(indexMapping.toString(), XContentType.JSON).settings(settings);
        CreateIndexResponse response = esClient.indices().create(request, RequestOptions.DEFAULT);
    }

创建完成索引后我们可以如下命令查看索引的配置情况:

GET /article/_mapping
GET /article/_settings

image.png

在这里我们需要关注四个配置项number_of_shardsnumber_of_replicasrefresh_intervalmax_result_window,更多的配置可以参考官方文档(settings配置)

Seetings分为静态动态,静态配置项设置后就不可修改了,像number_of_shardsnumber_of_replicas为静态配置项,动态配置项创建索引后可以随时动态修改的如refresh_intervalmax_result_window

  • number_of_shards 分片数量
    分片数量在集群环境时要等于数据节点的倍数,这样索引分片可以均匀分配到不同的节点中,机器负载比较平衡,比如你的集群中数据节点有3个,那么number_of_shards你可以设置3、6、9、…3N。

  • number_of_replicas 副本数
    number_of_replicas就是分片的备份数量,如果对数据安全性要求不高、对写入速度要求较高、也不想花太高的存储成本,可以设置成0,一般建议设置成1。

  • refresh_interval 刷新间隔
    默认为10S,数据写入后刷新间隔,对数据写入后查询实时性要求不高可以使用默认,也不能设置太小了,这样刷新太频繁会影响数据写入速度,这里设置成1S。

  • max_result_window 最大返回条数,默认1万条
    这个参数是elasticSearch在查询数据时最大能查到到的数据条数,默认为1万条,如果自定义大于1万条后,在查询时需要增加"track_total_hits": truejava中通过searchSourceBuilder.trackTotalHits(true)设置,否则最多还是只能查到1万条数据。

image.png
动态参考我们也可以通过KibanaIndex Management选择对应的索引来设置。

删除索引

删除索引比较简单

DELETE /article

JAVA代码

    @Test
    public void deleteIndex() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("article");
        esClient.indices().delete(request, RequestOptions.DEFAULT);
    }

这里需要非常注意,如果在生产环境,这样一个小小的命令瞬间就删除了索引中的所有数据,是非常危险的操作。

image.png
为了防止这种删库的危险操作,我们可以在Kibana中创建角色配置操作权限,然后分配给用户对应的角色,禁用这种删库权限。

更新索引

EalsticSearch索引Mapping是不支持修改的,如果增加字段,就需要重建索引,具体的重建索引方法可以参考我的另一篇文章《EalsticSearch添加字段后重建索引方法》

数据管理

添加数据

单条添加:

POST /article/_doc/1
{
    "comment_count": 600,
    "id": 1,
    "like_count": 2000,
    "location": [
        118.55199,
        24.78144
    ],
    "pub_time": "2023-07-29 09:47",
    "rank": 0,
    "read_count": 10000,
    "tags": [
        "台风",
        "杜苏芮",
        "福建"
    ],
    "title": "台风“杜苏芮”登陆福建晋江 多部门多地全力应对"
}

批量添加:

POST _bulk
{"create": {"_index": "news", "_id": 1}}
{"comment_count":600,"id":1,"like_count":2000,"location":[118.55199,24.78144],"pub_time":"2023-07-29 09:47","rank":0.0,"read_count":10000,"tags":["台风","杜苏芮","福建"],"title":"台风“杜苏芮”登陆福建晋江 多部门多地全力应对"}
{"create": {"_index": "news", "_id": 2}}
{"comment_count":60,"id":2,"like_count":200,"location":[116.23128,40.22077],"pub_time":"2023-06-29 14:49:38","rank":0.0,"read_count":1000,"tags":["台风","杜苏芮","北京"],"title":"受台风“杜苏芮”影响 北京7月29日至8月1日将有强降雨"}
{"create": {"_index": "news", "_id": 3}}
{"comment_count":6,"id":3,"like_count":20,"location":[120.21201,30.208],"pub_time":"2020-07-29 14:49:38","rank":0.99,"read_count":100,"tags":["台风","杭州"],"title":"杭州解除台风蓝色预警信号"}

JAVA单条数据插入:

    public void testAdd() throws IOException {
        News news=new News();
        news.setId(1L);
        news.setTitle("台风“杜苏芮”登陆福建晋江 多部门多地全力应对");
        news.setTags(Arrays.asList("台风;杜苏芮;福建".split(";")));
        news.setRead_count(10000L);
        news.setLike_count(2000L);
        news.setComment_count(600L);
        news.setRank(0.0);
        news.setLocation(List.of(118.55199,24.78144));
        news.setPub_time("2023-07-29 09:47");

        IndexRequest indexRequest=new IndexRequest("articel");
        indexRequest.id(news.getId().toString());
        indexRequest.source(JSON.toJSONString(news), XContentType.JSON);
        var index = esClient.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(index.getResult());
}

JAVA批量数据插入:

    @Test
    public  void testBuckAdd() throws IOException {
        List<News> news=new ArrayList<>();
        BulkRequest bulkRequest = new BulkRequest();
        news.forEach(x-> bulkRequest.add(new IndexRequest("article").id(x.getId().toString()).source(JSON.toJSONString(x), XContentType.JSON)));
        BulkResponse bulk = esClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulk.getItems());
    }

这里需要注意几个事项:

  1. EalsticSearch数据插入后就不支持修改了
  2. 不支持像Mysql那样修改某个字段
  3. 当数据插入量比较大的,使用批量插入会大大提升写入速度
  4. 如果要更新某些字段,可以使用《EalsticSearch添加字段后重建索引方法》介绍的_update_by_query,指定更新某些字段
POST /bucket_size_alias/_update_by_query
{
    "query": {
        "bool": {
            "must_not": {
                "exists": {
                    "field": "bucket_name"
                }
            }
        }
    },
    "script":{
    "inline" : "ctx._source.bucket_name= 'default_bucket_name'",
    "lang" : "painless"
  }
}

删除数据

删除接口

DELETE /article/_doc/1

注意事项:
大批量删除数据可以通过 POST /article/_delete_by_query来完成

java删除单条数据:

    @Test
    public   void deleteById() throws IOException {
        DeleteRequest deleteRequest=new DeleteRequest("article","1");
        deleteRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
        esClient.delete(deleteRequest, RequestOptions.DEFAULT);
    }

java批量删除数据:

   @Test
    public   void deleteByIds() throws IOException {
        List<String> ids=new ArrayList<>();
        BulkRequest bulkRequest = new BulkRequest();
        ids.forEach(x-> bulkRequest.add(new DeleteRequest("article",x)));
        BulkResponse bulk = esClient.bulk(bulkRequest, RequestOptions.DEFAULT);
    }

更新数据

更新某一字段:

POST /article/_update_by_query
{
  "script":{
    "source": "ctx._source['title'] = \"测试只更新标题\""
  }, 
  "query": {
    "term": {
      "_id": {
        "value": "1"
      }
    }
  }
}

Java更新某一字段:


    @Test
    public   void updateDate() throws IOException {
        UpdateRequest updateRequest=new UpdateRequest("article","1");
        XContentBuilder builder = XContentFactory.jsonBuilder();
        builder.startObject();
        builder.field("title", "测试只更新标题");
        builder.endObject();
        updateRequest.doc(builder);
        updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
        esClient.update(updateRequest, RequestOptions.DEFAULT);
    }

image.png

注意事项,如果我们通过PUT只传一个title,这样整个文档除了title其它字段都会被删除,EalsticSearch本身是不支持单个字段更新了,update_by_queryJAVA Client UpdateRequest只是帮你做了从EalsticSearch中查出来原来数据再和你的输入合并后,然后插入而已。

PUT /article/_doc/1
{
    "title": "测试只更新标题"
}

image.png

查询数据

通过ID查询

GET /article/_doc/1

JAVA查询操作

    @Test
    public void getById() throws IOException {
        GetRequest request = new GetRequest("article", "1");
        GetResponse getResponse = esClient.get(request, RequestOptions.DEFAULT);
        var sourceAsMap = getResponse.getSourceAsMap();
        sourceAsMap.forEach((k, v) -> System.out.println(k + ":" + v));
    }

JAVA批量查询:

    @Test
    public void getByIds() throws IOException {
        List<String> ids = List.of("1", "2", "3");
        MultiGetRequest request = new MultiGetRequest();
        for (String id : ids) {
            request.add("article", id);
        }
        List<Map<String, Object>> sourceAsMap = new ArrayList<>();
        MultiGetResponse getResponse = esClient.mget(request,RequestOptions.DEFAULT);
        MultiGetItemResponse[] responses = getResponse.getResponses();
        if (responses != null) {
            for (MultiGetItemResponse response : responses) {
                sourceAsMap.add(response.getResponse().getSourceAsMap());
            }
        }
        System.out.println(JSON.toJSONString(sourceAsMap));
    }

总结

本文主要介绍EalsticSearch RestFull ApiJAVA Client对数据增加修改删除批量增加批量删除以及对索引的增加删除重建等操作。同时还介绍的索引创建过程中和更新数据过程中的注意事项。EalsticSearch最重要的就是搜索,接下来将分篇介绍逐一介绍搜索功能的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

页面生成图片或PDF node-egg

没有特别的幸运&#xff0c;那么就特别的努力&#xff01;&#xff01;&#xff01; 中间件&#xff1a;页面生成图片 node-egg 涉及到技术node egg Puppeteer 解决文书智能生成多样化先看效果环境准备初始化项目 目录结构核心代码 完整代码https://gitee.com/hammer1010_ad…

web自动化测试,定位不到元素的原因及解决方案

1.动态id定位不到元素 分析原因&#xff1a;每次打开页面&#xff0c;ID都会变化。用ID去找元素&#xff0c;每次刷新页面ID都会发生变化。 解决方案&#xff1a;推荐使用xpath的相对路径方法或者cssSelector查找到该元素。        2.iframe原因定位不到元素 分析原因…

SQL注入之布尔盲注

SQL注入之布尔盲注 一、布尔盲注介绍二、布尔盲注的特性三、布尔盲注流程3.1、确定注入点3.2、判断数据库的版本3.3、判断数据库的长度3.4、猜解当前数据库名称&#xff08;本步骤需要重复&#xff09;3.5、猜解数据表的数量3.6、猜解第一个数据表名称的长度3.7、猜解第一个数据…

【React】关于组件之间的通讯

&#x1f31f;组件化&#xff1a;把一个项目拆成一个一个的组件&#xff0c;为了便与开发与维护 组件之间互相独立且封闭&#xff0c;一般而言&#xff0c;每个组件只能使用自己的数据&#xff08;组件状态私有&#xff09;。 如果组件之间相互传参怎么办&#xff1f; 那么就要…

Python 算法交易实验65 算法交易二三事

说明 对算法交易的一些内容做一些回顾和反思吧。 老规矩&#xff0c;先chat一下 道理说的都对&#xff0c;如果要补充就推荐再看一本书量化交易:如何建立自己的算法交易事业,我觉得这样就比较完整了。 简单来说&#xff0c;把量化当成事业&#xff0c;而不是一种投机&#…

一起学算法(计算排序篇)

概念&#xff1a; 计数排序&#xff08;Counting sort&#xff09;是一个非基于比较稳定的线性时间的排序算法 非基于比较&#xff1a;之前学的排序都是通过比较数据的大小来实现有序的&#xff0c;比如希尔排序等&#xff0c;而计数排序不需要比较数据的大小而进行排序&…

数据结构:谈快速排序的多种优化和非递归展开,以及排序思想归纳

文章目录 写在前面快速排序的基本体系快速排序的优化快速排序的非递归实现排序分类总结插入排序选择排序交换排序归并排序 写在前面 快速排序作为效率相当高的排序算法&#xff0c;除了对于特殊数据有其一定的局限性&#xff0c;在大多数应用场景中都有它特有的优势和应用&…

PHP8的数据类型转换-PHP8知识详解

什么是数据类型转换&#xff1f; 答&#xff1a;数据从一个类型转换成另外一个类型&#xff0c;就是数据类型转换。 在PHP8中&#xff0c;变量的类型就是由赋值决定的&#xff0c;也就是说&#xff0c;如果 string 赋值给 $var&#xff0c;然后 $var 的类型就是 string。之后…

Python:给MySQL创建1000张表和创建1张有50个字段的表

1、创建1000张表 import pymysqldbhost "10.1.1.143" dbuser "root" dbpassword "123456" dbname "demo_cg1000" dbport 3306 dbconn pymysql.connect(hostdbhost, userdbuser, passworddbpassword, dbdbname, portdbport)mycu…

前端学习--vue2--2--vue指令基础

写在前面&#xff1a; 前置内容 - vue配置 文章目录 插值表达式v-html条件渲染v-show和v-ifv-ifv-if的扩展标签复用组件 v-show v-on /事件v-bind /&#xff1a;属性v-modelv-for 循环元素v-slotv-prev-cloak vue指令只的是带有v-前缀的特殊标签属性 插值表达式 插值表达式{…

【MATLAB第62期】基于MATLAB的PSO-NN、BBO-NN、前馈神经网络NN回归预测对比

【MATLAB第62期】基于MATLAB的PSO-NN、BBO-NN、前馈神经网络NN回归预测对比 一、数据设置 1、7输入1输出 2、103行样本 3、80个训练样本&#xff0c;23个测试样本 二、效果展示 NN训练集数据的R2为&#xff1a;0.73013 NN测试集数据的R2为&#xff1a;0.23848 NN训练集数据的…

【机器学习】Feature Engineering and Polynomial Regression

Feature Engineering and Polynomial Regression 1. 多项式特征2. 选择特征3. 缩放特征4. 复杂函数附录 首先&#xff0c;导入所需的库&#xff1a; import numpy as np import matplotlib.pyplot as plt from lab_utils_multi import zscore_normalize_features, run_gradien…

qt添加图标

1.添加资源 选择QtWidgetsApp.qrc文件打开 添加图标文件路径 添加图标文件 2.按钮添加图标 图标路径为:/res/res/swicth.jpg &#xff08;1&#xff09;代码设置图标 ui.pushButton_OPen->setIcon(QIcon(":/res/res/swicth.jpg")); &#xff08;2&#xff09;属…

设计模式:生成器模式

这个模式书上讲的比较简单&#xff0c;但是感觉精华应该是讲到了。 引用下其它博客的总结&#xff1a;生成器模式的核心在于分离构建算法和具体的构造实现&#xff0c;从而使得构建算法可以重用。 【设计模式】建造者模式_鼠晓的博客-CSDN博客

27 用linprog、fmincon求 解线性规划问题(matlab程序)

1.简述 ① linprog函数&#xff1a; 求解线性规划问题&#xff0c;求目标函数的最小值&#xff0c; [x,y] linprog(c,A,b,Aeq,beq,lb,ub) 求最大值时&#xff0c;c加上负号&#xff1a;-c ② intlinprog函数&#xff1a; 求解混合整数线性规划问题&#xff0c; [x,y] intl…

AI+低代码:开启普惠人工智能时代的新篇章

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

mac pd安装ubuntu并配置远程连接

背景 一个安静的下午&#xff0c;我又想去折腾点什么了。准备学习一下k8s的&#xff0c;但是没有服务器。把我给折腾的&#xff0c;在抱怨了&#xff1a;为什么M系列芯片的资源怎么这么少。 好在伙伴说&#xff0c;你可以尝试一下ubantu。于是&#xff0c;我只好在我的mac上安…

https协议 和 Charles 进行https抓包原理

1.对称加密 其变成复杂的加密密文发送出去。收信方收到密文后&#xff0c;若想解读原文&#xff0c;则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密&#xff0c;才能使其恢复成可读明文。在对称加密算法中&#xff0c;使用的密钥只有一个&#xff0c;发收信双方都…

C++——继承(1)详解

目录 1.继承的含义 2.继承的定义&#xff1a; 3.继承方式 例子1&#xff1a;基类的访问限定符为public&#xff0c;两个派生类的继承方式分别为public、protected时&#xff1a; 例子2&#xff1a; 基类的访问限定符为protected&#xff0c;两个派生类的继承方式分别为pub…

细讲TCP三次握手四次挥手(三)

TCP/IP 协议族 在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 TCP/IP 并不一定是单指 TCP 和 IP 这两个具体的协议&#xff0c;而往往是表示互联网所使用的整个 TCP/IP 协议族。 互联网协议套件&#xff08;英语&#xff1a;Internet Pr…