elasticsearch入门知识整理

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。

但是,Lucene只是一个库。Lucene本身并不提供高可用性及分布式部署。想要发挥其强大的作用,你需使用Java并要将其集成到你的应用中。L

Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。

Elasticsearch不仅仅是Lucene和全文搜索引擎,它还提供:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 实时分析的分布式搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。

一、基础概念-快速入门

节点 Node、集群 Cluster 和分片 Shards

ElasticSearch 是分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个实例。单个实例称为一个节点(node),一组节点构成一个集群(cluster)。分片是底层的工作单元,文档保存在分片内,分片又被分配到集群内的各个节点里,每个分片仅保存全部数据的一部分。

Cluster也就是集群的意思。Elasticsearch集群由一个或多个节点组成,可通过其集群名称进行标识。 在config/elasticsearch.yml里定制我们的集群的名字 。

一个集群由一个或多个node组成 。

根据node的作用,可以分为如下的几种:

master-eligible:可以作为主node。一旦成为主node,它可以管理整个cluster的设置及变化:创建,更新,删除index;添加或删除node;为node分配shard

data:数据node

ingest: 数据接入(比如 pipepline)

machine learning (Gold/Platinum License)

Shard: Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片(shard)。当你创建一个索引的时候,你可以指定你想要的分片(shard)的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上 ,

两种类型的分片:primary shard和replica shard。 主副本和副本分片之间的主要区别在于只有主分片可以接受索引请求。副本和主分片都可以提供查询请求。

Primary shard: 每个文档都存储在一个Primary shard。 索引文档时,它首先在Primary shard上编制索引,然后在此分片的所有副本上(replica)编制索引。索引可以包含一个或多个主分片。 此数字确定索引相对于索引数据大小的可伸缩性。 创建索引后,无法更改索引中的主分片数。
Replica shard: 每个主分片可以具有零个或多个副本。 副本是主分片的副本,有两个目的:

增加故障转移:如果主要故障,可以将副本分片提升为主分片

提高性能:get和search请求可以由主shard或副本shard处理。

#为每个index设置相应的shard数值
curl -XPUT http://localhost:9200/another_user?pretty -H 'Content-Type: application/json' -d '
{
    "settings" : {
        "index.number_of_shards" : 2,
        "index.number_of_replicas" : 1
    }
}'

索引 Index、类型 Type 和文档 Document

对比我们比较熟悉的 MySQL 数据库:

index → db
type → table
document → row

如果我们要访问一个文档元数据应该包括囊括 index/type/id 这三种类型

index 是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。 Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。 索引是文档的集合, 每个Index一个或许多的documents组成,并且这些document可以分布于不同的shard之中。 在Elasticsearch中的文档可以有object及nested结构。一个index是一个逻辑命名空间,它映射到一个或多个主分片,并且可以具有零个或多个副本分片。

$ curl -X GET 'http://localhost:9200/_cat/indices?v'

type: 类型是文档的逻辑容器,类似于表是行的容器。 您将具有不同结构(模式)的文档放在不同类型中。在Elasticsearch 6.0以后,一个Index只能含有一个type。这其中的原因是:相同index的不同映射type中具有相同名称的字段是相同; 在Elasticsearch索引中,不同映射type中具有相同名称的字段在Lucene中被同一个字段支持。在默认的情况下是_doc。在未来8.0的版本中,type将被彻底删除。

Document : Index 里面单条的记录, 多条 Document 构成了一个 Index , Document 使用 JSON 格式表示 。Elasticsearch是面向文档的,这意味着您索引或搜索的最小数据单元是文档。文档在Elasticsearch中有一些重要的属性:

它是独立的。文档包含字段(名称)及其值。
它可以是分层的。可以将其视为文档中的文档。字段的值可以很简单,就像位置字段的值可以是字符串一样。它还可以包含其他字段和值。例如,位置字段可能包含城市和街道地址。
结构灵活。您的文档不依赖于预定义的架构。例如,并非所有事件都需要描述值,因此可以完全省略该字段。但它可能需要新的字段,例如位置的纬度和经度。

文档通常是数据的JSON表示形式
Type,它是虚拟的逻辑分组,用来过滤 Document 。

