ElasticSearch入门实战对初学者来说是否容易掌握?

2026-05-22 14:241阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计3700个文字,预计阅读时间需要15分钟。

ElasticSearch入门实战对初学者来说是否容易掌握?

家好,我是小助手。不期速成,日拱一卒,项目中准备使用ElasticSearch。此前,对ElasticSearch只有初步了解,未系统学习。本系列文章将从基础学起,深入ElasticSearch的实用应用。

大家好,我是咔咔 不期速成,日拱一卒

项目中准备使用ElasticSearch,之前只是对ElasticSearch有过简单的了解没有系统的学习,本系列文章将从基础的学习再到深入的使用。

咔咔之前写了一份死磕MySQL文章,如今再入一个系列玩转ElasticSearch。

本期文章会带给大家学习ElasticSearch的基础入门,先把基础学会再深入学习更多的知识点。

一、基本概念

文档(Document)

ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位,例如MySQL的一条数据记录

文档会被序列化成为json格式,保存在ElasticSearch中

每个文档都有一个唯一ID,例如MySQL中的主键ID

JSON文档

一篇文档包括了一系列的字段,例如数据中的一条记录

json文档,格式灵活,不需要预先定义格式

在上期文章中把csv文件格式文件通过Logstash转化为json存储到ElasticSearch中

文档的元数据

index :文档所属的索引名

type:文档所属类型名

id:文档唯一ID

source:文档的原始JSON数据

version:文档的版本信息

score:相关性分数

索引

索引是文档的容器,是一类文档的结合,每个索引都有自己的mapping定义,用于定义包含的文档的字段和类型

每个索引都可以定义mapping,setting,mapping是定义字段类型,setting定义不同的数据分布

{
"movies":{
"aliases":{},
"mappings":{
"properties":{
"@version":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"genre":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"id":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"title":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"year":{
"type":"long"
}
}
},
"settings":{
"index":{
"creation_date":"1641637408626",
"number_of_shards":"1",
"number_of_replicas":"1",
"uuid":"gf0M2BgnStGZZHsIJD6otQ",
"version":{
"created":"7010099"
},
"provided_name":"movies"
}
}
}
}

Type

7.0之前,一个Index可以设置多个type,所以当时大多数资料显示的都是type类型与数据库的表

7.0之后,一个索引只能创建一个type“_doc”

若不好理解,可以对比MySQL类比一下

Databases ElasticSearch Table Index(Type) Row Document Column Filed Schema Mapping Sql Dsl

节点

节点是一个ElasticSearch的实例,本质上就是java的一个进程,一台机器可以运行多个ElasticSearch进程,但生产环境下还是建议一台服务器运行一个ElasticSearch实例

每个节点都有名字,通过配置文件配置,或者启动时 -E node.name=node1

每个节点在启动后,会分配一个UID,保存在data目录下

主节点:master

默认情况下任何一个集群中的节点都有可能被选为主节点,职责是创建索引、删除索引、跟踪集群中的节点、决定分片分配给相应的节点。索引数据和搜索查询操作会占用大量的内存、cpu、io资源。因此,为了保证一个集群的稳定性,应该主动分离主节点跟数据节点。

数据节点:data

看名字就知道是存储索引数据的节点,主要用来增删改查、聚合操作等。数据节点对内存、cpu、io要求比较高,在优化的时候需要注意监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。

负载均衡节点:client

该节点只能处理路由请求,处理搜索,分发索引等操作,该节点类似于Nginx的负载均衡处理,独立的客户端节点在一个比较大的集群中是非常有用的,它会协调主节点、数据节点、客户端节点加入集群的状态,根据集群的状态可以直接路由请求。

预处理节点:ingest

在索引数据之前可以先对数据做预处理操作,所有节点其实默认都是支持ingest操作的,也可以专门将某个节点配置为ingest节点。

分片

分片分为主分片,副本分片

