首页 > 其他分享 >ES(文档,DSL)

ES(文档,DSL)

时间:2024-10-17 23:24:41浏览次数:8  
标签:items request 索引 DSL 文档 itemDTO2 id ES

文档操作

有了索引库,接下来就可以向索引库中添加数据了。

Elasticsearch中的数据其实就是JSON风格的文档。操作文档自然保护等几种常见操作,我们分别来学习。

1.新增语法

POST /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1": "值3",
        "子属性2": "值4"
    },
}

java中新增文档

 /**
     * 新增文档
     *
     * @throws IOException
     */
    @Test
    void testConnect() throws IOException {
        // 从服务中获取Item对象
        Item item = iItemService.getById("317578");

        item.setName("靠你娘");
        // 创建索引请求,指定索引名称和文档ID
        IndexRequest request = new IndexRequest("items").id(item.getId().toString());

        // 创建ItemDTO2对象,并拷贝Item对象的属性
        ItemDTO2 itemDTO2 = new ItemDTO2();
        BeanUtils.copyProperties(item, itemDTO2);  // 直接拷贝属性到 itemDTO2

        // 将 itemDTO2 转换为 JSON 字符串
//        String jsonString = JSONObject.toJSONString(itemDTO2);
        String jsonString = JSONObject.toJSONString(itemDTO2);

        // 设置请求的JSON内容
        request.source(jsonString, XContentType.JSON);

        // 执行索引请求,添加文档到索引中
        IndexResponse index = client.index(request, RequestOptions.DEFAULT);

        // 你可以根据需要打印或验证索引响应结果
        System.out.println("Index Response: " + index.getId());
    }

2.查询文档

根据rest风格,新增是post,查询应该是get,不过查询一般都需要条件,这里我们把文档id带上。

GET /{索引库名称}/_doc/{id}
    /**
     * 查询文档
     *
     * @throws IOException
     */
    @Test
    public void get() throws IOException {
        GetRequest getRequest = new GetRequest("items", "317578");
        GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);
        String sourceAsString = response.getSourceAsString();
        log.info("{}", sourceAsString);
    }

3.删除文档

DELETE /{索引库名}/_doc/id值

4.修改文档

修改有两种方式:

  • 全量修改:直接覆盖原来的文档

  • 局部修改:修改文档中的部分字段

1.全量修改

全量修改是覆盖原来的文档,其本质是两步操作:

  • 根据指定的id删除文档

  • 新增一个相同id的文档

注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。

PUT /{索引库名}/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 略
}

2.局部修改

局部修改是只修改指定id匹配的文档中的部分字段。

POST /{索引库名}/_update/文档id
{
    "doc": {
         "字段名": "新的值",
    }
}

java中代码

    /**
     * 局部修改
     *
     * @throws IOException
     */
    @Test
    public void update() throws IOException {
        UpdateRequest request = new UpdateRequest("items", "317578");
        request.doc("name", "密码箱", "price", 38900);
        client.update(request, RequestOptions.DEFAULT);
    }

4.批量导入

java中批量导入代码

/**
     * 批量导入
     */
    @Test
    public void addList() throws IOException {
        int pageNo = 1;
        int pageSize = 1000;

        while (true) {
            Page<Item> page = iItemService.lambdaQuery()
                    .eq(Item::getStatus, 1).page(new Page<>(pageNo, pageSize));
            List<Item> items = page.getRecords();

            if (CollUtils.isEmpty(
                    items)) {
                log.info("没有更多记录可处理,退出");
                break; // 更清晰的退出条件
            }

            log.info("第{}次处理,当前页记录数: {}", pageNo, items.size());
            BulkRequest request = new BulkRequest("items");

            // 批量操作
            for (Item item : items) {
                ItemDTO2 itemDTO2 = new ItemDTO2();
                BeanUtils.copyProperties(item, itemDTO2);
                request.add(
                        new IndexRequest().id(item.getId().toString())
                                .source(JSONObject.toJSONString(itemDTO2), XContentType.JSON)
                );
            }

            // 执行批量操作并处理结果
            BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
            if (bulkResponse.hasFailures()) {
                log.error("批量索引时发生错误: {}", bulkResponse.buildFailureMessage());
            } else {
                log.info("第{}次批量索引成功,共处理记录数: {}", pageNo, items.size());
            }

            // 下一页
            pageNo++;
        }
    }