$ curl 'localhost:9200/_mapping?pretty=true'   #列出每个 Index 所包含的 Type

二、使用 RESTful API 与 Elasticsearch 进行交互

可以使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信

curl -X <VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

部件名作用VERB适当的 HTTP 方法 或 谓词 : GETPOSTPUTHEAD 或者 DELETEPROTOCOL http 或者 https(如果你在 Elasticsearch 前面有一个 https 代理)HOSTElasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。PORT运行 Elasticsearch HTTP 服务的端口号,默认是 9200PATHAPI 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats_nodes/stats/jvmQUERY_STRING任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)BODY一个 JSON 格式的请求体 (如果请求需要的话)

Elastic 默认一次返回10条结果,可以通过size字段改变这个设置。

#新建 Index
$ curl -X PUT 'localhost:9200/weather'                  
#删除Index
$ 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 -X PUT 'localhost:9200/accounts/person/1' -d '
{
    "user" : "张三",
    "title" : "工程师",
    "desc" : "数据库管理,软件开发"
}' 
#删除记录
$ curl -X DELETE 'localhost:9200/accounts/person/1'
#查询记录
$ curl -X GET 'localhost:9200//db/user/2'
#计算集群中文档的数量
curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}
'
#查询记录
$ curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "软件" }}
}'

参考:
https://blog.csdn.net/UbuntuTouch/article/details/99443042
https://zhuanlan.zhihu.com/p/54384152
http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html

批量处理 bulk

批量处理命令。在一次的REST请求中,可以完成很多的操作。 在输入命令时,我们需要特别的注意:千万不要添加除了换行以外的空格,否则会导致错误 。 一个好的起点是批量处理1000到5,000个文档,总有效负载在5MB到15MB之间

通过bulk API为数据编制索引时,您不应在集群上进行任何查询/搜索。 这样做可能会导致严重的性能问题

Open/close Index

lasticsearch支持索引的在线/离线模式。 使用脱机模式时,在群集上几乎没有任何开销地维护数据。 关闭索引后,将阻止读/写操作。 当您希望索引重新联机时,只需打开它即可。 但是,关闭索引会占用大量磁盘空间。 您可以通过将cluster.indices.close.enable的默认值从true更改为false来禁用关闭索引功能,以避免发生意外。

Freeze/unfreeze index

冻结索引(freeze index)在群集上几乎没有开销(除了将其元数据保留在内存中),并且是只读的。 只读索引被阻止进行写操作。冻结索引受到限制,以限制每个节点的内存消耗。 每个节点的并发加载的冻结索引数受search_throttled线程池中的线程数限制,默认情况下为1。 默认情况下,即使已明确命名冻结索引,也不会针对冻结索引执行搜索请求。 这是为了防止由于误将冻结的索引作为目标而导致的意外减速。 如果要包含冻结索引做搜索,必须使用查询参数ignore_throttled = false来执行搜索请求

两类搜索:

  • queries 进行全文搜索
  • aggregations 对数据进行统计及分析

搜索结果中 hits数组里,可以看到所有的结果。_score的项。它表示搜索结果的相关度。这个分数值越高,表明搜索匹配的相关度越高 。

index的mapping

Elasticsearch号称是schemaless,在实际所得应用中,每一个index都有一个相应的mapping。这个mapping在我们生产第一个文档时已经生产。它是对每个输入的字段进行自动的识别从而判断它们的数据类型。我们可以这么理解schemaless:

不需要事先定义一个相应的mapping才可以生产文档。字段类型是动态进行识别的。这和传统的数据库是不一样的
如果有动态加入新的字段,mapping也可以自动进行调整并识别新加入的字段

自动识别字段有一个问题,那就是有的字段可能识别并不精确,

注意:我们不能为已经建立好的index动态修改mapping。这是因为一旦修改,那么之前建立的索引就变成不能搜索的了。一种办法是reindex从而重新建立我们的索引。如果在之前的mapping加入的字段,那么我们可以不用重新建立索引

对于一个keyword类型的项来说,这个项里面的所有字符都被当做一个字符串。它们在建立文档时,不需要进行index。keyword字段用于精确搜索,aggregation和排序(sorting)

使用match query时,默认的操作是OR

