elasticsearch
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 它是 Elastic Stack 的核心,Elastic Stack 是一个开源工具集合,用于数据接收、存储、分析、可视化。
安装
1.下载地址
2.本地安装
下载elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.6.2-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.6.2-linux-x86_64.tar.gz.sha512
shasum -a 512 -c elasticsearch-8.6.2-linux-x86_64.tar.gz.sha512
tar -xzf elasticsearch-8.6.2-linux-x86_64.tar.gz
cd elasticsearch-8.6.2/
curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.6.2-darwin-x86_64.tar.gz
curl https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.6.2-darwin-x86_64.tar.gz.sha512 | shasum -a 512 -c -
tar -xzf elasticsearch-8.6.2-darwin-x86_64.tar.gz
cd elasticsearch-8.6.2/
下载 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.6.2-windows-x86_64.zip
# 解压zip包并打开
cd C:\elasticsearch-8.6.2
启动elasticsearch:
./bin/elasticsearch
./bin/elasticsearch
.\bin\elasticsearch.bat
3.使用docker 单节点部署
elasticsearch 部署
version: '3'
services:
elasticsearch:
image: elasticsearch:8.6.2
container_name: elasticsearch
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- ./esdata:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
networks:
- elastic
kibana:
image: kibana:8.6.2
container_name: kibana
ports:
- 5601:5601
networks:
- elastic
depends_on:
- elasticsearch
networks:
elastic:
启动
docker-compose up -d
基本概念
文档
Elasticsearch 面向文档性,文档就是所有可搜索数据的最小单位。比如,一篇 PDF 中的内容,一部电影的内容,一首歌等,文档会被序列化成 JSON 格式,保存在 Elasticsearch 中,必不可少的是每个文档都会有自己的唯一标识,可以自己指定,也可以由 Elasticsearch 帮你生成。类似数据库的一行数据。
元数据
{
"_index": "user",
"_type": "_doc",
"_id": "l0D6Umsad123bv1X2",
"_score": 1.2923547,
"_source": {
"user": "mj",
"sex": "男",
"age": "18"
}
}
_index:文档所属的索引名称_type:文档所属的类型名_id:文档的唯一标识_version:文档的版本信息_score:文档的相关性打分_source:文档的原始 JSON 内容
索引
索引 是文档的容器,是一类文档的集合,类似关系数据库中的表,索引体现的是一种逻辑空间的概念,每个索引都应该有自己的 Mapping 定义,用于定义包含文档的字段名和字段类型。其中 Shard(分片)体现的是物理空间的一种概念,就是索引中的数据存放在 Shard 上,因为有集群,要保证高可用,当其中一个机器崩溃中,保存在它上的分片数据也能被正常访问,因此,存在分片副本。
索引 中有两个重要的概念,Mapping 和 Setting。
Mapping定义的是文档字段和字段类型Setting定义的是数据的不同分布
类型
在 7.0 之前,一个 index 可以创建多个类型 Type。之后就只能一个 index 对应一个类型 Type。
节点
一个节点就是一个 Elaseticsearch 实例,本质就是一个 Java 进程。每一个节点启动后,默认就是一个 master eligible 节点。就是具备成为 master 资格的节点,你也可以狠心的指定它没有这个资格(node.master: false), 第一个节点启动后,他就选自己成为 Master 节点类,每一个节点上都保存了集群状态,但是,只有 Master 才能修改集群状态信息。集群状态信息就比如:
- 所有的节点信息
- 所有的索引信息,索引对应的
mapping信息和setting信息 - 分片的路由信息
分片
主分片:用于解决数据的水平扩展问题,通过主分片就数据分布在集群内的不同节点上,主分片在创建索引的时候就指定了,后面就不允许修改,除非重新定义Index副本:用于解决高可用的问题,分片是主分片的拷贝。副本分片数可以动态的调整,增加副本数量可以在一定的程度上提高服务的可用性。关于主分片的理解可以如下图,看是怎样实现高可用的
使用REST API创建索引并设置分片和副本数量
PUT /your_index_name
{
"settings": {
"number_of_shards": 5, // 设置主分片数量
"number_of_replicas": 1 // 设置副本数量
},
"mappings": {
// 索引映射定义
}
}
更新已存在的索引的分片和副本数量
PUT /your_index_name/_settings
{
"settings": {
"number_of_shards": 3, // 新的主分片数量
"number_of_replicas": 2 // 新的副本数量
}
}
倒排索引
什么是倒排索引?有倒排肯定有正排,让我们看看有区别
正排索引:就是文档 ID 到文档内容的索引,简单讲,就是根据 ID 找文档。倒排索引:就是根据文档内容找文档。
倒排索引包含如下信息:
- 单词词典:用于记录所有文档的单词,以及单词到倒排列表的关联关系。
- 倒排列表:记录的是单词对应的文档集合,由倒排索引项组成,其中包含
- 文档 ID
- 单词出现的次数,用于相关性的评分
- 单词出现的位置
- 偏移量,用于记录单词的开始位置和结束位置,用于单词的高亮显示 举例说明什么是正排索引和倒排索引,其中正排索引如下:
| 文档 ID | 文档内容 |
|---|---|
| 1101 | Elasticsearch Study |
| 1102 | Elasticsearch Server |
| 1103 | master Elasticsearch |
讲上例 Elasticsearch 单词修改为倒排索引,如下:
| 文档 ID | 出现次数 | 位置 | 偏移量 |
|---|---|---|---|
| 1101 | 1 | 0 | <0,13> |
| 1102 | 1 | 0 | <0,13> |
| 1103 | 1 | 1 | <7,20> |
Analyzer 分词
Analysis:文本分析,就是将文本转换为单词(term 或者 token)的过程,其中 Analyzer 就是通过 Analysis 实现的,Elasticsearch 给我们内置例很多分词器。
Standard Analyzer:默认的分词器,按照词切分,并作大写转小写处理Simple Analyzer:按照非字母切分(符号被过滤),并作大写转小写处理Stop Anayzer:停用词(the、is)切分,并作大写转小写处理Whitespace Anayzer:空格切分,不做大写转小写处理IK:中文分词器,需要插件安装ICU:国际化的分词器,需要插件安装jieba:时下流行的一个中文分词器
基本操作
查询
URL 查询
GET /user/_search?q=2012&df=title&sort=year:desc&from=0&size=10
{
"profile": true
}
- 使用
q指定查询的字符串 - 使用
df指定查询的字段 - 使用
sort进行排序,使用from和size指定分页 - 使用
profile可以查询查询是如何进行查询的
指定所有字段的泛查询
GET /user/_search?q=2012
{
"profile":"true"
}
指定字段的查询
GET /user/_search?q=title:2012&sort=year:desc&from=0&size=10&timeout=1s
{
"profile":"true"
}
Term 查询
GET /user/_search?q=title:Beautiful Mind
{
"profile":"true"
}
- 上例的
Beautiful和Mind就是两个Term,Term是查询中最小的单位 Term查询是OR的关系,在上例中就是title字段包含Beautiful或者包含Mind都会被检索到
Phrase 查询
GET /user/_search?q=title:"Beautiful Mind"
{
"profile":"true"
}
- 使用引号表示
Phrase查询 Phrase查询表示的不仅是And的关系,即Title字段中不仅要包含Beautiful Mind,而且。顺序还要一致。
分组查询
GET /user/_search?q=title:(Beautiful Mind)
{
"profile":"true"
}
使用中括号表示分组查询,一般使用 Term 查询的时候都会带上分组查询
布尔查询:
- 使用 AND、OR、NOT 或者 ||、&&、!
- 还可以是功能 +(表示 must),使用 -(表示 must_not)
- 需要注意的是必须大写
GET /user/_search?q=title:(Beautiful NOT Mind)
{
"profile":"true"
}
GET /user/_search?q=title:(Beautiful %2BMind)
{
"profile":"true"
}
配置
开启索引和mapping的严格模式
- 限制只有系统级的索引可以自动创建
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index":".security,.kibana*,.monitoring*,.watches,.triggered_watches,.watcher-history*"
}
}
- dynamic 设置为 stict
PUT test_index
{
"mappings": {
"dynamic": "strict"
}
}
使用Flattened类型
- 不管多少层都只会当做keyword处理
PUT test_index
{
"mappings": {
"properties": {
"msg":{
"type": "flattened"
}
}
}
}