javaAPI操作Elasticsearch

news2024/9/22 21:28:11

mapping属性


mapping是对索引库中文档的约束, 常见的mapping属性包括:

  • type: 字段数据类型,常见的简单类型有:
    • 字符串: text(可分词的文本), keyword(精确值, 例如: 品牌,国家)
    • 数值: long, integer, short, byte, double, float
    • 布尔: boolean
    • 日期: date
    • 对象: object
  • index: 是否创建索引, 默认为true
  • analyzer: 使用哪种分词器
  • properties: 该字段的子字段

索引库操作


创建索引库

PUT /zyw
{
  "mappings": {
    "properties": {
      "info": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email": {
        "type": "keyword",
        "index": false
      },
      "name": {
        "type": "object",
        "properties": {
          "firstName": {
            "type": "keyword"
          },
          "lastName":{
            "type":"keyword"
          }
        }
      }
    }
  }
}

查看索引库

GET /zyw

删除索引库

DELETE /zyw

修改索引库, 添加新字段

索引库和mapping一旦创建无法修改, 但是可以添加新字段

PUT /zyw/_mapping
{
  "properties": {
    "age": {
      "type": "integer"
    }
  }
}

文档操作


新增文档

POST /zyw/_doc/1
{
  "info": "java是最好的语言",
  "email": "zy@163.com",
  "name": {
    "firstName": "云",
    "lastName": "赵"
  }
}

查询文档

GET /zyw/_doc/1

删除文档

DELETE /zyw/_doc/1

修改文档

  • 全量修改, 会删除旧文档, 添加新文档
PUT /zyw/_doc/1
{
  "info": "java是最好的语言",
  "email": "zy@163.com",
  "name": {
    "firstName": "云",
    "lastName": "赵"
  }
}
  • 局部修改
POST /zyw/_update/1
{
  "doc": {
    "email": "test@163.com"
  }
}

RestClient操作索引库


在这里插入图片描述

  • 引入依赖
		<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.12.1</version>
        </dependency>

注意:
在这里插入图片描述
springboot管理了elasticsearch的部分依赖, 查看springboot的依赖管理
在这里插入图片描述
我们需要在pom文件中定义这个版本值,覆盖springboot的
在这里插入图片描述

  • HotelDoc.java
@Data
@NoArgsConstructor
public class HotelDoc {
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String location;
    private String pic;

    public HotelDoc(Hotel hotel) {
        this.id = hotel.getId();
        this.name = hotel.getName();
        this.address = hotel.getAddress();
        this.price = hotel.getPrice();
        this.score = hotel.getScore();
        this.brand = hotel.getBrand();
        this.city = hotel.getCity();
        this.starName = hotel.getStarName();
        this.business = hotel.getBusiness();
        this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
        this.pic = hotel.getPic();
    }
}
  • hotel索引库
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "all"
      },
      "address": {
        "type": "keyword",
        "index": false
      },
      "price": {
        "type": "integer"
      },
      "score": {
        "type": "integer"
      },
      "brand": {
        "type": "keyword",
        "copy_to": "all"
      },
      "city": {
        "type": "keyword"
      },
      "starName": {
        "type": "keyword"
      },
      "business": {
        "type": "keyword",
        "copy_to": "all"
      },
      "location": {
        "type": "geo_point"
      },
      "pic": {
        "type": "keyword",
        "index": false
      },
      "all": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

基于elasticsearch的规则, id用keyword

  • 操作索引库
import com.zyw.elasticsearchdemo.constants.HotelConstants;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;

public class ElasticsearchDemoApplicationTests {

    private RestHighLevelClient client;