bool请求通常是must,must_not, should及filter的一个或其中的几个一起组合形成的。should只有在特殊的情况下才会影响hits。在正常的情况下它不会影响搜索文档的个数。那么在哪些情况下会影响搜索的结果呢?这种情况就是针对只有should的搜索情况,也就是如果你在bool query里,不含有must, must_not及filter的情况下,一个或更多的should必须有一个匹配才会有结果

Elasticsearch有位置查询

match查询时时不用分先后顺序的

把 所感兴趣的数据导入到Elasticsearch , 可以通过:

Beats:我们可以通过beats把数据导入到Elasticsearch中
Logstash:我们可以Logstash把数据导入。Logstash的数据来源也可以是Beats
REST API:我们可以通过Elastic所提供的丰富的API来把数据导入到Elasticsearch中。我们可以通过Java, Python, Go, Nodejs等各种Elasticsearch API来完成我们的数据导入。

Elasticsearch可以实现秒级的搜索速度,其中很重要的一个原因就当一个文档被存储的时候,同时它也对文档的数据进行了索引(indexing)

Analyzer分为三个部分:Char Filters, Tokenizer及 Token Filter。它们的作用分别如下:

Char Filter: 字符过滤器的工作是执行清除任务,例如剥离HTML标记。
Tokenizer: 下一步是将文本拆分为称为标记的术语。 这是由tokenizer完成的。 可以基于任何规则(例如空格)来完成拆分。 有关tokennizer的更多详细信息,请访问以下URL:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html。
Token filter: 一旦创建了token,它们就会被传递给token filter,这些过滤器会对token进行规范化。 Token filter可以更改token,删除术语或向token添加术语。

在默认的情况下,standard analyzer是Elasticsearch的缺省分析器:

没有 Char Filter
使用standard tokonizer
把字符串变为小写,同时有选择地删除一些stop words等。默认的情况下stop words为_none_,也即不过滤任何stop words。


读书:《 孩子看的编程启蒙书(第1辑,共4册)》

稍微空闲一点,手上正好有《 孩子看的编程启蒙书》,那就翻来看一看吧

怎么只有三本了,第4本不知道跑到哪去了

买的书太多,下次找找估计出来了

一上来就说算法,感觉还比较新颖,这也算是让小朋友从开始就认识到算法了

流程图这一册,还是不错的

每一册确实是用小朋友熟悉的例子引入新的概念,浅显易懂

大篇幅的图画,少量的文字,对于成人来说翻翻只是十来分钟的事情

算法是解决问题、实现目标的方法。 每当想做一件事(目的)时,我们都会思考该怎么做(方法),这里的方法,就是算法。算法要解决的是:按什么顺序,做什么事情。

编程:思考算法,指挥计算机去做做的事情 。是为了指挥计算机实现特定的目标,用字母和符号来编写程序。

过水洼的不同办法,就是不同的算法。

排序算法:冒泡排序,选择排序,插入排序

检索算法:二分检索,线性检索

流程图:用线条和箭头把写有文字的指令框连接起来

算法的三种基本结构 :顺序结构,条件结构,循环结构

elasticsearch学习步骤

官方中文文档: https://www.elastic.co/guide/cn/index.html

官方文档:https://www.elastic.co/guide/index.html

官方博客:https://elasticstack.blog.csdn.net/

官方下载地址: https://www.elastic.co/downloads/elasticsearch

官网太慢了:换到华为的镜像 https://mirrors.huaweicloud.com/elasticsearch/7.6.2/

如果大家想开始学习Elastic的话,那么这里将是你理想的学习园地。在我的博客几乎涵盖了你想学习的许多方面。在这里,我来讲述一下作为一个菜鸟该如何阅读我的这些博客文章。

我们可以按照如下的步骤来学习:

1) Elasticsearch简介:对Elasticsearch做了一个简单的介绍

2) Elasticsearch中的一些重要概念:cluster, node, index, document, shards及replica:对Elastic Stack里的一些重要的概念做描述。理解这些概念对于我们学习和使用Elastic是非常重要的

3) 如何在Linux,MacOS及Windows上进行安装Elasticsearch:在我们常用的操作系统上进行安装Elasticsearch

4) Kibana:如何在Linux,MacOS及Windows上安装Elastic栈中的Kibana:讲述如何在我们的操作系统上安装Kibana

