分布式搜索--elasticsearch
一、初识 elasticsearch
1. 了解 ES
① elasticsearch 是一款非常强大的开源
搜索引擎,可以帮助我们从海量数据中
快速找到需要的内容
② elasticsearch 结合 kibana、Logstash、
Beats,也就是 elastic stack (ELK),被
广泛应用在日志数据分析、实时监控等
领域
③ elasticsearch 是elastic stack的核心,
负责存储、搜索、分析数据

(2) Lucene 与 elasticsearch 的区别
Lucene 是一个Java语言的搜索引擎类库
Lucene的优势:
① 易扩展
② 高性能 (基于倒排索引)
Lucene的缺点:
① 只限于 Java 语言开发
② 学习曲线陡峭
③ 不支持水平扩展
相比于 lucene,elasticsearch 具备下列
优势:
① 支持分布式,可水平扩展
② 提供 Restful 接口,可被任何语言
调用
2. 倒排索引
传统数据库 (如MySQL) 采用正向索引,
局部搜索会在表上逐条数据进行扫描,
非常的繁琐
elasticsearch 采用倒排索引:
会形成一个新的表,由两部分构成,进
行两次搜索,先搜词条再搜文档
文档 (document):每条数据就是一个文档
词条 (term):文档按照语义分成的词语


倒排索引中包含两部分内容:
词条词典 (Term Dictionary):记录所有词条,
以及词条与倒排列表 (Posting List) 之间的关
系,会给词条创建索引,提高查询和插入效
率
倒排列表 (Posting List):记录词条所在的文
档 id、词条出现频率 、词条在文档中的位置
等信息
文档 id:用于快速获取文档
词条频率 (TF):文档在词条出现的次数,
用于评分
3. es 的一些概念
(1) es 与 mysql 对比

