Elasticsearch
1. 了解 Elasticsearch
Elasticsearch 使用 Restful API 高扩展性 高可用性 近实时性 搜索引擎 全文检索
2. 名词定义
节点 集群中的一个服务器就是一个节点 ,节点中存储数据,同时参与集群的索引以及搜索功能
索引 具有相似特征文档的集合 对数据进行索引操作
类型 在索引上的分类 分区
文档 数据 Json格式
分片 将索引上的数据水平拆分 分布在不同节点上
副本 主分片的备份
settings 集群中对索引的定义信息 索引的分片数 副本数
mapping 定义索引字段的存储类型 分词方式 存储信息
analyzer 分词器 分段分词方式的定义 搜索分析时将输入的文本转为一个一个词条流
3. 文档信息操作
- 文档介绍
{
"_index": "eduai_doc", // 索引
"_type": "idea", // 类型
"_id": "1_12483287541", // id 可以不指定id,系统默认生成 需要 post 请求
"_score": 1, // 分数
"_source": { // 结果 各个字段
"doc_id": "12483287541",
"doc_es": 1,
"title": "2021新高考Ⅰ卷数学真题及答案",
"content": "教案,习题,学习资料",
"store_id": "666",
}
}
- 更新
// 请求格式 post {index}/_update/{id}
// pvall 自增1
post book/_update/1
{
"script":{
"source":"ctx._source.pvall+=1", // source 具体执行脚本,ctx 上下文对象,通过 ctx 可以访问到 _source title 字段
}
}
// 添加tags字段
post book/_update/1
{
"script":{
"source":"ctx._source.tags=['php', 'java', 'python']",
}
}
// 向tags数组中增加 c++
post book/_update/1
{
"script":{
"source":"ctx._source.tags.add('c++')",
}
}
// if 语句
post book/_update/1
{
"script":{
"source":"if (ctx._source.pvall instanceof Integer){ctx._source.pvall+=1;}else{ctx._source.pvall = Integer.parseInt(ctx._source.pvall) + 1;}",
}
}
// 根据条件更新
post book/_update_by_query
{
"script":{
"source":"ctx._source.title='哇哈哈哈'", // 将 store_id=666,title 更新为哇哈哈哈
},
"query":{
"term":{
"store_id":"666"
}
}
}
- 删除
// 请求格式 delete {index}/{type}/{id}
// 删除id=1文档
delete book/_doc/1
// 根据条件删除
post book/_delete_by_query
{
"query":{
"trem":{
"title":"666", // 删除 title 为 666 的文档
}
}
}
// 删除索引下所有文档
post book/_delete_by_query
{
"query":{
"match_all":{
}
}
}
4. 版本控制
Elasticsearch 使用乐观锁控制版本并发。如果一个低版本文档在高版本文档之后到达,低版本文档会被忽略。保证数据完整性
-
6.7版本之前
内部版本:自己维护 _version 字段自增
外部版本:在当前文档下,设置 version 和 version_type 手动维护
put book/_doc/1?version=10&version_type=external
{
"title":"222"
}
// version_type字段 external external_gt 表示要>当前版本号
// external_gte 表示=当前版本号
-
6.7版本之后
使用 if_seq_no 和 if_primary_term 两个参数控制
seq_no 为版本号
primary_term 表示文档所在主分片的编号
put book/_doc/2?if_seq_no=5&if_primary_term=1
{
"title":"666"
}
// seq_no 表示当前索引下,当修改索引下任何文档, seq_no 都会自增
5. 倒排索引
通过文档内容的关键字建立索引,在通过索引找到文档ID... 至整个文档
文档id,词频(单词出现的次数评分使用),位置(记录单词在文档中的位置),偏移量(文档)
6. 字段类型
类型 | 格式 | 值 |
---|---|---|
字符串 | text / keyword | text 适用于较长的文本(博客内容 / 新闻内容 / 描述) keyword 适用于较短的字符串(标签/ 邮箱 / 号码) |
数字 | long / integer / byte / double / float | 字段越短,索引和查询效率越高 |
日期 | date | Y-M-D / Y-M-D h:i:s / 时间戳 |
布尔 | boolean | "true" / "false" / true / false 都可 |
二进制 | binary | base64编码字符串,默认不存储,不可搜索 |
范围类型 | integer_range / float_range / long_range / double_range / date_range / ip_range |
插入时设置范围,gt / lt / gte / lte |
数组 | [] | 数组格式 |
对象 | object | json格式 |
嵌套 | nested | 数组中可以包含json对象 |
地理 | geo_point 点,geo_shape 面 | geo_point {'lat':'34.27','lon':'108.94'} / '34.27,108.94' / [108.94,34.27] geo_shape 插入时设置类型 |
ip地址 | ip | |
token_count |
token_count 需要添加分词器 | 根据词语个数查询 |
7. 基本操作
// get 查询
// put 修改,添加
// head 查询文档是否存在
// term 词项查询
// match 全文查询
创建索引 创建 book 索引
put book
修改副本数
put book/_settings
{
"number_of_replicas" : 2
}
添加数据
// _doc 设置为type, 1 设置为 _id
put book/_doc/1
{
"Title":"哈哈哈"
}
关闭索引写权限
// true 关闭 ,false 开启
put book/_settings
{
"blocks.write":"true"
}
关闭索引读权限
put book/_settings
{
"blocks.read":"true"
}
查看多个、所有索引信息
get book,test/_settings
get _all/_settings
删除索引
delete test
打开,关闭索引
post book/_close
post book/_open
复制索引
post _reindex // 只会复制数据,不会复制配置
{
"source":{"index":"book"},
"dest":{"index":"book_new"} // 复制新目标
}
设置索引别名
post _aliases
{
"action":[
{
"add":{"index":"book", "alias":"book_alias"} // add 为添加, remove 为删除
}
]
}
通过id批量获取文档
get blog/_mget
{
"ids":["1", "7", "10"]
}
更新整个文档
put book/_doc/1
{
"title":"666"
}
更新文档指定数据
// post {index}/_update/{id}
post book/_update/1
{
"script":{
"source":"ctx._source.title+=1", // source具体执行脚本,ctx上下文对象,通过ctx可以访问到__source title 字段
"params":{
"title":"666666",
}
}
}
查看文档在哪个分片中
get _cat/shards/book?v
// 通过hash算法,将相同哈希值的文档放在同一个分片中
// shard = hash(routing)%number_of_primary_shards
// 默认将 id 设置为 routing 值(可自定义),通过 hash 函数设置一个数字。然后将数字和分片树取余,结果就是分片位置。
// 保证数据平均分布在分片中,查询时会请求所有分片,后期添加分片不方便
查看分词
// get book_termvectors/{id}
get book/_termvectors/1
{
"fields":["title"]
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律