主分片:用以解决数据水平扩展的问题,将数据分布到集群内的所有节点上,一个分片是一个运行的Lucene(搜索引擎)实例,主分片数在创建时指定,后续不允许修改,除非Reindex

副本:用以解决数据高可用的问题,可以理解为主分片的拷贝,增加副本数,还可以在一定程度上提高服务的可用性。

在生产环境中分片的设置有何影响

分片数设置过小会导致无法增加节点实现水平扩展,单个分片数据量太大,导致数据重新分配耗时。假设你给索引设置了三个主分片 ,这时你给集群加了几个实例,索引也只能在三台服务器上

分片数设置过大导致搜索结果相关性打分,影响统计结果的准确性,单个节点上过多的分片,会导致资源浪费,同时也会影响性能

从ElasticSearch7.0开始,默认的主分片设置为1,解决了over-sharding的问题

查看集群健康状态

执行接口

get_cluster/health

green:主分片与副本都正常分配

yellow:主分片全部正常分配,有副本分片未能正常分配

red:有主分片未能分配,当服务器的磁盘容量超过85%时创建了一个索引

二、Result Api
接口 作用 get movies 查看索引相关信息 get movies/_count 查看索引的文档总数 post movies/_search 查看前10条文档 get /_cat/indices/movies?v&s=index 获取索引状态 get /_cat/indices?v&health=green 查看状态为绿色的索引 get /_cat/indices?v&s=docs.count:desc 根据文档数据倒序 get /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs,count,mt 查看索引具体字段 get /_cat/indices?v&h=i,tm&s=tm:desc 查看索引所占的内存 get _cluster/health 查看集群健康状态
三、文档的基本CRUD操作

create 一个文档

ElasticSearch入门实战对初学者来说是否容易掌握?

支持自动生成文档ID和指定文档ID两种方式

通过调用post /movies/_doc 系统会自动生成文档ID

使用(.*)",
"replacement":"$1"
}
],
"text":"www.kakaxiantan.com"
}
自定义Token Filters

现在用的分词器是whitespace,这个分词器是把词使用空格 隔开,但是现在还想让词变小写并过滤修饰词,应该怎么做呢?

post/_analyze
{
"tokenizer":"whitespace",
"filter":["stop","lowercase"],
"text":"Ifonyoudon'texpectquicksuccess,you'llgetapawneveryday"
}

为了不占地方,只复制出了代表性的返回结果

{
"tokens":[
{
"token":"if",
"start_offset":0,
"end_offset":2,
"type":"word",
"position":0
},
{
"token":"you",
"start_offset":6,
"end_offset":9,
"type":"word",
"position":2
}
]
}
实战自定义分词

本节开篇就知道analyze是通过Character Fiters、Tokenizer、Token Filter组成的,那么在自定义时这三个都是可以自定义的

自定义分词必存在analyzer、tokenizer、char_filter、filter

这部分的定义都是需要在下面定义好规则,否则无法使用,详细定义代码往下拉看完整版本即可

对这个配置不要死记硬背使用的多了自然就会记住

#实战自定义analyze
putkaka
{
"settings":{
"analysis":{
"analyzer":{
"my_custom_analyzer":{
"type":"custom",
"char_filter":[
"emoticons"
],
"tokenizer":"punctuation",
"filter":[
"lowercase",
"englist_stop"
]
}
},
"tokenizer":{
"punctuation":{
"type":"keyword"
}
},
"char_filter":{
"emoticons":{
"type":"mapping",
"mappings":[
"123=>Kaka",
"456=>xiantan"
]
}
},
"filter":{
"englist_stop":{
"type":"stop",
"stopwords":"_english_"
}
}
}
}
}

#执行自定义的分词
post/kaka/_analyze
{
"analyzer":"my_custom_analyzer",
"text":"123456"
}

#返回结果,把字母大写转为小写不做分词
{
"tokens":[
{
"token":"kakaxiantan",
"start_offset":0,
"end_offset":8,
"type":"word",
"position":0
}
]
}
十一、Index Template