5) 开始使用Elasticsearch (1): 了解如何创建index,添加,删除,更新文档

6) 开始使用Elasticsearch (2):了解如何进行搜索

7) 开始使用Elasticsearch (3):了解如何进行分析数据: analyze及aggregate数据

8)Beats 入门:

            – Beats:Beats 入门教程 (一)

            – Beats:Beats 入门教程 (二)

9) 中文分词器介绍:

            – Elasticsearch: analyzer 

            – Elasticsearch:IK中文分词器

            – Elasticsearch:ICU分词器介绍

            – Elasticsearch:Smart Chinese Analysis plugin

            – Elasticsearch:Pinyin 分词器

            – Elasticsearch:hanlp 中文分词器

10) Aggregations

           – Elasticsearch: 运用 shard_size 来提高term aggregation的精度

           – Elasticsearch: 透彻理解Elasticsearch中的Bucket aggregation 

           – Elasticsearch: Rare Terms Aggregation

           – Elasticsearch: top_hits aggregation

           – Elasticsearch: pipeline aggregation 介绍 

           – Elasticsearch: aggregation介绍

           – Elasticsearch: significant terms aggregation 

          – Elasticsearch:在Elasticsearch中的Composite Aggregation

11) Painless 编程

          – Elasticsearch:Painless scripting

          – Elasticsearch:Painless script编程

          – Elasticsearch:Painless scripting 高级编程

          – Kibana: 如何在Kibana中生成Scripted fields

12) 启动 Elastic 安全

           – Kibana:为不同的用户生成不同的Space 

           – Elasticsearch:用户安全设置

           – Elasticsearch:设置Elastic账户安全

           – Elastic:为Elasticsearch启动https访问

           – Elastic:为Elastic Docker部署设置安全

13)  解决方案 – Solutions 

      SIEM:

          – Solutions:Elastic SIEM – 适用于家庭和企业的安全防护 ( 一)

          – Solutions:Elastic SIEM – 适用于家庭和企业的安全防护 (二)

          – Solutions:Elastic SIEM – 适用于家庭和企业的安全防护 (三)

          – Solutions:Elastic SIEM – 适用于家庭和企业的安全防护 (四)

          – Solutions:Elastic SIEM – 适用于家庭和企业的安全防护 ( 五)

     APM:

          –  Elastic:应用程序性能监控/管理(APM)实践

          – Solutions:如何使用Elastic APM来测试多语言微服务应用程序

          – Solutions:如何为Python Flask应用进行APM

          – Solutions:如何为Python Django应用进行APM

          – Solutions:为Nodejs微服务提供APM功能 

          – Solutions:安全的APM服务器访问

     Enterprise search:

          – Solutions:Elastic workplace 搜索:随时随地搜索所有内容 (一)

          – Solutions:Elastic workplace 搜索:随时随地搜索所有内容 (二)

          – Solutions:网站搜索 – Elastic Site Search

          – Solutions:如何运用Elastic App Search快速建立出色的React搜索体验

          – Solutions:Elastic App Search 入门

         –  Elastic App Search:免费的产品,可提供出色的搜索体验

    Observability:

          – Elastic:使用Heartbeat进行Uptime监控

   其它

          – Elasticsearch:机器学习的实践

          – Elastic:使用ElastAlert发送通知

         – Elastic:使用ElastAlert发送邮件通知

          – X-Pack:创建阈值检查警报 

          – Elastic:创建你的第一个Elastic alert 

          – Elastic:创建你的第一个Elastic alert – 邮件通知 

          – Elastic:如何创建一个动态的阈值警报         

14 ) 跨集群操作

          – Elasticsearch:跨集群搜索 Cross-cluster search (CCS)

          – Elasticsearch:跨集群复制 Cross-cluster replication(CCR) 

如果你想快速地部署自己的集群,请参阅如下的文档:

  1. Elastic:在Elastic云上3分钟部署Elastic集群
  2. Elastic:如何在阿里云上构建Elastic集群
  3. Elastic:如何在AWS上一步一步地安装Elastic Stack
  4. Elastic:用Docker部署Elastic栈
  5. Elastic:为Elastic Docker部署设置安全
  6. Elastic:Elastic Cloud Kubernetes (ECK) 部署
  7. Elastic:使用Elastic Helm Chart来部署多节点的Elasticsearch集群
  8. Elastic:如何在一个机器上同时模拟多个node
  9. Elastic:创建Elasticsearch集群并为它们配置TLS安全通信
  10. Elastic:在Kubernetes多节点集群部署Elastic Stack