    /**
     * 删除索引库
     */
    @Test
    void deleteHotelIndex() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("hotel");
        client.indices().delete(request, RequestOptions.DEFAULT);
    }

    /**
     * 判断索引库是否存在
     */
    @Test
    void existHotelIndex() throws IOException {
        GetIndexRequest request = new GetIndexRequest("hotel");
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(exists ? "索引库已经存在" : "索引库不存在");
    }

    /**
     * 创建索引库
     */
    @Test
    void createHotelIndex() throws IOException {
        // 1.创建request对象
        CreateIndexRequest request = new CreateIndexRequest("hotel");
        // 2.准备请求的参数, DSL语句
        request.source(HotelConstants.MAPPING_TEMPLATE, XContentType.JSON);
        // 3. 发送请求
        client.indices().create(request, RequestOptions.DEFAULT);
    }

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://82.114.174.50:9200")));
    }

    @AfterEach
    void tearDown() throws IOException {
        client.close();
    }
}

RestClient操作文档


import cn.hutool.json.JSONUtil;
import com.zyw.elasticsearchdemo.mapper.HotelMapper;
import com.zyw.elasticsearchdemo.pojo.Hotel;
import com.zyw.elasticsearchdemo.pojo.HotelDoc;
import org.apache.http.HttpHost;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.List;

@SpringBootTest
public class ElasticsearchDemoApplicationTests1 {

    private RestHighLevelClient client;

    @Autowired
    private HotelMapper hotelMapper;


    /**
     * 删除文档
     */
    @Test
    void deleteDocument() throws IOException {
        DeleteRequest request = new DeleteRequest("hotel", "200216665");
        client.delete(request, RequestOptions.DEFAULT);

    }

    /**
     * 修改文档-局部更新, 全量和创建一样
     */
    @Test
    void updateDocument() throws IOException {
        UpdateRequest request = new UpdateRequest("hotel", "200216665");
        request.doc("price", 2600, "starName", "六钻");
        client.update(request, RequestOptions.DEFAULT);
    }

    /**
     * 查询文档
     */
    @Test
    void getDocument() throws IOException {
        // 准备request对象
        GetRequest request = new GetRequest("hotel", "200216665");
        // 发送请求
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        String json = response.getSourceAsString();
        HotelDoc hotelDoc = JSONUtil.toBean(json, HotelDoc.class);
        System.out.println(hotelDoc);
    }

    /**
     * 新增文档
     */
    @Test
    void addDocument() throws IOException {
        // 根据id查询酒店数据
        Hotel hotel = hotelMapper.selectById(200216665);
        // 转换为文档对象
        HotelDoc hotelDoc = new HotelDoc(hotel);
        // 准备request对象
        IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());
        // 准备json文档
        request.source(JSONUtil.toJsonStr(hotelDoc), XContentType.JSON);
        // 发送请求
        client.index(request, RequestOptions.DEFAULT);
    }

    /**
     * 批量导入文档
     */
    @Test
    void batchAddDocument() throws IOException {
        List<Hotel> hotels = hotelMapper.selectList(null);
        BulkRequest request = new BulkRequest();
        for (Hotel hotel : hotels) {
            HotelDoc hotelDoc = new HotelDoc(hotel);
            request.add(new IndexRequest("hotel").id(hotelDoc.getId().toString())
                    .source(JSONUtil.toJsonStr(hotelDoc), XContentType.JSON));
        }
        // 发送
        client.bulk(request, RequestOptions.DEFAULT);
    }

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://82.114.174.50:9200")));
    }

    @AfterEach
    void tearDown() throws IOException {
        client.close();
    }
}

DSL查询语法


分类和基本语法

在这里插入图片描述
在这里插入图片描述

全文检索查询

全文检索查询, 会对用户输入内容分词, 常用于搜索框搜索
在这里插入图片描述
在这里插入图片描述
建议把多个字段copy到一个字段里

精确查询

在这里插入图片描述
在这里插入图片描述

地理查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

复合查询

  • 复合(compound)查询: 复合查询可以将其他简单查询组合起来, 实现更复杂的搜索逻辑.
    • function score: 复分函数查询, 可以控制文档相关性算分, 控制文档排名. 例如百度竞价

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

搜索结果处理