(2) 架构
Mysql:擅长事务类型操作,可以确保
数据的安全和一致性
Elasticsearch:擅长海量数据的搜索、
分析、计算
4. 安装 es、kibana
(1) 部署单点 es
(2) 部署 kibana
kibana 可以提供一个 elasticsearch 的可
视化界面
(3) 安装 IK 分词器
1) 分词器的作用
① 创建倒排索引时对文档分词
② 用户搜索时,对输入的内容分词
2) 默认的分词语法说明:
在 kibana 的 DevTools 中测试:
POST /_analyze
{"analyzer": "standard","text": "床前明月光,疑是地上霜!"
}
① POST:请求方式
② /_analyze:请求路径,这里省略了,
有 kibana 帮我们补充
③ 请求参数,json风格:
analyzer:分词器类型,这里是默
认的 standard 分词器
text:要分词的内容
默认将文字拆除一个字一个字的,对中
文分词很不友好,所以用 IK 分词器
3) ik 分词器包含两种模式:
ik_smart:最少切分,粗粒度
ik_max_word:最细切分,细粒度
一般情况下,为了提高搜索的效果,
需要这两种分词器配合使用,既建
索引时用 ik_max_word 尽可能多的
分词,而搜索时用 ik_smart 尽可能
提高匹配准度,让用户的搜索尽可
能的准确
4) ik 分词器扩展词条
要拓展ik分词器的词库,只需要修改一
个 ik 分词器目录中的 config 目录中的
IkAnalyzer.cfg.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典--><entry key="ext_dict">ext.dic</entry>
</properties>
然后在名为 ext.dic 的文件中,添加想要
拓展的词语即可
5) 停用词条
在 stopword.dic 文件中,添加想要拓展的
词语即可:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典--><entry key="ext_dict">ext.dic</entry><!--用户可以在这里配置自己的扩展停止词字典 *** 添加停用词词典--><entry key="ext_stopwords">stopword.dic</entry>
</properties>
(4) 部署 es 集群
直接使用 docker-compose 来完成
二、索引库操作
1. mapping 映射属性
(1) mapping 是对索引库中文档的约束,常
见的 mapping 属性包括:
① type:字段数据类型,常见的简单类型有:
字符串:text (可分词的文本)、keyword
(精确值,例如:品牌、国家、ip 地址)
数值:long、integer、short、byte、
double、float
布尔:boolean
日期:date
对象:object
② index:是否创建索引,默认为 true
③ analyzer:使用哪种分词器
④ properties:该字段的子字段
2. 索引库的 CRUD
(1) 创建索引库
ES 中通过 Restful 请求操作索引库、
文档,请求内容用 DSL 语句来表示
创建索引库和 mapping 的 DSL 语法如下:
PUT /索引库名称
PUT /索引库名称
{"mappings": {"properties": {"字段名":{"type": "text","analyzer": "ik_smart"},"字段名2":{"type": "keyword","index": "false"},"字段名3":{"properties": {"子字段": {"type": "keyword"}}},// ...略}}
}
(2) 查看索引库
GET /索引库名
(3) 修改索引库
索引库和 mapping 一旦创建无法修改,
但是可以添加新的字段,语法如下:
PUT /索引库名/_mapping
PUT /索引库名/_mapping
{"properties": {"新字段名":{"type": "integer"}}
}
(4) 删除索引库
DELETE /索引库名
三、文档操作
1. 新增文档
POST /索引库名/_doc/文档id
POST /索引库名/_doc/文档id
{"字段1": "值1","字段2": "值2","字段3": {"子属性1": "值3","子属性2": "值4"},// ...
}
2. 查询文档
GET /索引库名/_doc/文档id
3. 删除文档
DELETE /索引库名/_doc/文档id
4. 修改文档
(1) 全量修改
删除旧文档,添加新文档
本质是:根据指定的 id 删除文档,新增
一个相同 id 的文档
PUT /{索引库名}/_doc/文档id
{"字段1": "值1","字段2": "值2",// ... 略
}
(2) 增量修改
修改指定字段值
POST /{索引库名}/_update/文档id
{"doc": {"字段名": "新的值",}
}
5. Dynamic Mapping
我们向 ES 中插入文档时,如果文档中
字段没有对应的 mapping,ES 会帮助
我们字段设置 mapping
| JSON类型 | Elasticsearch类型 |
|---|---|
| 字符串 | ① 日期格式字符串:mapping 为 date 类型 ② 普通字符串:mapping 为 text 类型,并添加 keyword 类型子字段 |
| 布尔值 | boolean |
| 浮点数 | float |
| 整数 | long |
| 对象嵌套 | object,并添加 properties |
| 数组 | 由数组中的第一个非空类型决定 |
| 空值 | 忽略 |
四、RestClient 操作索引库
RESTClient 是一款用于测试各种 Web
服务的插件,它可以向服务器发送各种
HTTP请求(用户也可以自定义请求方式),
并显示服务器响应
本质就是组装 DSL 语句,通过 http请求
发送给 ES
1. 创建索引库
(1) 导入数据库
(2) 分析数据结构
mapping 要考虑的问题:
字段名、数据类型、是否参与搜索、是
否分词,如果分词,分词器是什么
(3) 初始化 JavaRestClient
① 引入依赖
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency><properties><java.version>1.8</java.version><elasticsearch.version>7.12.1</elasticsearch.version>
</properties>
② 初始化
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.150.101:9200")
));
(4) 创建索引库代码
@Testvoid testCreateHotelIndex() throws IOException {// 1.创建Request对象CreateIndexRequest request = new CreateIndexRequest("hotel");// 2.请求参数,MAPPING_TEMPLATE是静态常量字符串,内容是创建索引库的DSL语句 request.source(MAPPING_TEMPLATE, XContentType.JSON);// 3.发起请求, indices 返回的对象中包含索引库操作的所有方法client.indices().create(request, RequestOptions.DEFAULT);
}

