Elasticsearch 入门

Elasticsearch 入门

1. 认识 Elasticsearch

1.1 现有查询数据存在的问题

  1. 查询效率较低

    由于数据库模糊查询不走索引,在数据量较大的时候,查询性能很差。

  2. 功能单一

    数据库的模糊搜索功能单一,匹配条件非常苛刻,必须恰好包含用户搜索的关键字。

1.2 倒排索引

Elasticsearch 之所以有如此高性能的搜索表现,正是得益于底层的倒排索引技术。那么什么是倒排索引呢?

倒排索引的概念是基于正向索引而言的。

  1. 正向索引:适合于根据索引字段的精确搜索,不适合基于部分词条的模糊匹配。
  2. 倒排索引:就是为了解决的就是根据部分词条模糊匹配的问题。

倒排索引中有两个非常重要的概念:

  1. 文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。
  2. 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。

创建倒排索引是对正向索引的一种特殊处理和应用,将每一个文档的数据利用分词算法根据语义拆分,得到一个个词条,倒排索引记录每个词条对应的文档 id。

到排索引搜索流程:

2. 快速入门

2.1 创建索引

  1. 打开 Kibana,进入 DevTools

  2. 执行下边的命令向 ES 添加文档,如果 my_index 索引不存在会自动创建:

    POST /my_index/_doc/1
    {"title": "Elasticsearch: cool and easy","content": "This is a test document"
    }
    

2.2 查询文档

根据 id 查询文档:

GET /my_index/_doc/1

参数说明:

  • my_index:索引名
  • _doc:固定
  • 1:文档的 id

2.3 搜索文档

GET /my_index/_search
{"query": {"match": {"content": "test"}}
}

参数说明:

  • content:my_index 索引中的字段名。
  • "test":搜索的关键字。

2.4 删除文档

DELETE /my_index/_doc/1

3. 索引操作

Mapping 映射就类似表的结构。我们要向 es 中存储数据,必须先创建 Index 和 Mapping

3.1 Mapping 映射属性

常见的 Mapping 属性包括:

  • type:字段数据类型,常见的简单类型有:

    • 字符串:text(可分词的文本)
    • keyword(精确值,例如:品牌、国家、ip 地址),keyword 类型主要用于存储不需要分词处理的字符串,这些字符串通常用于精确匹配搜索。
    • 数值:longintegershortbytedoublefloat
    • 布尔:boolean
    • 日期:date
    • 对象:object
  • index:是否索引

    • true:可对此字段搜索,并且如果 type 为 text 则会对文本内容进行分词

    • false:表示不分词也不能搜索。

  • analyzer:添加索引时使用哪种分词器分词

  • properties:该字段的子字段

  • search_analyzer:搜索时使用哪种分词器分词

通常情况下,我们在搜索和创建索引时使用的是同一分析器,默认情况下搜索将会使用字段映射时定义的分析器,也能通过 search_analyzer 设置不同的分词器。

"analyzer": "分词器",
"search_analyzer":"搜索时用的分词器"

3.2 创建索引

基本语法:

  • 请求方式:PUT
  • 请求路径:/索引名,可以自定义
  • 请求参数:mapping 映射