排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分页

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

高亮

在这里插入图片描述
在这里插入图片描述
默认字段要一致, 可以用require_field_match 取消一致

RestClient查询文档–高级查询


在这里插入图片描述

补充


  • 分词
POST /_analyze
{
  "text": "java是最好的语言",
  "analyzer": "ik_smart"
}
  • 查所有
GET /hotel/_search

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

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

相关文章

EI Scopus检索 | 第二届大数据、物联网与云计算国际会议(ICBICC 2024) |

会议简介 Brief Introduction 2024年第二届大数据、物联网与云计算国际会议(ICBICC 2024) 会议时间&#xff1a;2024年12月29日-2025年1月1日 召开地点&#xff1a;中国西双版纳 大会官网&#xff1a;ICBICC 2024-2024 International Conference on Big data, IoT, and Cloud C…

RediSearch比Es搜索还快的搜索引擎

1、介绍 RediSearch是一个Redis模块&#xff0c;为Redis提供查询、二次索引和全文搜索。要使用RediSearch&#xff0c;首先要在Redis数据上声明索引。然后可以使用重新搜索查询语言来查询该数据。RedSearch使用压缩的反向索引进行快速索引&#xff0c;占用内存少。RedSearch索…

Redis数据结构对象之集合对象和有序集合对象

集合对象 集合对象的编码可以是intset或者hashtable. 概述 intset编码的集合对象使用整数集合作为底层实现&#xff0c;集合对象包含的所有元素都被保存在整数集合里面。 另一方面&#xff0c;hashtable编码的集合对象使用字典作为底层实现&#xff0c;字典的每个键都是一个…

REDHAWK——连接(续)

文章目录 前言一、突发 IO1、数据传输①、输入②、输出 2、突发信号相关信息 (SRI)3、多输出端口4、使用复数数据①、在 C 中转换复数数据 5、时间戳6、端口统计①、C 二、消息传递1、消息生产者①、创建一个消息生产者②、发送消息 2、消息消费者①、创建消息消费者②、注册接…

力扣106---从中序和后序序列构造二叉树

题目描述&#xff1a; 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20…

项目性能优化—使用JMeter压测SpringBoot项目

我们的压力测试架构图如下&#xff1a; 配置JMeter 在JMeter的bin目录&#xff0c;双击jmeter.bat 新建一个测试计划&#xff0c;并右键添加线程组&#xff1a; 进行配置 一共会发生4万次请求。 ctrl s保存&#xff1b; 添加http请求&#xff1a; 配置http请求&#xff1a;…

工控机的无限可能2--智慧城市

一、智能柜 随着网络技术的发展&#xff0c;网购因方便快捷、价格优惠、不受时空限制等优势已成为用户重要的消费方式。快递员因满柜&#xff0c;或柜型单一不能投递&#xff0c;只能将快件堆放在车上或公共过道处苦等&#xff0c;快递、资产管理也随之出现。 如下&#xff0…

使用Windows远程访问Kali Linux桌面

安装xrdp、xfce4 apt-get install -y xrdp xfce4修改 xrdp 配置文件启用 xfce 桌面 vim /etc/xrdp/startwm.sh修改后文件如下&#xff1a; #!/bin/sh # xrdp X session start script (c) 2015, 2017, 2021 mirabilos # published under The MirOS Licence# Rely on /etc/pam…

Unity InputField实现框自适应内容简便方法

要实现InputField框自适应输入内容&#xff0c;除了通过代码进行处理&#xff0c;还可以是使用以下简便的方法。 1、创建InputField组件&#xff1a;右键->UI->Input Field -TextMeshPro。 2、把Input Field Settings中的Line Type设置为Multi Line Newline模式&#x…

第五篇:数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南》

第五篇&#xff1a;第五篇&#xff1a;数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南 --- 我为什么要翻译介绍美国人工智能科技公司IAB系列技术标准&#xff08;2&#xff09; ​​​​​​​翻译计划 第一篇序言第二篇简介和目录第三篇概述- IA…

