ElasticSearch上

安装ElasticSearch

  • Lucene:Java语言的搜索引擎类库,易扩展;高性能(基于倒排索引)
  • Elasticsearch基于Lucene,支持分布式,可水平扩展;提供Restful接口,可被任何语言调用
  • Elasticsearch结合kibana、logstash、Beats,是一套完整的技术栈,被叫做ELK。
    在这里插入图片描述

安装ElasticSearch

docker run -d \--name es \-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \-e "discovery.type=single-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugins:/usr/share/elasticsearch/plugins \--privileged \--network hm-net \-p 9200:9200 \-p 9300:9300 \--restart=always \elasticsearch:7.12.1
  • -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" :配置JVM的最大最小内存
  • -e "discovery.type=single-node":配置运行模式(集群模式、单点模式)
  • -v es-data:/usr/share/elasticsearch/data:es的数据存储目录
  • -v es-plugins:/usr/share/elasticsearch/plugins:es的插件目录
  • -p 9200:9200:访问的http端口
  • -p 9300:9300:集群间通信端口

查看es的日志: docker logs -f es
在这里插入图片描述
安装成功后,在浏览器输入:http://192.168.140.101:9200/,看到响应即安装成功。在这里插入图片描述

安装Kibana

Kibana是个图形界面,帮助我们连接es

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601  \
--restart=always \
kibana:7.12.1
  • -e ELASTICSEARCH_HOSTS=http://es:9200 \:因为kibana和es在同一个网络下,所以可以通过容器名直接连接es

查看kibana的日志: docker logs -f kibana在这里插入图片描述
安装成功后,在浏览器输入:http://192.168.140.101:5601/,看到响应即安装成功。
在这里插入图片描述
可以利用kibana中Dev Tools控制台向es发送http请求

倒排索引

MySQL采用的是正向索引:
在这里插入图片描述

查询词条时需要逐行遍历文档,再判断文档中是否包含了词条

Elasticsearch采用倒排索引:

  • 文档(document):每条数据就是一个文档
  • 词条(term):文档按照语义分成的词语
    在这里插入图片描述

用户搜索的时候,先对用户搜索的数据进行分词,将分词后的词条放到词条列表中得到文档id,根据文档id去文档列表中查询。虽然有两次查询,但是每次查询都是有索引,搜索速度快。

IK分词器

中文分词往往需要根据语义,比较复杂,这就需要用到中文分词器,例如:IK分词器
下载地址:IK分词器

安装IK分词器

只需要把IK分词器下载后放到es的插件目录重启es即可生效。
在这里插入图片描述

测试IK分词器是否安装成功

ik_smart

智能切分,粗粒度

POST /_analyze
{"analyzer": "ik_smart","text": "今天天气真好"
}

在这里插入图片描述

ik_max_word

最细切分,细粒度IK分词器

POST /_analyze
{"analyzer": "ik_max_word","text": "今天天气真好"
}

在这里插入图片描述

自定义词典

可以在ik插件的config目录下的IKAnalyzer.cfg.xml文件配置扩展词典停止词典
在这里插入图片描述

ElasticSearch中基础概念

在这里插入图片描述

索引库操作

索引库相当于MySQL里的表,Mapping相当于对表字段的约束

Mapping映射属性

mapping是对索引库中文档的约束。

  1. type:字段数据类型
    • 字符串:text(可分词文本)、keyword(精确值,不能分词,例如:品牌、国家、ip地址)
    • 数值:long、integer、short、byte、double、float
    • 布尔:boolean
    • 日期:date(es自己把日期对象做了序列化)
    • 对象:object
  2. index:是否创建索引,默认为true
    • true:es就会给这个字段创建倒排索引,就可以根据这个字段进行搜索或排序
  3. analyzer:使用哪种分词器(ik_smart、ik_max_word),只有字段类型是text才需要指定分词器
  4. properties:该字段的子字段

在es中,不需要管是否是数组,就算是数组,也只要指定元素的类型即可