标签:items,request,索引,DSL,文档,itemDTO2,id,ES
From: https://www.cnblogs.com/freps/p/18473288

相关文章

  • dockerfile中nuget源加载失败Retrying 'FindPackagesByIdAsync' for source 'xxx'
    问题描述:最近jenkins打包总是提示微软源加载不到Retrying'FindPackagesByIdAsync'forsource'https://api.nuget.org/v3-flatcontainer/microsoft.extensions.primitives/index.json'.Anerroroccurredwhilesendingtherequest.解决方案:dockerfile中添加国内源,改用华......
  • spring注解解析与configurationClassPostProcessor(1)
    上个章节讲解了spring启动时解析spring.xml的流程,本章主要解析对注解的解析;目前我们常用的是AnnotationConfigApplicationContext,其中MyApp就是启动类ApplicationContextctx=newAnnotationConfigApplicationContext(MyApp.class);this()方法中可以看到reader为Annotated......
  • JavaScript初级课程 variables
    下载node。1.申明变量variables.jsletmessage="Hello!";message="World";console.log(message);nodevariables.js2.申明不会变的变量constCOLOR_GREEN="green";console.log(COLOR_GREEN)3.数据类型DataTypes=[number,BigInt,string......
  • 计量经济学(十)——正态性检验(Normality Test)
    正态性检验(NormalityTest)是一种用于判断数据是否服从正态分布的重要统计方法,广泛应用于时间序列分析、回归分析等模型的构建与诊断中。许多统计模型,如线性回归、VAR模型等,要求残差或误差项服从正态分布。这一假设是保证模型估计有效性和推断准确性的关键条件,误差项的正态性有助......
  • Response & web登录操作 -2024/10/17
    响应行设置响应状态码:voidsetStatus(intsc);设置响应头键值对:voidsetHeader(Stringname,Stringvalue);response实现重定向resp.setStatus(302);resp.setHeader("location","https://www.4399.com");前端a.html登录,将结果传给后端,用request接收,用M......
  • [ABC134F] Permutation Oddness 题解
    [ABC134F]PermutationOddness题解朴素的想法显然是状压dp,枚举选择的子集,但复杂度不可接受。考虑优化。注意到对于\(p_i\),它的贡献只会有两种可能性,\(+p_i,-p_i\)。于是初步的想法是按照\(p_i\)的正负性选择分类。考虑到对于相同正负性的选择\(p\),其是等价的。于是我们......
  • ESP8266实用代码
    AT固件https://docs.ai-thinker.com/固件汇总串口接收数据并输出#include<SoftwareSerial.h>//自定义串口(RX,TX)#D6接TXD7接RXSoftwareSerialMySerial(D6,D7);Stringdata1;//接受外部数据Stringreceive1(){//接受外部数据Stringdata;if(MyS......
  • 一站式讲解Wireshark网络抓包分析的若干场景、过滤条件及分析方法
    目录1、软件为什么会出现各式各样的网络问题?2、Wireshark抓包工具与tcpdump命令3、典型的网络场景下如何抓包3.1、网卡3.2、集线器3.3、交换机3.4、路由器3.5、加密机3.6、防火墙4、Wireshark简要介绍5、Wireshark过滤条件说明6、结合常用协议进行分析6.1、IPv4协......
  • java_day14_HashSet、TreeSet、增强for循环、Map、HashMap、TreeMap、可变参数
    一、HashSetSet:HashSet:底层数据结构是哈希表,查找速度快,且元素唯一HashSet中的add方法实际上调用的是HashMap中的put方法底层和元素的hashCode方法值有关我们发现,底层判断待插入的元素是否已经存在哈希表中的方式是:将待插入的元素的哈希值与已经存......
  • 文档管理 | 文档目录结构和文件情况的查看与导出
    1.操作原理tree命令用于以树形结构显示目录中的文件和子目录,也能将文件目录结构导出在Windows中。以下是它的一些常见用法:1.1基本语法tree[drive:][path][/F][/A]1.2参数说明[drive:][path]:指定要显示的驱动器和路径。如果不指定,则显示当前目录的结构。/F:显示每个......