在一个新索引新建并插入文档后,会使用默认的setting、mapping,如果你有设定settings、mappings会覆盖默认的settings、mappings配置

#创建索引并插入文档
post/kaka/_doc/1
{
"gongzhonghao":"123"
}

#获取settings、mappings
get/kaka

以下这个配置,就是默认配置

#返回的settings、mappings
{
"kaka":{
"aliases":{},
"mappings":{
"properties":{
"gongzhonghao":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
},
"settings":{
"index":{
"creation_date":"1642080577305",
"number_of_shards":"1",
"number_of_replicas":"1",
"uuid":"JJWsGYcrTam0foEQxuZqGQ",
"version":{
"created":"7010099"
},
"provided_name":"kaka"
}
}
}
}

接下来创建一个自己的模板

#设置一个只要是test开头的索引都能使用的模板,在这个模板中我们将字符串中得数字也转为了long类型,而非text
put/_template/kaka_tmp
{
"index_patterns":["test*"],
"order":1,
"settings":{
"number_of_shards":1,
"number_of_replicas":2
},
"mappings":{
#让时间不解析为date类型,返回是text类型
"date_detection":false,
#让双引号下的数字解析为long类型,而非text类型
"numeric_detection":true
}
}

创建索引

post/test_kaka/_doc/1
{
"name":"123",
"date":"2022/01/13"
}

get/test_kaka

返回结果

{
"test_kaka":{
"aliases":{},
"mappings":{
"date_detection":false,
"numeric_detection":true,
"properties":{
"date":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"name":{
"type":"long"
}
}
},
"settings":{
"index":{
"creation_date":"1642081053006",
"number_of_shards":"1",
"number_of_replicas":"2",
"uuid":"iCcaa_8-TXuymhfzQi31yA",
"version":{
"created":"7010099"
},
"provided_name":"test_kaka"
}
}
}
}

坚持学习、坚持写作、坚持分享是咔咔从业以来所秉持的信念。愿文章在偌大的互联网上能给你带来一点帮助,我是咔咔,下期见。

本文共计3700个文字,预计阅读时间需要15分钟。

ElasticSearch入门实战对初学者来说是否容易掌握?

家好,我是小助手。不期速成,日拱一卒,项目中准备使用ElasticSearch。此前,对ElasticSearch只有初步了解,未系统学习。本系列文章将从基础学起,深入ElasticSearch的实用应用。

大家好,我是咔咔 不期速成,日拱一卒

项目中准备使用ElasticSearch,之前只是对ElasticSearch有过简单的了解没有系统的学习,本系列文章将从基础的学习再到深入的使用。

咔咔之前写了一份死磕MySQL文章,如今再入一个系列玩转ElasticSearch。

本期文章会带给大家学习ElasticSearch的基础入门,先把基础学会再深入学习更多的知识点。

一、基本概念

文档(Document)

ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位,例如MySQL的一条数据记录

文档会被序列化成为json格式,保存在ElasticSearch中

每个文档都有一个唯一ID,例如MySQL中的主键ID

JSON文档

一篇文档包括了一系列的字段,例如数据中的一条记录

json文档,格式灵活,不需要预先定义格式

在上期文章中把csv文件格式文件通过Logstash转化为json存储到ElasticSearch中

文档的元数据

index :文档所属的索引名

type:文档所属类型名

id:文档唯一ID

source:文档的原始JSON数据

version:文档的版本信息

score:相关性分数

索引

索引是文档的容器,是一类文档的结合,每个索引都有自己的mapping定义,用于定义包含的文档的字段和类型

每个索引都可以定义mapping,setting,mapping是定义字段类型,setting定义不同的数据分布

{
"movies":{
"aliases":{},
"mappings":{
"properties":{
"@version":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"genre":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"id":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"title":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"year":{
"type":"long"
}
}
},
"settings":{
"index":{
"creation_date":"1641637408626",
"number_of_shards":"1",
"number_of_replicas":"1",
"uuid":"gf0M2BgnStGZZHsIJD6otQ",
"version":{
"created":"7010099"
},
"provided_name":"movies"
}
}
}
}

Type

7.0之前,一个Index可以设置多个type,所以当时大多数资料显示的都是type类型与数据库的表

7.0之后,一个索引只能创建一个type“_doc”

若不好理解,可以对比MySQL类比一下

Databases ElasticSearch Table Index(Type) Row Document Column Filed Schema Mapping Sql Dsl

节点

节点是一个ElasticSearch的实例,本质上就是java的一个进程,一台机器可以运行多个ElasticSearch进程,但生产环境下还是建议一台服务器运行一个ElasticSearch实例

每个节点都有名字,通过配置文件配置,或者启动时 -E node.name=node1

每个节点在启动后,会分配一个UID,保存在data目录下

主节点:master

默认情况下任何一个集群中的节点都有可能被选为主节点,职责是创建索引、删除索引、跟踪集群中的节点、决定分片分配给相应的节点。索引数据和搜索查询操作会占用大量的内存、cpu、io资源。因此,为了保证一个集群的稳定性,应该主动分离主节点跟数据节点。

数据节点:data

看名字就知道是存储索引数据的节点,主要用来增删改查、聚合操作等。数据节点对内存、cpu、io要求比较高,在优化的时候需要注意监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。

负载均衡节点:client

该节点只能处理路由请求,处理搜索,分发索引等操作,该节点类似于Nginx的负载均衡处理,独立的客户端节点在一个比较大的集群中是非常有用的,它会协调主节点、数据节点、客户端节点加入集群的状态,根据集群的状态可以直接路由请求。

预处理节点:ingest

在索引数据之前可以先对数据做预处理操作,所有节点其实默认都是支持ingest操作的,也可以专门将某个节点配置为ingest节点。

分片

分片分为主分片,副本分片

主分片:用以解决数据水平扩展的问题,将数据分布到集群内的所有节点上,一个分片是一个运行的Lucene(搜索引擎)实例,主分片数在创建时指定,后续不允许修改,除非Reindex

副本:用以解决数据高可用的问题,可以理解为主分片的拷贝,增加副本数,还可以在一定程度上提高服务的可用性。

在生产环境中分片的设置有何影响

分片数设置过小会导致无法增加节点实现水平扩展,单个分片数据量太大,导致数据重新分配耗时。假设你给索引设置了三个主分片 ,这时你给集群加了几个实例,索引也只能在三台服务器上

分片数设置过大导致搜索结果相关性打分,影响统计结果的准确性,单个节点上过多的分片,会导致资源浪费,同时也会影响性能

从ElasticSearch7.0开始,默认的主分片设置为1,解决了over-sharding的问题

查看集群健康状态

执行接口

get_cluster/health

green:主分片与副本都正常分配

yellow:主分片全部正常分配,有副本分片未能正常分配

red:有主分片未能分配,当服务器的磁盘容量超过85%时创建了一个索引

二、Result Api
接口 作用 get movies 查看索引相关信息 get movies/_count 查看索引的文档总数 post movies/_search 查看前10条文档 get /_cat/indices/movies?v&s=index 获取索引状态 get /_cat/indices?v&health=green 查看状态为绿色的索引 get /_cat/indices?v&s=docs.count:desc 根据文档数据倒序 get /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs,count,mt 查看索引具体字段 get /_cat/indices?v&h=i,tm&s=tm:desc 查看索引所占的内存 get _cluster/health 查看集群健康状态
三、文档的基本CRUD操作

create 一个文档

ElasticSearch入门实战对初学者来说是否容易掌握?

支持自动生成文档ID和指定文档ID两种方式

通过调用post /movies/_doc 系统会自动生成文档ID

使用(.*)",
"replacement":"$1"
}
],
"text":"www.kakaxiantan.com"
}
自定义Token Filters