索引库的CRUD

es中提供的API都是Restful的接口,遵循Restful的基本规范:
在这里插入图片描述

创建索引库

PUT /索引库名称
{"mappings": {"properties": {"字段名":{"type": "text", // 可分词"analyzer": "ik_smart"},"字段名2":{"type": "keyword", // 不可分词"index": "false"},"字段名3":{"properties": {"子字段": {"type": "keyword"}}},// ...略}}
}

【例】:

# 创建索引库
PUT /people 
{"mappings": {"properties": {"info": {"type": "text","analyzer": "ik_smart"},"age": {"type": "byte"},"email": {"type": "keyword","index": "false"},"name": {"type": "object","properties": {"firstName":{"type": "keyword"},"lastName": {"type": "keyword"}}}}}
}

在这里插入图片描述

修改索引库

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

【例】:

# 修改索引库,新增一个sex字段
PUT /people/_mapping 
{"properties": {"sex": {"type": "boolean"}}
}

【注】:es中是不允许对已有索引库的字段进行修改,但是允许添加新的字段
【原因】:假设已经在es中创建大量的倒排索引,做了大量的分词,如果此时需要修改索引库,那么前期做的所有分词都作废还要重新建立倒排索引,对于整个数据库的影响很大。

查询索引库

# 查询索引库
GET /索引库名

删除索引库

# 删除索引库
DELETE /索引库名

文档操作

文档的CRUD

新增文档

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

【例】:

POST /people/_doc/1
{"info": "程序员","email": "xiaolin0333@qq.com","name": {"firstName": "林","lastName": "三"}
}

新增文档的时候最好指定文档id,es会根据文档id创建索引,如果不指定id,es会随机生成id,这样将来操作文档就会很不方便

修改文档

1. 全量修改

删除旧文档,添加新文档

PUT /{索引库名}/_doc/文档id
{"字段1": "值1","字段2": "值2",// ... 文档的所有字段都要写
}

注:如果想要修改一个文档id不存在的文档,删除文档的时候,文档不存在,会直接新增一条文档
因此PUT请求具备了新增修改两种功能

  • 新增:文档id不存在
  • 修改:文档id存在
2. 增量修改

修改部分字段值

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

查询文档

# 查询文档
GET /索引库名/_doc/文档id

在这里插入图片描述

删除文档

# 删除文档
DELETE /索引库名/_doc/文档id

批量处理

es中允许通过一次请求中携带多次文档操作。

POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } } // 新增(索引库名、id)
{ "field1" : "value1" } // 新增的文档信息{ "delete" : { "_index" : "test", "_id" : "2" } } // 删除(索引库名、id){ "update" : {"_id" : "1", "_index" : "test"} } // 更新(索引库名、id)
{ "doc" : {"field2" : "value2"} } // 更新的文档信息(增量修改)

写的时候不能换行,只能在一行写,否则会报错

【例1】:批量新增

POST /_bulk {"index": {"_index": "people","_id": "2"}}{"info": "这是人", "email": "xiaolin0333@qq.com", "name": {"firstName": "林", "lastName": "三"}}{"index": {"_index": "people","_id": "3"}}{"info": "这是狗", "email": "cmb@qq.com", "name": {"firstName": "柴", "lastName": "犬"}}

【例2】:批量删除

POST /_bulk {"delete": {"_index": "people","_id": "2"}}{"delete": {"_index": "people","_id": "3"}}

JavaRestClient

客户端初始化

  1. 引入es的RestHighLevelClient的依赖:
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
  1. 因为SpringBoot默认ES的版本是7.17.0,所以需要覆盖默认的ES版本:
  <properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><elasticsearch.version>7.12.1</elasticsearch.version></properties>
  1. 初始化RestHighLevelClient(这里暂时先用单元测试为例)
public class ElasticTest {private RestHighLevelClient client;@Testvoid testConnection() {System.out.println("client = " + client);}@BeforeEach // 初始化方法:在单元测试执行前void setUp() {client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.140.101:9200")));}@AfterEach // 销毁方法:在单元测试执行后void tearDown() throws IOException {if(client != null) {client.close();}}
}

商品表Mapping映射

【业务分析】:
在这里插入图片描述
在这里插入图片描述
【在控制台创建Mapping映射】:

# 商品索引库
PUT /hmall
{"mappings": {"properties": {"id": {"type": "keyword"},"name": {"type": "text","analyzer": "ik_smart"},"price": {"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"}}}
}

索引库操作

  1. 创建XxxIndexRequest。Xxx指:Create、Get、Delete
  2. 准备请求参数(Create需要)
  3. 发送请求。调用client.indices.xxx()方法,xxx指:create、get、exists、delete

创建索引库

创建索引库的JavaAPI和Restful接口API对比:

@Test
void testCreateIndex() throws IOException {// 1. 准备Request对象CreateIndexRequest request = new CreateIndexRequest("items");// 2. 准备请求参数request.source(MAPPING_TEMPLATE, XContentType.JSON); // MAPPING_TEMPLATE就是前面在控制台写的那段// 3. 发送请求client.indices().create(request, RequestOptions.DEFAULT);
}

在这里插入图片描述

查询索引库

@Test
void testGetIndex() throws IOException {// 1. 准备Request对象GetIndexRequest request = new GetIndexRequest("items");// 2. 发送请求GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);// 查询索引库(索引库不存在报错)boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);// 判断索引库是否存在(索引库不存在返回false)
}

删除索引库

@Test
void testDeleteIndex() throws IOException {// 1. 准备Request对象DeleteIndexRequest request = new DeleteIndexRequest("items");// 2. 发送请求client.indices().delete(request, RequestOptions.DEFAULT);}

文档操作

  1. 初始化RestHighLevelClient
  2. 创建XxxRequest。Xxx指:Index、Get、Update、Delete
  3. 准备参数(Index和Update需要)
  4. 请求参数。调用xxx()方法,xxx是index、get、update、delete
  5. 解析结果(Get需要)

新增文档

新增文档的JavaAPI和Restful接口API对比:
在这里插入图片描述

@Test
void testIndexDoc() throws IOException {// 准备文档数据Item item = itemService.getById(2018833);ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class); // 文档数据对象String jsonStr = JSONUtil.toJsonStr(itemDoc); // JSON// 1. 准备RequestIndexRequest request = new IndexRequest("items").id(itemDoc.getId());// 索引库名、文档id// 2. 准备JSON文档request.source(jsonStr, XContentType.JSON);// 3. 发送请求client.index(request, RequestOptions.DEFAULT);
}

修改文档

全量修改

全量修改相当于新增,就是新增的时候文档id已经存在

局部修改

在这里插入图片描述

@Test
void testUpdateDoc() throws IOException {// 1. 准备RequestUpdateRequest request = new UpdateRequest("items", "2018833"); // 索引库名、文档id// 2. 准备请求参数request.doc("price", 25600,"stock", 9999);// 3. 发送请求client.update(request, RequestOptions.DEFAULT);
}

查询文档

查询文档主要是拿到_source部分
在这里插入图片描述

@Test
void testGetDoc() throws IOException {// 1. 准备RequestGetRequest request = new GetRequest("items", "2018833"); // 索引库名、文档id// 2. 发送请求GetResponse response = client.get(request, RequestOptions.DEFAULT);String json = response.getSourceAsString();ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);System.out.println(doc);
}

删除文档

@Test
void testDeleteDoc() throws IOException {// 1. 准备RequestDeleteRequest request = new DeleteRequest("items", "2018833"); // 索引库名、文档id// 2. 发送请求client.delete(request, RequestOptions.DEFAULT);
}

批处理

构建请求时会用到BulkRequest来封装普通的CRUD请求:
在这里插入图片描述
【案例】:往索引库里添加所有上架的商品

@Test
void testBulkDoc() throws IOException {int pageNo = 1, pageSize = 500;while(true) {// 0. 准备文档数据Page<Item> page = itemService.lambdaQuery().eq(Item::getStatus, 1) // 上架商品.page(Page.of(pageNo, pageSize));List<Item> records = page.getRecords();if(records == null || records.isEmpty()) {return;}// 1. 准备RequestBulkRequest request = new BulkRequest();// 2. 准备数据-批量新增for(Item item : records) {ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class);request.add(new IndexRequest("items").id(item.getId().toString()).source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON));}// 3. 发送请求client.bulk(request, RequestOptions.DEFAULT);pageNo++;}
}

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

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

相关文章

element-ui textarea备注 textarea 多行输入框

发现用这个组件&#xff0c;为了给用户更好的体验&#xff0c;要加下属性 1. 通过设置 autosize 属性可以使得文本域的高度能够根据文本内容自动进行调整&#xff0c;并且 autosize 还可以设定为一个对象&#xff0c;指定最小行数和最大行数。:autosize"{ minRows: 3, ma…

.netframwork模拟启动webapi服务并编写对应api接口

在.NET Framework环境中模拟启动Web服务&#xff0c;可以使用几种不同的方法。一个常见的选择是利用HttpListener类来创建一个简单的HTTP服务器&#xff0c;或者使用Owin/Katana库来自托管ASP.NET Web API或MVC应用。下面简要介绍Owin/Katana示例代码。这种方法更加灵活&#x…

路由环路的产生原因与解决方法(1)

路由环路 路由环路就是数据包不断在这个网络传输&#xff0c;始终到达不了目的地&#xff0c;导致掉线或者网络瘫痪。 TTL &#xff08;生存时间&#xff09;&#xff1a;数据包每经过一个路由器的转发&#xff0c;其数值减1&#xff0c;当一个数据包的TTL值为0是&#xff0c;路…

Leetcode3097:或值至少为 K 的最短子数组 II

题目描述&#xff1a; 给你一个 非负 整数数组 nums 和一个整数 k 。 如果一个数组中所有元素的按位或运算 OR 的值 至少 为 k &#xff0c;那么我们称这个数组是 特别的 。 请你返回 nums 中 最短特别非空 子数组的长度&#xff0c;如果特别子数组不存在&#xff0c;那么返…

Android CustomTextField

在 Compose 中开发用户界面时&#xff0c;需要处理输入框和键盘的交互&#xff0c;例如在键盘弹出时调整布局位置&#xff0c;避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能。 功能概述 本例实现了一个简单的输入框。当输入框获得焦点或输入文字时&…

《CPython Internals》阅读笔记:p221-p231

《CPython Internals》学习第 12天&#xff0c;p221-p231 总结&#xff0c;总计 11 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;2) 1.at a time idiom. separately(单独地) in the specified groups(一次)。示例&#xff1a; (1) I can only do one thing at …

WORD转PDF脚本文件

1、在桌面新建一个文本文件&#xff0c;把下列代码复制到文本文件中。 On Error Resume Next Const wdExportFormatPDF 17 Set oWord WScript.CreateObject("Word.Application") Set fso WScript.CreateObject("Scripting.Filesystemobject") Set fdsf…

Alluxio数据流转方案在联通智网的应用

分享嘉宾 陈得泳 - 中国联通大数据平台 SRE 工程师&#xff0c;致力于基于开源生态构建稳定、高效、安全、低成本的大数据集群。 观看完整分享回放 业务背景 统一底座和安全基座位于不同IDC&#xff1b;统一底座&#xff1a;承接 O 域全域网络数据&#xff0c;包括移动网信…

搜维尔科技提供完整的人形机器人解决方案以及训练系统

问题&#xff1a;从灵巧手收集的数据是否也会在大脑大模型中训练&#xff0c;或是在专门用于手部控制的单独模型中训练&#xff1f; Q: If the data collected from dexterous hands will be trained as well in the brain large model, or in a separate model dedicated for…

打造餐饮品牌的产品矩阵:美味与策略的完美融合-中小企实战运营和营销工作室博客

打造餐饮品牌的产品矩阵&#xff1a;美味与策略的完美融合-中小企实战运营和营销工作室博客 在竞争激烈的餐饮市场中&#xff0c;打造一个成功的餐饮品牌&#xff0c;关键在于构建一个强大且富有吸引力的产品矩阵。这不仅涉及到研发出令人垂涎欲滴的美味佳肴&#xff0c;更需要…

前端大数据处理 - Web Worker

前言 先了解一个概念&#xff1a;页面假死 浏览器有GUI渲染线程与JS引擎线程&#xff0c;这两个线程是互斥的关系 当js有大量计算时&#xff0c;会造成 UI 阻塞&#xff0c;出现界面卡顿、掉帧等情况&#xff0c;严重时会出现页面卡死的情况&#xff0c;俗称假死 在前端开发…

无缝过渡:将 Ansys 子结构模型转换为 Nastran

了解如何将 Ansys 子结构模型无缝转换为 Nastran&#xff0c;以满足有效载荷动态模型要求 Ansys 子结构模型的优势 Ansys 子结构模型为从事大型装配体结构分析和仿真的工程师和分析师提供了多项优势。 这些模型通过将复杂结构划分为更小、更易于管理的子结构&#xff0c;可以…

C++中string笔记杂谈

string 类库中的size_type是一种怎样的自定义类型 在 C 的 string 类库中&#xff0c;size_type 是一种无符号整数类型&#xff0c;用于表示字符串的大小&#xff08;长度&#xff09;。 它被定义为能够容纳字符串可能的最大长度的无符号整数类型。 比如说&#xff0c;如果一…

【Flink系列】4. Flink运行时架构

4. Flink运行时架构 4.1 系统架构 Flink运行时架构——Standalone会话模式为例 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager是一个Flink集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。也就是说&#xff0c;每个应用都应该被…

AI刷题-饭馆菜品选择问题、构造回文字符串问题

目录 一、饭馆菜品选择问题 问题描述 测试样例 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; 二、构造回文字符串问题 问题描述 测试样例 解题思路&#xff1a; 解题思路 具体步骤 最终代码&#xff1a;…

使用redis-cli命令实现redis crud操作

项目场景&#xff1a; 线上环境上redis中的key影响数据展示&#xff0c;需要删除。但环境特殊没办法通过 redis客户端工具直连。只能使用redis-cli命令来实现。 操作步骤&#xff1a; 1、确定redis安装的服务器&#xff1b; 2、找到redis的安装目录下 ##找到redis安装目…

31.Java Callable 接口与 FutureTask 类

一、Callable 接口 1、概述 目前我们学习了有两种创建线程的方法&#xff0c;一种是通过继承 Thread 类&#xff0c;另一种是 通过实现 Runnable 接口创建线程&#xff0c;但是&#xff0c;Runnable 缺少的一项功能是&#xff0c;当线程 终止时&#xff08;即 run 方法完成时…

Springboot项目Jackson支持多种接收多种时间格式

前言 在springboot项目中经常会使用Jackson框架,当前端给后端传输时间类型时,我们一般需要先配置好时间格式,否则后端无法接收。以下是一些配置方法 统一配置 spring:jackson:time-zone: GMT+8date-format: yyyy-MM-dd HH:mm:ss这种配置就是要求前端统一传输的格式是yyyy-…

讲一下ZooKeeper的持久化机制?

大家好&#xff0c;我是锋哥。今天分享关于【讲一下ZooKeeper的持久化机制&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲一下ZooKeeper的持久化机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务&…

图数据库 | 18、高可用分布式设计(中)

上文我们聊了在设计高性能、高可用图数据库的时候&#xff0c;从单实例、单节点出发&#xff0c;一般有3种架构演进选项&#xff1a;主备高可用&#xff0c;今天我们具体讲讲分布式共识&#xff0c;以及大规模水平分布式。 主备高可用、分布式共识、大规模水平分布式&#xff…