一、ElasticSearch概述
1. 概念阐述
- ES(ElasticSearch)是一款非常强大的开源搜索引擎;
- ES是分布式实时搜索,实时分析,支持PB级数据的实时存储引擎,可以帮助我们从海量数据中快速的找到相应的内容;
- 除了搜索,结合Kibana Logstash Beats,Elastic stack还被广泛使用在大数据、近实时分析的领域,包括日志分析、指标监控、信息安全等多个领域。可以帮助我们探索海量的、结构化的、非结构化的数据,按需创建可视化报表、对监控数据设置报警阈值、甚至使用机器学习的技术自动识别异常和状况,及时发出警报;
- ES是基于Java语言开发搜索引擎类库;
- 基于Apache Lucene开源搜索引擎,Lucene是目前工人性能最好、最先进的、功能最全的搜索引擎;
- ES使用Lucene作为核心来实现所有索引和搜索的功能,通过简单的RESTfulAPI来隐藏Lucene的复杂性,从而让全文检索变得简单。(从10亿的数据检出一条只需1-2秒)
2 功能特点
2.1 功能
- 海量数据的分布式存储及集群管理能力:服务于数据的高可用,水平扩展;
- 近实时搜索,性能卓越:结构化 / 全文 / 地理位置 / 自动完成;
- 海量数据的近实时分析: 指聚合功能;
2.2 特点
- 集群规模可以从单个节点扩展至数百个节点
- 高可用 & 水平扩展:从服务和数据两个维度
- 支持不同的节点类型:支持Hot & Warm架构
- 支持多种方式集成接入
- 近实时(Near Real Time)
- 分布式存储/搜索/分析
3 版本与升级
3.1 版本发布
- 0.4: 2010年2月第一次发布
- 1.0: 2014年1月
- 2.X: 2015年5月
- 5.X: 2016年10月
- 6.X: 2017年10月
- 7.X: 2019年4月
Elastic 产品生命周期结束 (EOL) 日期:https://www.elastic.co/cn/support/eol
3.2 版本特性
-
5.X
- Lucene 6.x, 性能提升,默认打分机制从TF-IDF改为BM25
- 支持Ingest节点/ Painless Scripting / Completion suggested支持/原生的Java REST客户端
- Type标记成deprecated, 支持了Keyword的类型
- 性能优化
- 内部引擎移除了避免同一文档并发更新的竞争锁,带来15% - 20%的性能提升
- Instant aggregation, 支持分片上聚合的缓存
- 新增了Profile API
-
6.X
- Lucene 7.x
- 新功能
- 跨集群复制(CCR)
- 索引生命周期管理
- SQL的支持
- 更友好的的升级及 数据迁移
- 在主要版本之间的迁移更为简化,体验升级
- 全新的基于操作的数据复制框架,可加快恢复数据
- 性能优化
- 有效存储稀疏字段的新方法,降低了存储成本
- 在索引时进行排序,可加快排序的查询性能
-
7.X
- Lucene 8.0
- 重大改进-正式废除单个索引下多Type的支持
- 7.1开始,Security 功能免费使用
- ECK - Elasticseach Operator on Kubernetes
- 新功能
- New Cluster coordination
- Feature-Complete High L evel REST Client
- Script Score Query
- 性能优化
- 默认的Primary Shard数从5改为1, 避免Over Sharding
- 性能优化,更快的Top K
- Lucene 8.0
4 ElasticSearch生态圈
4.1 生态圈
4.2 Logstash特性
-
实时解析和转换数据
- 从IP地址破译出地理坐标
- 将PII 数据匿名化,完全排除敏感字段
-
可扩展
- 200多个插件(日 志/数据库/Arcsigh/Netflow)
-
可靠性安全性
- Logstash会通过持久化队列来保证至少将运行中的事件送达一次
- 数据传输加密
监控
4.3 kibana特性
4.4 Beats - 轻量数据采集器
ELK应用场景
-
应用场景
- 网站搜索/垂直搜索/代码搜索
- 日志管理与分析/安全指标监控/应用性能监控/WEB抓取舆情分
-
应用公司
指标日志分析
二、ElasticSearch安装和简单配置
1 本地部署 & 水平扩展
- 开发环境部署
- 单节点,一个节点承担多种角色
-
单机部署多个节点
2 Java环境依赖
- 运行 Elasticsearch,需安装并配置JDK
- 设置$JAVA_ HOME
- 各个版本对 Java的依赖
- Elasticsearch 5需要Java 8以上的版本
- Elasticsearch 从6.5开始支持Java 11
- 7.0开始,内置了Java环境https://www.elastic.co/support/matrix#matrix_jvm
3 下载和安装启动
3.1 下载
- 下载二进制文件:https://www.elastic.co/downloads/elasticsearch
- 支持 Docker 本地运行
- Helm chart for kubernetes
- Puppet Module
3.2 文件目录结构
目录 | 配置文件 | 描述 |
---|---|---|
bin | 脚本文件,包括启动elasticsearch,安装插件。运行统计数据等 | |
config | elasticsearch.yml | 集群配置文件,user, role based相关配置 |
JDK | Java运行坏境 | |
data | path.data | 数据文件 |
lib | Java类库 | |
logs | path.log | 日志文件 |
modules | 包含所有ES模块 | |
plugins | 包含所有已安装插件 |
3.3 JVM 配置
- 修改 JVM - config/ jvm.options
- 7.1 下载的默认设置是1 GB
- 配置的建议
- Xmx 和Xms设置成一样
- Xmx 不要超过机器内存的50%
- 不要超过 30GBhttps://www.elastic.co/blog/a-heap-of-trouble
3.4 服务启动
- 启动命令
elasticsearch-7.1.0 bin/elasticsearch
3.5 运行多实例
bin/ elasticsearch - E node.name=node1 -E cluster.name=elasticsearch -E path.data=node1_data -d
bin/ elasticsearch - E node.name=node1 -E cluster.name=elasticsearch -E path.data=node1_data -d
bin/ elasticsearch -E node.name=node3 -E cluster.name=elasticsearch -E path.data=node3_data -d
3.6 插件安装与查看
-
命令
- 安装:
bin/Elasticsearch-plugin install analysis-icu
- 查看:
bin/Elasticsearch-plugin list
- 安装:
3.7 常用插件
- Discovery Plugin
- Analysis Plugin
- Security Plugin
- Management Plugin
- Ingest Plugin
- Mapper Plugin
- Backup Plugin
https://www.elastic.co/guide/en/elasticsearch/plugins/current/intro.html
三、基本概念
1. 文档(Document)
1.1 文档描述
-
Elasticsearch是面向文档的,文档是所有可搜索数据的最小单位
- 日志文件中的日志项
- 一本电影的具体信息/一张唱片的详细信息
- MP3播放器里的一首歌/一篇PDF文档中的具体内容
-
文档会被序列化成JSON格式,保存在Elasticsearch中
- JSON对象由字段组成
- 每个字段都有对应的字段类型(字符串 /数值/布尔/日期/二进制/范围类型)
-
每个文档都有一个Unique ID
- 你可以自己指定 ID
- 或者通过Elasticsearch自动生成
- 文档默认通过Unique ID Routing
1.2 文档元数据
- 元数据,用于标注文档的相关信息
- _index -文档所属的索引名
- _type -文档所属的类型名
- _id- 文档唯一ID
- _source: 文档的原始JSON数据
- _all: 整合所有字段内容到该字段,已被废除
- _version: 文档的版本信息
-
_score: 相关性打分
2. 索引(index)
2.1 概念
-
Index -索引是文档的容器,是一类文档的结合
- Index体现了逻辑空间的概念:每个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型
- Shard体现了物理空间的概念:索引中的数据分散在Shard上
-
索引的Mapping与Settings
- Mappirg定义文档字段的类型
-
Setting定义不同的数据分布
2.2 索引的不同语意
- 名词:一个Elasticsearch 集群中,可以创建很多个不同的索引
- 动词:保存一个文档到Elasticsearch的过程也叫索引(indexing)
- ES中,创建一个倒排索引的过程
-
名词: 一个B树索引,一个倒排索引
3. type
- 在7.0之前,一个Index可以设置多个Types
- 6.0开始,Type 已经被Deprecated。7.0 开始, 一个索引只能创建一个Type “_doc”
4. 抽象类比
- 在7.0之前,一个Index可以设置多个Types
- 目前Type 已经被Deprecated, 7.0开始,一个索引只能创建一个Type “_doc”
- 传统关系型数据库和Elasticsearch 的区别
- 0 Elasticsearch- Schemaless /相关性/高性能全文检索
-
RDMS -事务性/ Join
3. REST API
4. 分布式系统的高可用性与扩展性
- 高可用性:
- 服务可用性 - 允许有节点停止服务
- 数据可用性 - 部分节点丢失,不会丢失数据
- 扩展性
- 请求量提升/数据的不断增长(将数据均匀分布到所有节点上)
5. Elasticsearch分布式特性
-
Elasticsearch 的分布式架构的好处
- 存储的水平扩容
- 提高系统的可用性,部分节点停止服务,整个集群的服务不受影响
-
Elasticsearch 的分布式架构
- 不同的集 群通过不同的名字来区分,默认名字“elasticsearch”
- 通过配置文件修改,或者在命令行中-E cluster.name=elasticsearch进行设定
- 一个集群可以有一个或者多个节点
6. 节点
6.1 概念
-
节点是一个Elasticsearch的实例
- 本质上就是一个JAVA进程
- 一台机器上可以运行多个Elasticsearch进程,但是生产环境一般建议一台机器上只运行一个Elasticsearch实例
每一个节点都有名字,通过配置文件配置,或者启动时候-E node.name=node1指定
每一个节点在启动之后,会分配一个UID,保存在data目录下
6.2 节点类型
-
Master-eligible nodes和Master Node
-
每个节点启动后,默认就是一个Master eligible节点
- 可以设置node.master: false禁止
Master- eligible节点可以参加选主流程,成为Master节点
当第一个节点启动时候,它会将自己选举成Master节点
-
每个节点上都保存了集群的状态,只有Master节点才能修改集群的状态信息
-
集群状态(Cluster State),维护了一个集群中,必要的信息
- 所有的节点信息
- 所有的索引和其相关的Mapping与Setting 信息
- 分片的路由信息
任意节点都能修改信息会导致数据的不一致性
-
-
-
Data Node & Coordinating Node
- Data Node
- 可以保存数据的节点,叫做Data Node。负责保存分片数据。在数据扩展上起到了至关重要的作用
- Coordinating Node
- 负责接受Client的请求, 将请求分发到合适的节点,最终把结果汇集到一起
- 每个节 点默认都起到了Coordinating Node的职责
- Data Node
-
其他的节点类型
-
Hot & Warm Node
- 不同硬件配置的 Data Node,用来实现Hot & Warm架构,降低集群部署的成本
-
Machine L earning Node
- 负责跑机器学习的Job,用来做异常检测
-
Tribe Node
- (5.3开始使用Cross Cluster Serarch) Tribe Node连接到不同的Elasticsearch集群,并且支持将这些集群当成一个单独的集群处理
-
6.3 配置节点类型
- 开发环境中一个节点可以承担多种角色.
- 生产环境中,应该设置单一的角色的节点(dedicated node)
节点类型 | 配置参数 | 默认值 |
---|---|---|
maste eligible | node.master | true |
data | node.data | true |
ingest | node.ingest | true |
coordinating only | 无 | 每个节点默认都是coordinating节点。设置其他类型全部为false, |
machine learning | node.ml | true (需enable x-pack) |
6.4 Maste Eligible Nodes & 选主过程
互相Ping对方,Node id 低的会成为被选举的节点
其他节点会加入集群,但是不承担Master节点的角色,一旦发现被选中的主节点丢失,就会选出新的Master节点
一个集群,支持配置多个Master Eligible 节点。这些节点可以在必要时(如Mast现故障,网络故障时)参与选主流程,成为Master节点
-
每个节点启动后, 默认就是一个Master eligible节点
- 可以设置node.master: false禁止
当集群内第一个 Master eligible 节点启动时候,它会将自己选举成Master节点
![ Maste Eligible Nodes & 选主过程](https://upload-images.jianshu.io/upload_images/18485892-3bffc0a821162fed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/720)
6.5 脑裂问题
-
Split- Brain,分布式系统的经典网络问题,当出现网络问题,一个节点和其他节点无法连接
- Node2和Node3会重新选举Master
- Node 1自己还是作为Master,组成一个集群,同时更新Cluster State
- 导致2 个master,维护不同的cluster state。当网络恢复时,无法选择正确恢复
6.6 如何避免脑裂问题
-
限定-个选举条件,设置quorum(仲裁),只有在Master eligible节点数大于quorum时,才能进行选举
- Quorum= (master节点总数/2) + 1
- 当3个master eligible 时,设置discovery.zen.minimum. master _nodes为2,即可避免脑裂
-
从7.0开始,无需这个配置
- 移除 minimum_ master. nodes参数,让Elasticsearch自 己选择可以形成仲裁的节点。
- 典型的主 节点选举现在只需要很短的时间就可以完成。集群的伸缩变得更安全、更容易,并且可能造成丢失数据的系统配置选项更少了。
- 节点更清楚地记录它们的状态,有助于诊断为什么它们不能加入集群或为什么无法选举出主节点
7 分片
7.1 分片(Primary Shard & Replica Shard)
-
主分片,用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上
- 一个分片是一个运行的L ucene的实例
- 主分片数在索引创建时指定,后续不允许修改,除非Reindex
-
副本,用以解决数据高可用的问题。分片是主分片的拷贝
- 副本分片数,可以动态题调整
- 增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)
7.2 分片的设定
- 对于生产环境中分片的设定,需要提前做好容量规划
-
分片数设置过小
- 导致后续无法增加节 点实现水品扩展.
- 单个分片的数据量太大,导致数据重新分配耗时
-
o分片数设置过大,7.0 开始,默认主分片设置成1,解决了over- -sharding的问题
- 影响搜索结果的相关性打分,影响统计结果的准确性
- 单个节点上过多的分片,会导致资源浪费,同时也会影响性能
-
7.3 分片的健康状态
GET_ cluster/health
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 2,
"number_of_.data_nodes": 2,
"active_primary_.shards": 37,
"active_shards": 70,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting__in_queue_millis": 0,
"active_shards_percent_as_number": 100
}
- Green - 主分片与副本都正常分配
- Yellow - 主分片全部正常分配,有副本分片
- Red - 有主分片未能分配
- 例如,当服务器的磁盘容量超过85%时,去创建了一个新的索引
7.4 文档存储在分片上
- 文档会存储在具体的某个主分片和副本分片上:例如文档1, 会存储在PO和RO分片上
- 文档到分片的映射算法
- 确保文档能均匀分布在所用分片上,充分利用硬件资源,避免部分机器空闲,部分机器繁忙
- 潜在的算法
- 随机/ Round Robin。当查询文档1,分片数很多,需要多次查询才可能查到文档1
- 维护文档到分 片的映射关系,当文档数据量大的时候,维护成本高
- 实时计算,通过文档1,自动算出,需要去那个分片上获取文档
-
文档分片路由算法
shard = hash( routing) % number_of_primary_shards
- Hash算法确保文档均匀分散到分片中
- 默认的_ routing值是文档id
- 可以自行制定routing数值, 例如用相同国家的商品,都分配到指定的shard
- 设置Index Settings后,Primary 数,不能随意修改的根本原因
PUT posts/. doc/100?routing=bigdata
四、文档索引
1. 正排索引和倒排索引
1.1 正排
- 书本目录页
1.2 倒排
书本最后的注释索引页
文档内容做拆分
-
统计单个文本在文档内容中出现的次数和位置
2. 倒排索引核心组成
<u>倒排索引包含两个部分
</u>
- 单词词典(Term Dictionary),记录所有文档的单词,记录单词到倒排列表的关联关系
- 单词词典一般比较大,可以通过B +树或哈希拉链法实现,以满足高性能的插入与查询
- 倒排列表(Posting List)-记录了单词对应的文档结合,由倒排索引项组成
- 倒排索引项 (Posting)
- 文档ID
- 词频TF-该单词在文档中出现的次数,用于相关性评分
- 位置(Position) - 单词在文档中分词的位置。用于语句搜索(phrase query)
- 偏移(Offset) -记录单词的开始结束位置,实现高亮显示
- 倒排索引项 (Posting)
3. ElasticSearch的倒排索引
Elasticsearch 的JSON文档中的每个字段,都有自己的倒排索引
-
可以指定对某 些字段不做索引
- 优点:节省存储空间
- 缺点:字段无法被搜索
-
文档中Elasticsearch倒排索引
4. 倒排索引不可变性
- 倒排索引采用Immutable Design, -旦生成,不可更改
- 不可变性, 带来了的好处如下:
- 不可变性, 带来了的好处如下:
- 一 旦读入内核的文件系统缓存,便留在哪里。只要文件系统存有足够的空间,大部分请求就会直接请求内存,不会命中磁盘,提升了很大的性能
- 缓存容 易生成和维护/数据可以被压缩
- 不可变更性, 带来了的挑战:如果需要让一个新的文档可以被搜索,需要重建整个索引
五、 文档操作
1. CURD介绍
1.1 概述
操作 | 命令 |
---|---|
Index | PUT my_index/Idoc/1 {“user"”:”mike”,“comment”:"You know, for search”} |
Create | PUT my_index/_create/1 {“user”:”mike' ,“comment”:"You know, for search"} |
Create | POST my_index/_doc {“user”:" mike”“comment":"You know, for search"} |
Read | GET my_ index/_doc/1 |
Update | POST my_index/_update/1 {“doc”:{“user” :”mike".“comment”:" You know,Elasticsearch"} |
Delete | DEL ETE my_ index/_ _doc/1 |
1.2 Type
- Type名,约定都用_doc
1.3 Create
<u>(PUT user/create/1 {"key":"value"})
</u>
- 如果ID已经存在,会失败
- 支持自动生成文档ld和指定文档Id两种方式
- 通过调用“ post /users/_doc'
- 系统会自动生成document ld
- 使用HTTP PUT user/_ create/1 创建时,URI中显示指定 _create, 此时如果该id的文档已经存在,操作失败
- 支持自动生成文档ld和指定文档Id两种方式
1.4 Get
<u>(GET user/_doc/1
</u>
-
找到文档, 返回HTTP 200
- 0文档元信息
_index/_type/
版本信息,同一个Id的文档,即使被删除,Version号也会不断增加
_source 中默认包含了文档的所有原始信息
找不到文档,返回HTTP 404
1.5 Index
<u>(PUT user/_doc/1 {"key":"value"})
</u>
- 如果ID不存在,创建新的文档。否则,先删除现有的文档,再创建新的文档,版本会增加
1.6 Update
<u>(POST user/update/1 {"_doc":{"key":"new value"}})
</u>
- 文档必须已经存在,更新只会对相应字段做增量修改
- Post方法/ Payload需要包含在“doc” 中
2. Bulk API
2.1 概述
支持在一次API调用中,对不同的索引进行操作
-
支持四种类型操作
- Index
- Create
- Update
- Delete
可以再URI中指定Index,也可以在请求的Payload中进行
操作中单条操作失败,并不会影响其他操作
返回结果包括了每一条操作执行的结果(各操作间互不影响)
3. mget (批量读取)
批量操作,减少网络连接产生的开销,提供性能
- request:
<u>GET _mget
</u>
{
"docs": [
{
"_index": "user",
"_id": 1
},
{
"_index": "user",
"_id": 2
}
]
}
- response:
{
"doc": [
{
"index": "user",
" type": " doc",
"id": 1,
"version": 4,
"_seq_no": 3,
"primary. _term": 1,
"found": true,
"source": [
{
"key": "value",
"keys": [
"value",
"value",
"value"
]
}
]
},
{
"index": "user",
" type": " doc",
"id": 2,
"version": 4,
"_seq_no": 3,
"primary. _term": 1,
"found": true,
"source": [
{
"key": "value",
"keys": [
"value",
"value",
"value"
]
}
]
}
]
}
4. msearch(批量查询)
POST users/_msearch
{"query" : "match_all" : {}}
{"query" : "match_all" : {}}
{"index" : "twitter2"}
{"query" : "match_all" : {}}
5. 指定查询的索引
语法 | 范围 |
---|---|
/_search |
集群上所有的索引 |
/index1/_search |
index1 |
/indext,index2/_search |
index1和index2 |
/index*/_search |
以index开头的索引 |
6. 常见错误返回
问题 | 原因 |
---|---|
无法连接 | 网络故障或集群挂了 |
连接无法关闭 | 网络故障或节点出错 |
429 | 集群过于繁忙 |
4xx | 请求体格式有错 |
500 | 集群内部错误 |
六、文档分词
1. Analysis与Analyzer
- Analysis -文本分析是把全文本转换- -系列单词(term / token)的过程,也叫分词
- Analysis 是通过Analyzer(分词器)来实现的
- 可使 用Elasticsearch内置的分析器i或者按需定制化分析器
- 除了在数据写入时转换词条,匹配Query语句时候也需要用相同的分析器对查询语句进行分析
[图片上传失败...(image-b77b26-1595398460324)]
2. Analyzer的组成
-
分词器是专门处理分词的组件,Analyzer 由三部分组成
- Character Filters (针对 原始文本处理,例如去除html)
- Tokenizer (按照规则切分为单词) /
-
Token Filter (将切分的的单词进行加工,小写,删除stopwords,增加同义词)
3. ElasticSearch内置分词器
- Standard Analyzer -默认分词器,按词切分,小写处理,
- Simple Analyzer一按照非字母切分(符 号被过滤) ,小写处理
- Stop Analyzer一小写处理,停用词过滤(the, a, is)
- Whitespace Analyzer -按照空格切分,不转小写
- Keyword Analyzer - -不分词,直接将输入当作输出
- Patter Analyzer一正则表达式,默认\W+ (非字符分隔)
- Language一提供了30多种常见语言的分词器
- Customer Analyzer自定义分词器
4. 分词器示列
4.1 Standard Analyzer
默认分词器
按词拆分
小写处理
4.2 Simple Analyzer
按照非字母切分,非字母的都被去除
小写处理
4.3 Whitepace Analyzer
- 按空格拆分
4.4 Stop Analyzer
相比与Simple Analyzer
-
多了Stop Analyzer
- 会把the、a、is等修饰词语去掉
4.4 Pattern Analyzer
通过正则表达式进行分词
默认是\W+,非字符的符号进行分割
七、配置属性
1. index属性
属性 | 缺省值 | 描述 |
---|---|---|
cluster.name | federated_cluster | Elasticsearch 集群名称。使用集群可将单独 Process Federation Server 绑定到单个分布式系统中。参与集群的所有服务器都必须具有相同的集群名称。 |
index.number_of_shards | 1 | 设置默认索引分片个数,默认为5片(7.x以后默认1个分片 |
index.number_of_replicas | 1 | 设置默认索引副本个数,默认为1个副本 |
indices.recovery.max_size_per_sec | 0 | 设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制 |
indices.recovery.concurrent_streams | 5 | 设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5 |
discovery.zen.minimum_master_nodes | 1 | 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。 |
discovery.zen.minimum_master_nodes | 1 | 指示某个集群定额所需的 Process Federation Server 的数量。缺省值为 1 表示单服务器环境。对于生产环境,请将该值设置为组成定额所需的 Process Federation Server 的数量。例如,如果在集群中总计有三个 Process Federation Server,请将该值设置为“2”,如果在集群中总计有五个 Process Federation Server,请将该值设置为“3”。有关更多信息,请参阅 Elasticsearch 文档。 |
discovery.zen.ping.multicast.enabled | false | 通过发送节点所接收和响应的一个或多个多点广播请求来提供对其他 Elasticsearch 服务节点的多点广播 ping 发现功能。有关更多信息,请参阅 Elasticsearch 文档。 |
discovery.zen.ping.unicasts.hosts | localhost | 提供其他 Elasticsearch 服务节点的单点广播发现功能。配置集群中基于主机 TCP 端口的其他 Elasticsearch 服务的逗号分隔列表。 |
discovery.zen.ping.timeout | 3s | Elastic 搜索节点等待加入 Elasticsearch 集群的时间。 |
2. Mapping支持的属性
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-params.html
属性 | 默认 | 描述 |
---|---|---|
enabled | true | 仅存储、不做搜索和聚合分析 |
index | true | 是否构建倒排索引(即是否分词,设置false,字段将不会被索引) |
index_option | 分词字段默认是positions,其他默认时doc | 存储倒排索引的哪些信息(1. docs:索引文档号;2:freqs:文档号+词频;3. positions:文档号+词频+位置,通常用来距离查询);4. offsets:文档号+词频+位置+偏移量,通常被使用在高亮字段 |
norms | false | 是否归一化相关参数、如果字段仅用于过滤和聚合分析、可关闭分词字段默认配置,不分词字段:默认{“enable”: false},存储长度因子和索引时boost,建议对需要参加评分字段使用,会额外增加内存消耗 |
doc_value | true | 是否开启doc_value,用户聚合和排序分析对not_analyzed字段,默认都是开启,分词字段不能使用,对排序和聚合能提升较大性能,节约内存 |
fielddata | "fielddata": {"format": "disabled"} |
是否为text类型启动fielddata,实现排序和聚合分析针对分词字段,参与排序或聚合时能提高性能,不分词字段统一建议使用doc_value |
dynamic |
true | 控制mapping的自动更新 |
analyzer | standard analyzer | 指定分词器 |
fields | 可以对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词 | |
ignore_above |
"ignore_above": 100 | 超过100个字符的文本,将会被忽略,不被索引 |
null_value |
设置一些缺失字段的初始化,只有string可以使用,分词字段的null值也会被分词("null_value": "NULL" ) |
3 字段类型
31 字段类型概述
一级分类 | 二级分类 | 具体类型 |
---|---|---|
核心类型 | 字符串类型 | string, text, keyword |
h | 整数类型 | integer, long, short, byte |
h | 浮点类型 | double, float,half float,scaled, float |
h | 逻辑类型 | boolean |
h | 日期类型 | date |
h | 范围类型 | range |
h | 二进制类型 | binary |
复合类型 | 数组类型 | array |
f | 对象类型 | object |
f | 嵌套类型 | nested |
地理类型 | 地理坐标类型 | geo_point |
d | 地理地图 | geo_shape |
特殊类型 | IP类型 | ip |
t | 范围类型 | completion |
t | 令牌计数类型 | token_count |
t | 附件类型 | attachment |
t | 抽取类型 | percolator |
3.2 字符串类型
- 字符串类型
- string类型: 在ElasticSearch 旧版本中使用较多,
从ElasticSearch 5.x开始不再支持string,由text和keyword类型替代
- keyword类型:适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤(比如查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能通过精确值搜索到;
- text 类型:当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。
- string类型: 在ElasticSearch 旧版本中使用较多,
八、SDK应用
1. SDK集成
1.1 Maven依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
1.2 SpringBoot依赖
- SpringBoot配置文件中需要更新默认版本号
<properties>
<elasticsearch.version>7.6.2</elasticsearch.version>
</properties>
1.3 初始化客户端
@Beanpublic RestHighLevelClient restHighLevelClient() {
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
return restHighLevelClient;
}
2. 常用API
- indices
- index
- delete
- search
- update
- bulk
2.1 es索引常用API
<u>RestHighLevelClient.indices()
</u>
方法 | 参数 | 描述 |
---|---|---|
create | CreateIndexRequest | Creates an index using the Create Index API. |
createAsync | CreateIndexRequest | Asynchronously creates an index using the Create Index API. |
delete | DeleteIndexRequest | Deletes an index using the Delete Index API. |
deleteAsync | DeleteIndexRequest | Asynchronously deletes an index using the Delete Index API. |
open | OpenIndexRequest | Opens an index using the Open Index API. |
openAsync | OpenIndexRequest | Asynchronously opens an index using the Open Index API. |
close | CloseIndexRequest | Closes an index using the Close Index API. |
closeAsync | CloseIndexRequest | Asynchronously closes an index using the Close Index API. |
get | GetIndexRequest | Retrieve information about one or more indexes |
getAsync | GetIndexRequest | Retrieve information about one or more indexes |
putMapping | PutMappingRequest | Updates the mappings on an index using the Put Mapping API. |
putMappingAsync | PutMappingRequest | Asynchronously updates the mappings on an index using the Put Mapping API. |
getMapping | GetMappingsRequest | Retrieves the mappings on an index or indices using the Get Mapping API. |
getMappingAsync | GetMappingsRequest | Asynchronously retrieves the mappings on an index on indices using the Get Mapping API. |
getFieldMapping | GetFieldMappingsRequest | Retrieves the field mappings on an index or indices using the Get Field Mapping API. |
getFieldMappingAsync | GetFieldMappingsRequest | Asynchronously retrieves the field mappings on an index on indices using the Get Field Mapping API. |
<u>RestHighLevelClient.method()
</u>
方法 | 参数 | 描述 |
---|---|---|
reindex | ReindexRequest | Executes a reindex request. |
reindexAsync | ReindexRequest | Asynchronously executes a reindex request. |
2.2 文档检索
<u>RestHighLevelClient.get()
</u>
方法 | 参数 | 描述 |
---|---|---|
get | GetRequest | Retrieves a document by id using the Get API. |
<u>RestHighLevelClient.mget()
</u>
方法 | 参数 | 描述 |
---|---|---|
mget | MultiGetRequest | Retrieves multiple documents by id using the Multi Get API. |
<u>RestHighLevelClient.method()
</u>
方法 | 参数 | 描述 |
---|---|---|
get | GetRequest | Retrieves a document by id using the Get API. |
mget | MultiGetRequest | Retrieves multiple documents by id using the Multi Get API. |
2.3 文档创建
<u>RestHighLevelClient.method()
</u>
方法 | 参数 | 描述 |
---|---|---|
index | IndexRequest | Index a document using the Index API. |
indexAsync | MultiGetRequest | Asynchronously index a document using the Index API. |
2.4 文档删除
<u>RestHighLevelClient.method()
</u>
方法 | 参数 | 描述 |
---|---|---|
delete | DeleteRequest | Deletes a document by id using the Delete API. |
deleteAsync | DeleteRequest | Asynchronously deletes a document by id using the Delete API. |
deleteByQuery | DeleteByQueryRequest | Executes a delete by query request. |
deleteByQueryAsync | DeleteByQueryRequest | Asynchronously executes a delete by query request. |
2.5 文档更新
<u>RestHighLevelClient.method()
</u>
方法 | 参数 | 描述 |
---|---|---|
update | UpdateRequest | Updates a document using the Update API. |
updateAsync | UpdateRequest | Asynchronously updates a document using the Update API. |
updateByQuery | UpdateByQueryRequest | Executes a update by query request. |
updateByQueryAsync | UpdateByQueryRequest | Asynchronously executes an update by query request. |
2.6 批量操作
<u>RestHighLevelClient.bulk()
</u>
方法 | 参数 | 描述 |
---|---|---|
bulk | BulkRequest | Executes a bulk request using the Bulk API. |
bulkAsync | BulkRequest | Asynchronously executes a bulk request using the Bulk API. |
2.7 常用查询条件
查询类型 | 描述 |
---|---|
termQuery | 精确查询 |
termsQuery | 精确查询(多值) |
rangeQuery | 范围查询 |
wildcardQuery | 模糊匹配查询 |
queryStringQuery | 多字段查询,指定运算类型类型查询,分词查询 |
matchAllQuery | 查询所有 |
matchQuery | 分词查询 |
matchPhraseQuery | 短语匹配 |
2.8 基于全文的查询
-
基于全文本的查找
- Match Query / Match Phrase Query / Query String Query
-
特点
- 索引和搜索时都会进行分词,查询字符串先传递到-个合适的分词器,然后生成-个供查询的词项列表并。并为每个文档生成一个算分。 -例如查“Matrix reloaded",会查到包括Matrix或者reload的所有结果。
查询时候,先会对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合
2.9 boolean查询
-
一个bool查询,是-个或者多个查询子句的组合
- 总共包括4 种子句。其中2种会影响算分,2种不影响算分
相关性并不只是全文本检索的专利。 也适用于yes Ino的子句,匹配的子句越多,相关性评越高。如果多条查询子句被合并为一条复合查询语句,比如bool查询,则每个查询子句计算得出的评分会被合并到总的相关性评分中。
bool | 描述 |
---|---|
must | I必须匹配。贡献算分 |
should | 选择性匹配。贡献算分 |
must not | Filter Contex查询字句,必须不能匹配t |
filter | Filter Context必须匹配,但是不贡献算分 |