现在用的分词器是whitespace,这个分词器是把词使用空格 隔开,但是现在还想让词变小写并过滤修饰词,应该怎么做呢?

post/_analyze
{
"tokenizer":"whitespace",
"filter":["stop","lowercase"],
"text":"Ifonyoudon'texpectquicksuccess,you'llgetapawneveryday"
}

为了不占地方,只复制出了代表性的返回结果

{
"tokens":[
{
"token":"if",
"start_offset":0,
"end_offset":2,
"type":"word",
"position":0
},
{
"token":"you",
"start_offset":6,
"end_offset":9,
"type":"word",
"position":2
}
]
}
实战自定义分词

本节开篇就知道analyze是通过Character Fiters、Tokenizer、Token Filter组成的,那么在自定义时这三个都是可以自定义的

自定义分词必存在analyzer、tokenizer、char_filter、filter

这部分的定义都是需要在下面定义好规则,否则无法使用,详细定义代码往下拉看完整版本即可

对这个配置不要死记硬背使用的多了自然就会记住

#实战自定义analyze
putkaka
{
"settings":{
"analysis":{
"analyzer":{
"my_custom_analyzer":{
"type":"custom",
"char_filter":[
"emoticons"
],
"tokenizer":"punctuation",
"filter":[
"lowercase",
"englist_stop"
]
}
},
"tokenizer":{
"punctuation":{
"type":"keyword"
}
},
"char_filter":{
"emoticons":{
"type":"mapping",
"mappings":[
"123=>Kaka",
"456=>xiantan"
]
}
},
"filter":{
"englist_stop":{
"type":"stop",
"stopwords":"_english_"
}
}
}
}
}