如果你想使用编程的方法把数据导入并搜索:

  1. Elasticsearch:Java 运用示例
  2. Elasticsearch:应用Nodejs来访问Elasticsearch
  3. Elasticsearch:使用Python实现Web Scraper
  4. Elasticsearch:从零开始安装Elasticsearch并使用Python装载一个CSV并读写它


等我们完成了上面的阅读和练习后,我们会对Elasticsearch有一个基本的了解。我们可以再挑选相应的文章进行专门地阅读来了解更多关于Elastic Stack方面的知识。

如果你想了解更多关于Logstash方面的知识,请参阅链接Logstash

如果你想了解更多关于Kibana方面的知识,请参阅链接Kibana

如果你想了解更多关于Beats方面的知识,请参阅链接Beats

如果你想了解更多关于Elastic解决方案的知识,请参阅链接Solutions

如果你想了解更多关于X-Pack方面的知识,请参阅链接X-Pack

如果你想了解所有关于Elastic的内容,请参阅链接Elastic

如果大家对上面话题需要有更深一步的了解,请告诉我。我会尽力做出更好的文章供大家来参阅!

谢谢大家的关注!

关于 Elastic

Elastic 是一家专注搜索的企业。作为 Elastic Stack(Elasticsearch、Kibana、Beats 和 Logstash)的开发者,Elastic 构建了自管理型和 SaaS 型产品,这些产品能够使人们在应用搜索、站点搜索、企业搜索、日志、APM、指标、安全,商业分析等用例中大规模地实时使用数据。全球范围内有数以千计的公司/组织使用 Elastic 来为任务关键型系统提供支持,这些公司/组织包括思科、eBay、高盛、微软、Mayo 医学中心、美国国家航空航天局 (NASA)、纽约时报、维基百科和 Verizon。Elastic 是一家成立于 2012 年的分布式公司,Elasticians在世界各国开展业务。Elastic于2018年在中国也成立了独资公司 “弹性搜索(北京)信息技术有限公司”。 更多详情请参见 elastic.co/cn/

有用链接:

  1. Elastic 官方网站:https://www.elastic.co/
  2. Elastic 开发文档:https://www.elastic.co/guide/index.html
  3. Elastic 官方会议网站: http://conf.elasticsearch.cn/
  4. Elasticsearch 中文网站:https://www.elasticsearch.cn/
  5. Elastic demos: https://demo.elastic.co/
  6. Elastic 文档:https://www.elastic.co/guide/index.html
  7. Elastic 社区:https://www.elastic.co/community/
  8. Elastic 中文社区:https://elasticsearch.cn/
  9. Elastic 视频:https://www.elastic.co/videos/, https://www.elastic.co/cn/videos/
  10. Elastic 中文博客:https://www.elastic.co/cn/blog/
  11. 腾讯社区:https://cloud.tencent.com/developer/column/4008
  12. Elasticsearch definitive guide: https://www.elastic.co/guide/en/elasticsearch/guide/index.html
  13. Elastic 书籍 (1):https://github.com/BlackThursdays/https-github.com-TechBookHunter-Free-Elasticsearch-Books/tree/master/book
  14. Elastic 书籍(2):https://github.com/BlackThursdays/https-github.com-TechBookHunter-Free-Elasticsearch-Books
  15. Elastic 认证指南:https://elasticsearch.cn/article/13530
  16. Elastic 培训:https://training.elastic.co/
  17. 掘金mirror网址:https://juejin.im/user/5df6e1bde51d4558381e82d6/posts
  18. Elastic的前世今生:https://mp.weixin.qq.com/s/FRFGwtDtFs_5RYn_vHjghw
  19. 从Splunk迁移到Elastic?https://www.elastic.co/splunk-alternative
  20. Elastic Workshop https://elk-workshop.github.io/
  21. Elastic Start:https://www.elastic.co/start