PUT /索引名称
{"mappings": {"properties": {"字段名":{"type": "text","analyzer": "ik_smart"},"字段名2":{"type": "keyword","index": "false"},"字段名3":{"properties": {"子字段": {"type": "keyword"}}},// ...略}}
}

举例:

  1. 文档

    {"age": 21,"weight": 52.1,"isMarried": false,"info": "Java讲师","email": "hz@itcast.cn","score": [99.1, 99.5, 98.9],"name": {"firstName": "赵","lastName": "云"}
    }
    
  2. 对应的 Elasticsearch 映射语句:

    PUT /索引名
    {"mappings": {"properties": {"age": { "type": "integer" },"weight": { "type": "float" },"isMarried": { "type": "boolean" },"info": {"type": "text","analyzer": "ik_max_word","search_analyzer":"ik_smart"},"email": {"type": "keyword","index": false // 不对email字段进行索引,既不分词也不搜索},"score": { "type": "double" },"name": {"properties": {"firstName": { "type": "keyword" },"lastName": { "type": "keyword" }}}}}
    }
    

3.3 查询索引

基本语法:

  • 请求方式:GET
  • 请求路径:/索引名
  • 请求参数:无
GET /索引名

3.4 修改索引

PUT /索引名/_mapping
{"properties": {"新字段名":{"type": "integer"}}
}

但是坚决建议不建议对索引进行修改,如果一定有改变,建议先删除,再创建!!!

3.5 删除索引

语法:

  • 请求方式:DELETE
  • 请求路径:/索引名
  • 请求参数:无
DELETE /索引名

4. 文档操作

4.1 新增文档

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

4.2 查询文档

GET /{索引名称}/_doc/{id}

4.3 删除文档

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

4.4 修改文档

修改有两种方式:

  • 全量修改:直接覆盖原来的文档
  • 局部修改:修改文档中的部分字段
4.4.1 全量修改

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

  • 根据指定的 id 删除文档
  • 新增一个相同 id 的文档

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

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

由于 id1 的文档已经被删除,所以第一次执行时,得到的反馈是 created

所以如果执行第 2 次时,得到的反馈则是 updated

4.4.2 局部修改

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

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

5. Java Client

5.1 配置 Java client

官网

Java Client 要求:

  • Java 8 或更高版本。
  • JSON 对象映射库,可将您的应用程序类与 Elasticsearch API 无缝集成。

在父工程进行版本锁定:

<properties><es.version>7.17.7</es.version><jackson.version>2.13.0</jackson.version><jakarta.json-ai.version>2.0.1</jakarta.json-ai.version>
</properties><!-- 对依赖包进行管理 -->
<dependencyManagement><dependencies><!--es--><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>${es.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>${jakarta.json-ai.version}</version></dependency></dependencies>
</dependencyManagement>

子模块中移入依赖

<dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>
<dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId>
</dependency>

5.2 创建索引

以商城项目为例,使用 Java Client 维护索引数据。

表结构如下:

结合数据库表结构,以上字段对应的 mapping 映射属性如下:

字段名字段类型类型说明是否参与搜索是否参与分词
idlong长整数
nametext字符串,参与分词搜索
priceinteger以分为单位,所以是整数
stockinteger字符串,但是不分词
imagekeyword字符串,但是不分词
categorykeyword字符串,但是不分词
brandkeyword字符串,但是不分词
soldinteger销量,整数
commentCountinteger评价,整数
isADboolean布尔类型
updateTimeDate更新时间

创建 item 的索引

PUT /items
{"mappings": {"properties": {"id": { "type": "keyword" },"name":{"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"price":{ "type": "integer" },"stock":{ "type": "integer" },"image":{ "type": "keyword", "index": false },"category":{ "type": "keyword" },"brand":{ "type": "keyword" },"sold":{ "type": "integer" },"commentCount":{ "type": "integer", "index": false },"isAD":{ "type": "boolean" },"updateTime":{ "type": "date" }}}
}

依据索引映射创建模型类:

@Data
@ApiModel(description = "索引库实体")
public class ItemDoc {@ApiModelProperty("商品id")private String id;@ApiModelProperty("商品名称")private String name;@ApiModelProperty("价格(分)")private Integer price;@ApiModelProperty("库存")private Integer stock;@ApiModelProperty("商品图片")private String image;@ApiModelProperty("类目名称")private String category;@ApiModelProperty("品牌名称")private String brand;@ApiModelProperty("销量")private Integer sold;@ApiModelProperty("评论数")private Integer commentCount;@ApiModelProperty("是否是推广广告,true/false")private Boolean isAD;@ApiModelProperty("更新时间")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime updateTime;
}

测试代码

@SpringBootTest
public class SearchTest {@Autowiredprivate IItemService itemService;private RestClient restClient = null;private ElasticsearchTransport transport = null;private ElasticsearchClient esClient = null;{// 使用 RestClient 作为底层传输对象restClient = RestClient.builder(new HttpHost("192.168.101.68", 9200)).build();ObjectMapper objectMapper = new ObjectMapper();objectMapper.registerModule(new JavaTimeModule());// 使用 Jackson 作为 JSON 解析器transport = new RestClientTransport(restClient, new JacksonJsonpMapper(objectMapper));}// 实现后续操作// TODO@BeforeEachpublic void searchTest() {// 创建客户端esClient = new ElasticsearchClient(transport);System.out.println(esClient);}@AfterEachpublic void close() throws IOException {transport.close();}
}

后续代码放在代码的 TODO 处运行即可!!!

5.3 新增文档

@Test
public void testAdd() throws IOException {Item item = itemService.getById(546872);ItemDoc itemDoc = BeanUtil.toBean(item, ItemDoc.class);IndexResponse response = esClient.index(// 指定索引名称i -> i.index("items")// 指定主键.id(itemDoc.getId())// 指定文档对象.document(itemDoc));System.out.println(response);
}

5.4 查询文档

@Test
public void testGetSearch() throws IOException {GetResponse<ItemDoc> items = esClient.get(// 指定索引名称,查询条件:id=546872g -> g.index("items").id("546872"), // 指定返回类型ItemDoc.class);System.out.println(items);
}

5.5 删除文档

@Test
void testDeleteDocumentById() throws IOException {DeleteResponse response = esClient.delete(// 指定索引d -> d.index("items").id("100002644680"));String s = response.result().jsonValue();log.info("result:"+s);
}

5.6 修改文档

5.6.1 局部修改
@Test
public void testUpdateById() throws IOException {Item item = new Item();// 新值item.setId(546872L);item.setPrice(27500);UpdateResponse<ItemDoc> items = esClient.update(// 指定索引,id = 546872 的数据改为 item 中的数据u -> u.index("items").id("546872").doc(item), ItemDoc.class);System.out.println(items);
}

5.7 批量导入

将数据库中所有数据均添加到文档中

@Test
public void testBatchDocument() throws Exception {int pageNum = 1;int pageSize = 1000;while (true) {// 1. 查询数据库中的数据,每次查询 1000 条导入Page<Item> page = Page.of(pageNum, pageSize);List<Item> items = itemService.page(page).getRecords();if (CollUtils.isEmpty(items)) { break; }// 2. 把获取到的数据转换为 ItemDoc 类型List<ItemDoc> itemDocs = BeanUtil.copyToList(items, ItemDoc.class);// 3. 创建 BulkRequest 对象,批量添加文档BulkRequest.Builder builder = new BulkRequest.Builder();// 4. 遍历数据,添加到 BulkRequest 对象中itemDocs.forEach(itemDoc -> builder.operations(b -> b.index(i -> i.index("items").id(itemDoc.getId()).document(itemDoc))));BulkRequest bulkRequest = builder.build();// 5. 让 ElasticsearchClient 执行 BulkRequest 对象,批量添加文档esClient.bulk(bulkRequest);System.out.println("第" + pageNum + "页数据导入完成");pageNum++;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker镜像相关命令(Day2)

文章目录 前言一、问题描述二、相关命令1.查看镜像2.搜索镜像3.拉取镜像4.删除镜像5.镜像的详细信息6.标记镜像 三、验证与总结 前言 Docker 是一个开源的容器化平台&#xff0c;它让开发者能够将应用及其依赖打包到一个标准化的单元&#xff08;容器&#xff09;中运行。在 D…

网站服务器常见的CC攻击防御秘籍!

CC攻击对网站的运营是非常不利的&#xff0c;因此我们必须积极防范这种攻击&#xff0c;但有些站长在防范这种攻击时可能会陷入误区。让我们先了解下CC攻击&#xff01; CC攻击是什么 CC是DDoS攻击的一种&#xff0c;CC攻击是借助代理服务器生成指向受害主机的合法请求&#x…

【PICO】开发环境配置准备

Unity编辑器配置 安装Unity编辑器 安装UnityHub 安装Unity2021.3.34f1c1 添加安卓平台模块 Pico软件资源准备 资源准备地址&#xff1a;Pico Developer PICO SDK PICO Unity Integration SDK PICO Unity Integration SDK 为 PICO 基于 Unity 引擎研发的软件开发工具…

传输层安全协议 SSL/TLS 详细介绍

传输层安全性协议TLS及其前身安全套接层SSL是一种安全传输协议&#xff0c;目前TLS协议已成为互联网上保密通信的工业标准&#xff0c;在浏览器、邮箱、即时通信、VoIP等应用程序中得到广泛的应用。本文对SSL和TLS协议进行一个详细的介绍&#xff0c;以便于大家更直观的理解和认…

一文解读DeepSeek在工业制造领域的应用

引言 在当今数字化浪潮席卷全球的背景下&#xff0c;各个行业都在积极寻求创新与变革&#xff0c;工业制造领域也不例外。然而&#xff0c;传统工业制造在生产效率、质量控制、成本管理等方面面临着诸多挑战。在这一关键时期&#xff0c;人工智能技术的兴起为工业制造带来了新的…

3.Excel:快速分析

补充&#xff1a;快捷键&#xff1a;CTRLQ 一 格式化 1.数据条 2.色阶 3.开始菜单栏里面选择更多 补充&#xff1a;想知道代表什么意思&#xff1a;管理规则-编辑规则 二 表格 点击后会变成超级表&#xff0c;之前是普通表。 三 迷你图 图放在单元格里面。 补充&#xff1a;除了…

区间端点(java)(贪心问题————区间问题)

deepseek给了一种超级简单的做法 我是真的想不到 贪心的思路是 局部最优——>全局最优 这种我是真的没有想到&#xff0c;这样的好处就是后面便利的时候可以通过foreach循环直接便利qu的子元素也就是对应的某一个区间, 将一个二维数组变成一维数组&#xff0c;每一个一维…

STM32蜂鸣器播放音乐

STM32蜂鸣器播放音乐 STM32蜂鸣器播放音乐 Do, Re, Mi, Fa, 1. 功能概述 本系统基于STM32F7系列微控制器&#xff0c;实现了以下功能&#xff1a; 通过7个按键控制蜂鸣器发声&#xff0c;按键对应不同的音符。每个按键对应一个音符&#xff08;Do, Re, Mi, Fa, Sol, La, Si&a…

基于docker-compose 部署可道云资源管理器

容器编排Explorer 容器化部署MariaDB容器化部署Redis容器化部署PHP容器化部署Nginx编排部署compose服务 var code “9861ce02-1202-405b-b419-4dddd337aaa7” GitHub官网 KodExplorer 是一款网页文件管理器。它也是一个网页代码编辑器&#xff0c;可让你直接在网页浏览器中开…

【Git】--- Git远程操作 标签管理

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Git 前面我们学习的操作都是在本地仓库进行了&#xff0c;如果团队内多人协作都在本地仓库操作是不行的&#xff0c;此时需要新的解决方案 --- 远程仓库。…

Deepseek API+Python 测试用例一键生成与导出 V1.0.3

** 功能详解** 随着软件测试复杂度的不断提升,测试工程师需要更高效的方法来设计高覆盖率的测试用例。Deepseek API+Python 测试用例生成工具在 V1.0.3 版本中,新增了多个功能点,优化了提示词模板,并增强了对文档和接口测试用例的支持,极大提升了测试用例设计的智能化和易…

Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】

文章目录 引言I 实现步骤添加商品管理菜单组推拉效果引言 应用场景:PC端管理后台页面,左侧菜单列表导航。 思路: 用到了动态面板的两个交互效果来实现:隐藏/显示切换、展开/收起元件向下I 实现步骤 添加商品管理菜单组 在左侧画布区域添加一个菜单栏矩形框;再添加一个商…

详细比较StringRedisTemplate和RedisTemplate的区别及使用方法,及解决融合使用方法

前言 感觉StringRedisTemplate和RedisTemplate非常的相识&#xff0c;到底有什么区别和联系呢&#xff1f;点开idea&#xff0c;打开其依赖关系&#xff0c;可以看出只需使用maven依赖包spring-boot-starter-data-redis&#xff0c;然后在service中注入StringRedisTemplate或者…

SpringSecurity——前后端分离登录认证

SpringSecurity——前后端分离登录认证的整个过程 前端&#xff1a; 使用Axios向后端发送请求 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title><script src"https://cdn…

如何用腾讯云建站做好一个多语言的建筑工程网站?海外用户访问量提升3倍!分享我的经验

作为新疆地区领先的工程建筑企业&#xff0c;我们深知在数字化浪潮中&#xff0c;一个专业、高效且具备国际视野的官方网站是企业形象与业务拓展的“门面担当”。然而&#xff0c;传统的建站流程复杂、技术门槛高、多语言适配难等问题&#xff0c;曾让我们在数字化转型中举步维…

遥控器钥匙学习---通过uds指令

1、实际报文 2、硬件配置信息 使用原gateway硬件&#xff0c;软件基于sbcm-main工程新建的一个分支。主要用于钥匙学习的指令发送。 3、后续更改 这里需要细化一下&#xff0c;为了后续方便测试 4、钥匙学习策略 可以学习2把钥匙 一次可以学习把钥匙&#xff0c;uds命令&…

QinQ项展 VLAN 空间

随着以太网技术在网络中的大量部署&#xff0c;利用 VLAN 对用户进行隔离和标识受到很大限制。因为 IEEE802.1Q 中定义的 VLAN Tag 域只有 12 个比特&#xff0c;仅能表示 4096 个 VLAN&#xff0c;无法满足城域以太网中标识大量用户的需求&#xff0c;于是 QinQ 技术应运而生。…

给Web开发者的HarmonyOS指南02-布局样式

给Web开发者的HarmonyOS指南02-布局样式 本系列教程适合鸿蒙 HarmonyOS 初学者&#xff0c;为那些熟悉用 HTML 与 CSS 语法的 Web 前端开发者准备的。 本系列教程会将 HTML/CSS 代码片段替换为等价的 HarmonyOS/ArkUI 代码。 布局基础对比 在Web开发中&#xff0c;我们使用CS…

mapbox进阶,添加鹰眼图控件

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️mapboxgl-minimap 鹰眼控件二、🍀添加…

Linux 配置时间服务器

一、同步阿里云服务器时间 服务端设置 1.检查chrony服务是否安装&#xff0c;设置chrony开机自启&#xff0c;查看chrony服务状态 [rootnode1-server ~]# rpm -q chrony # rpm -q 用于查看包是否安装 chrony-4.3-1.el9.x86_64 [rootnode1-server ~]# systemctl enable --n…