Elasticsearch


1. 了解 Elasticsearch

Elasticsearch 使用 Restful API   高扩展性   高可用性   近实时性   搜索引擎   全文检索


2. 名词定义

节点     集群中的一个服务器就是一个节点 ,节点中存储数据,同时参与集群的索引以及搜索功能

索引     具有相似特征文档的集合   对数据进行索引操作

类型     在索引上的分类   分区

文档     数据 Json格式

分片     将索引上的数据水平拆分   分布在不同节点上

副本     主分片的备份

settings     集群中对索引的定义信息   索引的分片数   副本数

mapping     定义索引字段的存储类型   分词方式   存储信息

analyzer     分词器   分段分词方式的定义   搜索分析时将输入的文本转为一个一个词条流


3. 文档信息操作

  1. 文档介绍
{ 
  "_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",
  }
}
  1. 更新
// 请求格式 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"
    }
  }
}
  1. 删除
// 请求格式 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 使用乐观锁控制版本并发。如果一个低版本文档在高版本文档之后到达,低版本文档会被忽略。保证数据完整性

  1. 6.7版本之前

    内部版本:自己维护 _version 字段自增

    外部版本:在当前文档下,设置 version 和 version_type 手动维护

put book/_doc/1?version=10&version_type=external  
{
  "title":"222"
}
// version_type字段 external external_gt 表示要>当前版本号
// external_gte 表示=当前版本号
  1. 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"]
}
posted @   linsonga  阅读(73)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示