ubuntu下在vscode中配置matplotlibcpp

ubuntu下在vscode中配置matplotlibcpp 系统&#xff1a;ubuntu IDE&#xff1a;vscode 库&#xff1a;matplotlib-cpp matplotlibcpp.h文件可以此网址下载&#xff1a;https://github.com/lava/matplotlib-cpp 下载的压缩包中有该头文件&#xff0c;以及若干实例程序。 参考…

钡铼R40工业路由器在果园智能化生产管理系统中的重要角色

在现代果园智能化生产管理系统中&#xff0c;钡铼R40工业路由器扮演着至关重要的角色。它作为物联网技术的核心组件&#xff0c;将果园的智能化管理推向了一个全新的高度&#xff0c;实现了对果园环境、果树生长状况以及各类生产设备的实时监控与精准调控。 首先&#xff0c;钡…

Apache Dolphinscheduler - 无需重启 Master-Server 停止疯狂刷日志解决方案

记录的是一个 3.0 比较难搞的问题&#xff0c;相信不少使用过 3.0 的用户都遇到过 Master 服务中存在一些工作流或者任务流一直不停的死循环的问题&#xff0c;导致疯狂刷日志。不过本人到现在也没找到最关键的触发原因&#xff0c;只是看到一些连锁反应带来的结果…… 影响因素…

内网穿透的应用-如何使用Docker安装DockerUI可视化管理工具无公网IP远程访问

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

glib交叉编译

Glib交叉编译 逸一时&#xff0c;误一世。 —— 田所浩二「夏夜银梦」 交叉编译 GLib 涉及到在一个平台上生成能够在另一个平台上运行的目标文件。在这种情况下&#xff0c;我们将会在一台主机&#xff08;通常是开发机器&#xff09;上使用交叉编译工具链来构建 GLib 库&#…

RabbitMQ在Java中使用 SpringBoot 从基础到高级

充分利用每一个监听者 需要充分利用每一个消费者&#xff0c;需要在配置文件中加上prefetch配置并设置为1 rabbitmq:listener:simple:prefetch: 1 # 每次只能获取一条消息&#xff0c;处理完成才能获取下一个消息创建交换机和队列 创建队列 "fanout.queue1"&…

RK3588_Qt交叉编译环境搭建

buildroot编译 进入 /home/linux/plat/rk3588/sdk/buildroot 目录下&#xff0c;执行 Source ./envsetup.sh 选择具体平台编译&#xff0c;后再执行make编译 /home/linux/plat/rk3588/sdk/buildroot/output/OK3568/images 生成的rootfs.ext2镜像重新烧写到rk3568开发板中&…

计算地球圆盘负荷产生的位移

1.研究背景 计算受表面载荷影响的弹性体变形问题有着悠久的历史&#xff0c;涉及到许多著名的数学家和物理学家&#xff08;Boussinesq 1885&#xff1b;Lamb 1901&#xff1b;Love 1911&#xff0c;1929&#xff1b;Shida 1912&#xff1b;Terazawa 1916&#xff1b;Munk &…

22款Visual Studio Code实用插件推荐

前言 Visual Studio Code是一个轻量级但功能强大的源代码编辑器&#xff0c;轻量级指的是下载下来的Visual Studio Code其实就是一个简单的编辑器&#xff0c;强大指的是支持多种语言的环境插件拓展&#xff0c;也正是因为这种支持插件式安装环境开发让Visual Studio Code成为…

计算机二级C语言的注意事项及相应真题-5-程序设计

目录 41.计算下列级数和&#xff0c;和值由函数值返回42.统计出x所指数组中能被e整除的所有元素&#xff0c;这些元素的和通过函数值返回主函数&#xff0c;元素个数通过形参num返回主函数43.使数组右上三角元素中的值乘以m44.将a、b中的两个两位正整数合并形成一个新的整数放在…