Elasticsearch是使用Lucene 为基础建立的开源可用全文搜索引擎,它可以快速地储存、搜索和分析海量数据
**Cluster:**集群,由一个或多个 Elasticsearch 节点组成。
**Node:**节点,组成 Elasticsearch 集群的服务单元,同一个集群内节点的名字不能重复。通常在一个节点上分配一个或者多个分片。
**Shards:**分片,当索引上的数据量太大的时候,我们通常会将一个索引上的数据进行水平拆分,拆分出来的每个数据库叫作一个分片。在一个多分片的索引中写入数据时,通过路由
shard = hash(routing) % number_of_primary_shards
来确定具体写入那一个分片中,所以在创建索引时需要指定分片的数量,并且分片的数量一旦确定就不能更改。
分片后的索引带来了规模上(数据水平切分)和性能上(并行执行)的提升。每个分片都是 Luence 中的一个索引文件,每个分片必须有一个主分片和零到多个副本分片。
对文档的新建、索引和删除请求都是写操作,必须在主分片上面完成之后才能被复制到相关的副本分片。所有的副本分片都报告写成功才会向客户端报告成功
**Replicas:**备份也叫作副本,是指对主分片的备份。主分片和备份分片都可以对外提供查询服务,写操作时先在主分片上完成,然后分发到备份上。
当主分片不可用时,会在备份的分片中选举出一个作为主分片,所以备份不仅可以提升系统的高可用性能,还可以提升搜索时的并发性能。但是若副本太多的话,在写操作时会增加数据同步的负担。
**Index:**索引,由一个和多个分片组成,通过索引的名字在集群内进行唯一标识。
**Type:**类别,指索引内部的逻辑分区,通过 Type 的名字在索引内进行唯一标识。在查询时如果没有该值,则表示在整个索引中查询。
**Document:**文档,索引中的每一条数据叫作一个文档,类似于关系型数据库中的一条数据通过 _id 在 Type 内进行唯一标识。
**Settings:**对集群中索引的定义,比如一个索引默认的分片数、副本数等信息。
**Mapping:**类似于关系型数据库中的表结构信息,用于定义索引中字段(Field)的存储类型、分词方式、是否存储等信息。Elasticsearch 中的 Mapping 是可以动态识别的。
如果没有特殊需求,则不需要手动创建 Mapping,因为 Elasticsearch 会自动根据数据格式识别它的类型,但是当需要对某些字段添加特殊属性(比如:定义使用其他分词器、是否分词、是否存储等)时,就需要手动设置 Mapping 了。一个索引的 Mapping 一旦创建,若已经存储了数据,就不可修改了。
**Analyzer:**字段的分词方式的定义。一个 Analyzer 通常由一个 Tokenizer、零到多个 Filter 组成。
比如默认的标准 Analyzer 包含一个标准的 Tokenizer 和三个 Filter:Standard Token Filter、Lower Case Token Filter、Stop Token Filter。
**①主节点(Master Node):**也叫作主节点,主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作。Elasticsearch 中的主节点的工作量相对较轻。
用户的请求可以发往任何一个节点,并由该节点负责分发请求、收集结果等操作,而并不需要经过主节点转发。
通过在配置文件中设置 node.master=true 来设置该节点成为候选主节点(但该节点不一定是主节点,主节点是集群在候选节点中选举出来的),在 Elasticsearch 集群中只有候选节点才有选举权和被选举权。其他节点是不参与选举工作的。
**②数据节点(Data Node):**数据节点,负责数据的存储和相关具体操作,比如索引数据的创建、修改、删除、搜索、聚合。
所以,数据节点对机器配置要求比较高,首先需要有足够的磁盘空间来存储数据,其次数据操作对系统 CPU、Memory 和 I/O 的性能消耗都很大。
通常随着集群的扩大,需要增加更多的数据节点来提高可用性。通过在配置文件中设置 node.data=true 来设置该节点成为数据节点。
有 Green、Yellow 和 Red 三种,如下所述:
**Green:**绿色,健康。所有的主分片和副本分片都可正常工作,集群 100% 健康。
**Yellow:**黄色,预警。所有的主分片都可以正常工作,但至少有一个副本分片是不能正常工作的。此时集群可以正常工作,但是集群的高可用性在某种程度上被弱化。
**Red:**红色,集群不可正常使用。集群中至少有一个分片的主分片及它的全部副本分片都不可正常工作。
这时虽然集群的查询操作还可以进行,但是也只能返回部分数据(其他正常分片的数据可以返回),而分配到这个分片上的写入请求将会报错,最终会导致数据的丢失。
GET /_cluster/health
name | content |
---|---|
静夜思 | 床前明月光,疑是地上霜。举头望明月,低头思故乡。 |
春晓 | 春眠不觉晓,处处闻啼鸟。夜来风雨声,花落知多少。 |
望庐山瀑布 | 日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。 |
如果用像 MySQL 这样的数据库来存储古诗的话,我们应该会查询带前的古诗句
select name from poems where content like "%前%";
这种会使用顺序扫描法,无法使用索引,效率低
像Elasticsearch之类的搜索引擎,会如何去做呢
倒排索引建立的样子
关键字 | 名称 |
---|---|
床 | 静夜思 |
前 | 静夜思,望庐山瀑布 |
Term查询的方式
term dictionary,ES 为了能快速查找到 term,将所有的 term 排了一个序,二分法查找。是不是感觉有点眼熟,这就是 MySQL 的索引方式的,直接用 B+树建立索引词典指向被索引的数据。
创建索引
$ curl -X PUT 'localhost:9200/weather'
删除索引
$ curl -X DELETE 'localhost:9200/weather'
新增记录
$ curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
"user": "张三",
"title": "工程师",
"desc": "数据库管理"
}'
或
$ curl -X POST 'localhost:9200/accounts/person' -d '
{
"user": "李四",
"title": "工程师",
"desc": "系统管理"
}'
查看记录
$ curl 'localhost:9200/accounts/person/1?pretty=true'
更新记录
$ curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
"user" : "张三",
"title" : "工程师",
"desc" : "数据库管理,软件开发"
}'
查询所有
$ curl 'localhost:9200/accounts/_type/_search'
查询符合条件的
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "软件" }}
}'
查询or 软件或者系统
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "软件 系统" }}
}'
执行多个关键词的and搜索
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query": {
"bool": {
"must": [
{ "match": { "desc": "软件" } },
{ "match": { "desc": "系统" } }
]
}
}
}'
$ curl -X DELETE 'localhost:9200/accounts/person/1'
Elasticsearch用得好,下班下得早 https://mp.weixin.qq.com/s/Vawue5I2ZnaEIf_OlT7wJQ
全文搜索引擎 Elasticsearch 入门 https://mp.weixin.qq.com/s/Cvf4_b0nmLCvN9TaeK0VoA
倒排索引的秘密 https://mp.weixin.qq.com/s/vwTrRSfgJ-7bWQUJWhfaHQ
看完这篇还不会Elasticsearch,我跪搓衣板!https://mp.weixin.qq.com/s/PIl9_1ogyKVDd0nxz8PhUw
掌握它才说明你真正懂Elasticsearch https://mp.weixin.qq.com/s/cgpWEXGLYMitTgXaH5EvLA