2. 删除索引库代码
@Test
void testDeleteHotelIndex() throws IOException {// 1.创建Request对象DeleteIndexRequest request = new DeleteIndexRequest("hotel");// 2.发起请求client.indices().delete(request, RequestOptions.DEFAULT);
}
3. 判断索引库是否存在
@Test
void testExistsHotelIndex() throws IOException {// 1.创建Request对象GetIndexRequest request = new GetIndexRequest("hotel");// 2.发起请求 boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);// 3.输出System.out.println(exists);
}
五、RestClient 操作文档
1. 初始化
public class ElasticsearchDocumentTest { // 客户端private RestHighLevelClient client;@BeforeEachvoid setUp() {client = new RestHighLevelClient(RestClient.builder( HttpHost.create("http://192.168.150.101:9200")));}@AfterEachvoid tearDown() throws IOException {client.close();}
}
2. 新增文档
@Test
void testIndexDocument() throws IOException {// 1.创建request对象IndexRequest request = new IndexRequest("indexName").id("1");// 2.准备JSON文档request.source("{\"name\": \"Jack\", \"age\": 21}", XContentType.JSON);// 3.发送请求client.index(request, RequestOptions.DEFAULT);
}
3. 查询文档
@Test
void testGetDocumentById() throws IOException {// 1.创建request对象GetRequest request = new GetRequest("indexName", "1");// 2.发送请求,得到结果GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.解析结果String json = response.getSourceAsString();System.out.println(json);
}
4. 修改文档
@Test
void testUpdateDocumentById() throws IOException {// 1.创建request对象UpdateRequest request = new UpdateRequest("indexName", "1");// 2.准备参数,每2个参数为一对 key valuerequest.doc("age", 18,"name", "Rose");// 3.更新文档client.update(request, RequestOptions.DEFAULT);
}
5. 删除文档
@Test
void testDeleteDocumentById() throws IOException {// 1.创建request对象DeleteRequest request = new DeleteRequest("indexName", "1");// 2.删除文档 client.delete(request, RequestOptions.DEFAULT);
}
6. 批量导入文档
@Test
void testBulk() throws IOException {// 1.创建Bulk请求BulkRequest request = new BulkRequest();// 2.添加要批量提交的请求:这里添加了两个新增文档的请求request.add(new IndexRequest("hotel").id("101").source("json source", XContentType.JSON));request.add(new IndexRequest("hotel").id("102").source("json source2", XContentType.JSON));// 3.发起bulk请求client.bulk(request, RequestOptions.DEFAULT);
}
相关文章:
分布式搜索--elasticsearch
一、初识 elasticsearch 1. 了解 ES ① elasticsearch 是一款非常强大的开源 搜索引擎,可以帮助我们从海量数据中 快速找到需要的内容 ② elasticsearch 结合 kibana、Logstash、 Beats,也就是 elastic stack (ELK),被 广泛应用在日志数据分…...
UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(一)
《Electric Dreams》项目中提供了一些自定义节点和子图(文件位置:“/Content/PCG/Assets/PCGCustomNodes”),这些节点和子图在《Electric Dreams》被广泛使用,对于理解《Electric Dreams》非常重要,而且它们可以直接移…...
500万PV的网站需要多少台服务器?
1. 衡量业务量的指标 衡量业务量的指标项有很多,比如,常见Web类应用中的PV、UV、IP。而比较贴近业务的指标项就是大家通常所说的业务用户数。但这个用户数比较笼统,其实和真实访问量有比较大的差距,所以为了更贴近实际业务量及压力…...
拖动排序功能的实现 - 使用HTML、CSS和JavaScript
引言 在现代Web应用程序中,拖动排序是一种常见的用户界面交互方式,它允许用户通过拖动元素来重新排列列表或项目的顺序。本文将介绍如何使用HTML、CSS和JavaScript来实现手动拖动排序功能。 一、HTML结构 首先,我们需要定义一个列表&#…...
【STM32MP135 - ST官方源码移植】第三章:OPTEE源码移植教程
STM32MP135 OPTEE源码移植教程 一、解压optee的源码压缩包二、拷贝新的设备树文件三、修改Makefile.sdk文件(1)增加stm32mp135d-atk设备树编译(2)修改编译器为arm-none-linux-gnueabihf(3)使用buildroot工具…...
云主机安全-私有密钥安全认证
场景描述 云主机凭借其性价比高、生配扩容便利、运维便捷、稳定性高等优势深受用户青睐,越来越多的企业开始租用云主机,将自己的服务器、业务系统等搭建或存储到云主机上。 用户痛点 用户租用或托管的云主机,运维端口(远程桌面&…...
《Web安全基础》02. 信息收集
web 1:CDN 绕过1.1:判断是否有 CDN 服务1.2:常见绕过方法1.3:相关资源 2:网站架构3:WAF4:APP 及其他资产5:资产监控 本系列侧重方法论,各工具只是实现目标的载体。 命令与…...
ffmpeg根据原始视频的帧率进行提取视频帧
直接上代码,自己编写的。。。有问题可以提 安装教程看这个:https://blog.csdn.net/m0_61497715/article/details/129817641 去官网下个最新的ffmpeg,解压到随便的目录,上级目录最好不要用中文; 然后去设置环境变量&am…...
从零搭建秒杀服务
1. 前言 目的:该项目只用于技术交流,不用于过多商业用途。 适用:可用于简历亮点、毕业答辩等。 2. 项目成果 2.1 秒杀主页 包含5个功能点: ①、Product Name:秒杀商品名称 ②、Product Image:秒杀商…...
数据库应用:CentOS 7离线安装PostgreSQL
目录 一、理论 1.PostgreSQL 2.PostgreSQL离线安装 3.PostgreSQL初始化 4.PostgreSQL登录操作 二、实验 1.CentOS 7离线安装PostgreSQL 2.登录PostgreSQL 3.Navicat连接PostgreSQL 三、总结 一、理论 1.PostgreSQL (1)简介 PostgreSQL 是一个…...
【PHP面试题42】Laravel依赖注入实现的原理是怎么样的
文章目录 一、前言二、什么是依赖注入三、Laravel依赖注入的实现原理3.1 Laravel依赖注入的实现原理:3.2 Laravel依赖注入的代码示例 四、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题,对标…...
如何在本地组策略编辑器中启用或禁用剪贴板历史记录
复制粘贴是我们大家都会做的事情,可能一天要做多次。但是,如果你需要一次又一次地复制同样的几件事,你该怎么办?如何在设备上复制内容? 从Windows 10版本17666开始,微软正在解决这一问题,并将剪贴板提升到一个新的水平,只需按下Win+V,你将获得全新的剪贴板体验。 你…...
如何与ChatGPT愉快地聊天
原文链接:https://mp.weixin.qq.com/s/ui-O4CnT_W51_zqW4krtcQ 人工智能的发展已经走到了一个新的阶段,在这个阶段,人工智能可以像人一样与我们进行深度的文本交互。其中,OpenAI的ChatGPT是一个具有代表性的模型。然而࿰…...
使用Gradio库进行交互式数据可视化:Timeseries模块介绍
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
CONTAINER = ALL是ALTER USER语句的默认值
连接到root时查看有关root,CDB和PDB的数据 当公用用户执行查询时,可以限制X $表和V $,GV $和CDB_ *视图的视图信息。X$表和这些视图包含有关应用程序root及其关联应用程序PDB的信息,或者如果连接到CDB root,则是整个C…...
华为发布大模型时代AI存储新品
7月14日,华为发布大模型时代AI存储新品,为基础模型训练、行业模型训练,细分场景模型训练推理提供存储最优解,释放AI新动能。 企业在开发及实施大模型应用过程中,面临四大挑战: 首先,数据准备时…...
5G网络功能介绍
5G系统架构由以下网络功能(NF)组成 -身份验证服务器功能(AUSF)。 -接入和移动性管理功能(AMF)。 -数据网络(DN),例如运营商服务、互联网接入或第三方服务。 -非结构化数据存储功能(UDSF)。 -网络曝光功能(NEF)。 -网络存储库功能(NRF)。 -网络切片特定身…...
笙默考试管理系统-MyTestMean(13)
笙默考试管理系统-MyTestMean(13) 目录 一、 笙默考试管理系统-MyTestMean 二、 笙默考试管理系统-MyTestMean 三、 笙默考试管理系统-MyTestMean 四、 笙默考试管理系统-MyTestMean 五、 笙默考试管理系统-MyTestMean 笙默考试管理系统-MyTes…...
Tomcat之高可用配置
Nginx搭配Tomcat实现负载均衡 传统模型下,一个项目部署在一台tomcat上,这个时候,假如tomcat因为服务器资源不够,突然挂机了,那么整个项目就无法使用。 Nginx就可以避免单台服务如果挂机,依然能保证服务正…...
IDEA中springboot的热加载thymeleaf静态html页面
1.首先加入开发工具依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency> 2.其次在build maven插件中开启热部署 <bu…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