#执行自定义的分词
post/kaka/_analyze
{
"analyzer":"my_custom_analyzer",
"text":"123456"
}

#返回结果,把字母大写转为小写不做分词
{
"tokens":[
{
"token":"kakaxiantan",
"start_offset":0,
"end_offset":8,
"type":"word",
"position":0
}
]
}
十一、Index Template

在一个新索引新建并插入文档后,会使用默认的setting、mapping,如果你有设定settings、mappings会覆盖默认的settings、mappings配置

#创建索引并插入文档
post/kaka/_doc/1
{
"gongzhonghao":"123"
}

#获取settings、mappings
get/kaka

以下这个配置,就是默认配置

#返回的settings、mappings
{
"kaka":{
"aliases":{},
"mappings":{
"properties":{
"gongzhonghao":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
},
"settings":{
"index":{
"creation_date":"1642080577305",
"number_of_shards":"1",
"number_of_replicas":"1",
"uuid":"JJWsGYcrTam0foEQxuZqGQ",
"version":{
"created":"7010099"
},
"provided_name":"kaka"
}
}
}
}

接下来创建一个自己的模板

#设置一个只要是test开头的索引都能使用的模板,在这个模板中我们将字符串中得数字也转为了long类型,而非text
put/_template/kaka_tmp
{
"index_patterns":["test*"],
"order":1,
"settings":{
"number_of_shards":1,
"number_of_replicas":2
},
"mappings":{
#让时间不解析为date类型,返回是text类型
"date_detection":false,
#让双引号下的数字解析为long类型,而非text类型
"numeric_detection":true
}
}

创建索引

post/test_kaka/_doc/1
{
"name":"123",
"date":"2022/01/13"
}

get/test_kaka

返回结果

{
"test_kaka":{
"aliases":{},
"mappings":{
"date_detection":false,
"numeric_detection":true,
"properties":{
"date":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"name":{
"type":"long"
}
}
},
"settings":{
"index":{
"creation_date":"1642081053006",
"number_of_shards":"1",
"number_of_replicas":"2",
"uuid":"iCcaa_8-TXuymhfzQi31yA",
"version":{
"created":"7010099"
},
"provided_name":"test_kaka"
}
}
}
}

坚持学习、坚持写作、坚持分享是咔咔从业以来所秉持的信念。愿文章在偌大的互联网上能给你带来一点帮助,我是咔咔,下期见。