欢迎访问我的博客,你的支持,是我最大的动力!

elasticsearch技术解析与实战(五) 集群管理和索引分词器及高级配置

ELK Stack 小马奔腾 9931℃ 评论
目录:
[显示]

集群管理

集群管理相关内容包括:集群节点监控、集群分片迁移、集群节点配置、节点发现、集群平衡位置

集群节点监控
集群监控包括集群的健康值、有关服务器的信息、节点信息、索引和分片信息等。监控API主要分为三类:
与集群相关的,以_cluster开头;
与节点相关的,以_nodes开头;
与任务相关的,以_tasks开头。
集群健康值
集群健康检查API _cluster/health
GET /_cluster/health?pretty=true
#后面加上索引名称,可以得到索引的健康检查情况
GET /_cluster/health/secisland?pretty=true
返回信息中,重点是status字段:
green,所有主、副分片都处于活动状态
yellow,所有主分片都处于活动状态,不是所有副本分片都处于活动状态
red,不是所有主分片都处于活动状态
集群状态
查询整个集群的综合状态信息 _cluster/state
GET /_cluster/state
返回信息非常多,主要有:集群信息、节点信息、索引结构信息、分片信息、路由信息(精细到每一个分片)等
GET /_cluster/state/blocks
GET /_cluster/state/metadata,routing_table/foo,bar
GET /_cluster/state/_all/foo,bar
集群统计
_cluster/stats 从一个集群的角度统计集群状态,返回两个最基本的信息,一是索引信息,如分片数量、存储大小、内存使用等,另一个是集群节点信息,如节点数量、角色、操作系统信息、JVM版本、内存使用率、CPU和插件的安装信息
GET /_cluster/stats
集群任务管理
GET /_tasks
GET /_tasks?nodes=nodeID1,nodeID2
GET /_tasks?nodes=nodeID1,nodeID2&actions=cluster:*
GET /_tasks/taskId1
GET /_tasks?parent_task_id=parentTaskId1
任务接口还可以用来等待任务的完成
#等待10秒或ID为otultx4-iqmouuveiohtt8a:12345的任务等待10秒
GET /_tasks/otultx4-iqmouuveiohtt8a:12345?wait_for_completion=true&timeout=10s
需要长时间等待的任务可以取消,取消操作可以取消一个或多个任务
POST /_tasks/taskId1/_cancel
POST /_tasks/_cancel?node_id=nodeId1,nodeId2&actions=*reindex
待定集群任务
待定集群任务返回一个尚未执行的集群水平变化的列表,如创建索引、更新映射、分配分片或失败分片
GET /_cluster/pending_tasks
通常返回空,因为系统正常情况下处理很快
节点信息
集群节点信息接口用于搜索一个或多个集群节点的信息
GET /_nodes
GET /_nodes/os  #仅查看os信息
GET /_nodes/hot_threads #查询活跃线程
GET /_nodes/{nodeIds}/hot_threads
返回信息包含:节点网络配置、配置文件路径、操作系统、JVM信息等等
settings/os/process/jvm/thread_pool/transport/http/plugins
节点统计
对一个、多个或全部集群节点进行统计
GET /_nodes/stats
GET /_nodes/node-1/stats
GET /_nodes/node-1/stats/os,fs
返回信息:
indices,索引相关的统计,包括size、document count 、indexing and deletion times、search times、field cache size、merges and flushes
fs,文件系统信息,包括路径、磁盘空间、读/写数据等
http,http连接信息
jvm,jvm虚拟机统计,包括内存池数据、垃圾回收、缓冲池、加载/卸载类等
os,操作系统统计,平均负载、内存、交换分区等
process,进程统计,包括内存消耗、处理器使用、打开的文件描述符等
thread_pool,线程池统计,当前大小、队列和拒绝的任务等
thansport,网络数据统计,集群通信中发送和接收字节统计
breaker,数据处理统计
script,脚本相关信息
集群分片迁移
es中可以通过集群路由_cluster/reroute对集群中的分片进行操作,如可以把一个分片从一个节点迁移到另一个节点,将未分配的分片分配到一个特定节点上等。这个过程通常是自动运行的,如果想手动操作,必须将cluster.routing.allocation.disable_allocation参数设置为true,以禁止es自动索引分片分配。
POST /_cluster/reroute
{"commands":[{"move":{"index":"test","shard":0,"from_node":"node1","to_node":"node2"}},{"allocate":{"index":"test","shard":1,"node":"node3"}}]}
共有三种操作:
移动move,把分片从一节点移动到另一个节点,可以指定索引名和分片号
取消cancel,取消分配一个分片,可以指定索引名和分片号。node参数可以指定在哪个节点取消正在分配的分片,allow_primary参数支持取消主分片
分配allocate,分配一个未分配的分片到指定的节点,可以指定索引名和分片号。node参数指定分配到哪个节点;all_primary可以强制分配主分片,不过这可能导致数据丢失,因为allow_primary将使一个新的空主分片被分配,如果有一份原始的分片副本(含数据)的节点重新加入集群,分片副本数据将被删除:旧的分片副本将会被新的活动分片副本替换集群配置更新:系统允许对集群的配置进行更新,配置更新有两种状态,一是持久的,二是临时的
PUT /_cluster/settings
{"persistent":{"discovery.zen.minimum_master_nodes":2}}
#持久更新配置,将参数persistent换成transient就是临时更新
集群节点配置
相同集群名的多个节点连接组成集群。默认每个节点都可以处理http请求和集群节点的数据传输。集群中所有节点都知道集群中其他的所有节点,可以将客户端的请求转发到适当的节点上
节点的类型
主节点master,当node.master设置为true(默认)时,就有资格被选作主节点,控制整个集群
数据节点data,当node.data设置为true(默认)时,该节点保存数据和执行数据相关的操作,如增删改查、搜索和聚合
默认,节点同时是主节点和数据节点,随着集群的发展,分离主节点和数据节点就变得有意义了
客户端节点,当节点的node.master和node.data都设置为false时,既不保持数据也不能成为主节点,该节点可以作为客户端节点,响应用户的请求,把相关操作转发到其他节点
部落节点,当一个节点配置tribe.*时,它是一个特殊的客户端,可以连接多个集群,在所有连接的集群上执行搜索和其他操作
客户端节点也叫协调节点,需要有足够的内存和CPU以处理各个节点的返回结果
主节点
主节点主要负责和集群相关的内容,如创建或删除索引,跟踪哪些节点是集群的一部分,并决定哪些分片分配给相关的节点。默认任何一个节点都可以成为主节点,而索引数据和搜索查询等操作会占用大量的CPU、内存、IO资源,为确保集群的稳定,分离主节点和数据节点是较好的选择
主节点也可以作为协调节点,但最好不用主节点
创建一个独立的主节点的配置:
node.master:true
node.data.false
为防止数据丢失,配置discovery.zen.minimum_master_nodes至关重要(默认为1),每个主节点应该知道形成一个集群的最小数量的主资格节点的数量
设置这个值的原则是:(master_eligible_nodes/2)+1
该参数也可以动态设置:PUT /_cluster/settings  {"transient":{"discovery.zen.minimum_master_nodes":2}} #persistent永久;transient临时
数据节点
存储索引数据的节点,主要对文档进行增删改查、聚合等。数据节点对CPU、内存、IO要求较高。应当监控数据节点的状态,当资源不足时,增加新节点数量
数据节点配置
node.master:false
node.data:true
数据节点路径设置
每一个主节点和数据节点都需要知道分片、索引、元数据的物理存储位置,path.data默认为$ES_HOME/data,可以通过配置文件设置
path.data: /var/elasticsearch/data
该设置也可以在命令行上执行
elasticsearch --path.data /var/elasticsearch/data
这个目录最好单独配置,当删除es主目录时,不会影响到数据
数据目录可以被多个节点共享,甚至可以属于不同的集群,为防止多个节点共享相同的数据路径,可以在配置文件中添加node.max_local_storage_nodes:1
注:在相同的数据目录不要运行不同类型的节点(master/data/client),这会导致意外的数据丢失
客户端节点
当主节点和数据节点都设置为false时,该节点只能处理路由请求,处理搜索、分发索引操作等,从本质上说客户端节点表现为智能负载平衡器
添加太多的客户端节点对集群是一种负担,因为主节点必须等待每一个节点集群状态的更新确认
配置:
node.master:false
node.data:false
部落节点

部落节点可以跨越多个集群,可以接收不同集群的状态,然后合并成一个全局集群的状态,它可以读写所有节点上的数据
配置参数:

t1、t2是任意名字,代表连接到的集群。默认部落节点通过单播发现连接到每个集群。用于连接的其他配置可以配置在tribe{name}后
如果两个集群名称相同,那么部落节点只会连接其中一个。由于没有主节点,主节点级别的读操作:集群统计、集群健康度,会在本地标志设置为true的节点自动执行;主节点级别的写操作将被拒绝,如创建索引,这些操作应该在单个集群节点上执行
节点发现
zen发现机制是默认的发现模块,提供单播发现方。
发现模块分为两个模块:
ping模块,通过ping模块可以寻找其他节点
单播模块,使用提供的主机列表作为路由列表,以discovery.zen.ping.unicast为前缀
主机列表设置:discovery.zen.ping.unicast.hosts,它是一个数组,多个主机以逗号分隔,格式为host:port,或者host[port1-port2],ip6主机必须在方括号内,如192.168.1.1,[::1]
单播发现依赖传输模块,port默认为9300
主节点选举
集群中,系统自动通过ping进行选举主节点或加入主节点,这是自动的
discovery.zen.ping_timeout,默认为3秒,允许对选举时间进行调整,以应对处理缓慢和拥挤的网络。
discovery.zen.join_timeout,默认为ping_timeout时间的20倍。当一个节点请求加入主节点,它会发送请求信息到主节点,此为请求的超时时间
当主节点发生问题时,现有节点会通过ping重新选举主节点。当节点node.master为false或者node.client为true时,它们将不会选举为主节点;node.master为true的节点一直有午觉权
discovery.zen.master_election.filter_client为true(默认)时,选举主节点时会排除node.client为true或node.data和node.master同时为false的节点
discovery.zen.master_election.filter_data为true时(默认false),选举主节点时大排除node.data为true,node.master为false的节点
discovery.zen.minimum_master_nodes,设置要加入一个新当选的主节点的最小节点数目,或者接收它作为主节点的最小节点数,若不满足,主节点会下台,重新选举
故障检测
有两种故障检测:一是由主节点到所有其他节点的验证,以证明它们还活着;二是每个节点ping主节点验证,以证明主节点还活着,当检测到主节点死掉后,会启动选举过程
控制故障检测使用discovery.zen.fd前缀的设置:
ping_interval,ping检查频率,默认为1秒
ping_timeout,ping超时,默认为30秒
ping_retries,重试次数,默认为3次
主节点是集群中可以改变集群状态(配置)的唯一节点,主节点发布更新,然后等待所有节点的确认应答,discovery.zen.publish_timeout为处理下一个更新队列前的超时时间,默认为30秒
一个健康的集群必须有一个主节点,且有多个满足主节点选举条件的节点,该数字由discovery.zen.minimum_master_nodes设置
discovery.zen.no_master_block用于设置没有有效的主节点时应当拒绝的操作,两两个选择:
all,该节点上的所有行为被拒绝,包括读写,同时拒绝集群状态的读写操作,如得到索引设置
write,基于最后一次集群配置,写操作被拒绝,允许读操作。这会导致部分读取的数据是过期的,因为该节点已从集群中分离,这是默认设置
discovery.zen.no_master_block不适用于基于节点状态的API,如cluster stats/node info/node stats
集群平衡配置
主节点的主要作用是决定哪些分片分配给哪个结点,并在节点间移动分片以平衡整个集群
可以控制分片分配过程的设置:
分片分配设置,对集群进行分配和再平衡操作
基于磁盘的配置,根据可用磁盘空间大小来进行分配设置
分片智能分配,可以控制分片在不同机架或可用性区域中的配置
分片配置过滤,允许某些节点或节点组排除在分配的列表中,常用于需要停止的节点中
所有这些设置都是动态设置,可以通过集群接口进行实时更新
分片分配设置

分片分配过程是分片到节点的一个处理过程,可能发生在初始恢复过程中,副本分配中,再平衡过程中,或当节点被添加或删除时

1、分片分配设置
控制分片的分配和回收
cluster.routing.allocation.enable:禁用或者启用分片的类型,参数:
all,允许所有分片被重新分配
primaries,只允许主分片被重新分配
new_primaries,只允许新的主分片被重新分配
none,不对任何分片重新分配
cluster.routing.allocation.node_concurrent_recoveries:允许在一个节点上同时并发多少个分片分配,默认为2
cluster.routing.allocation.node_initial_primaries_recoveries,当副本分片加入集群时,在一个节点上并行发生分片分配的数量,默认为4
cluster.routing.allocation.same_shard.host:在一个主机上当有多个相同集群名称的分片分配时,是否进行检查,检查主机名和主机ip,默认为false,此设置仅适用于在同一台机器上启动多个节点时配置
indices.recovery.concurrent_streams:从一个节点恢复时,同时打开的网络流量数,默认为3
indices.recovery.concurrent_small_file_streams:从同伴分片恢复时打开每个节点的小文件(小于5M)流的数目,默认2

2、分片平衡设置
控制整个集群的碎片再平衡
cluster.routing.rebalance.enable:启用或禁用特定种类的分片重新平衡,可选参数有:
all,允许所有分片进行分片平衡,默认
primaries,只允许主分片进行平衡
replicas,只允许副本分片进行平衡
none,不允许任何分片进行平衡
cluster.routing.allocation.allow_rebalance:当分片再平衡时允许的操作,可选参数有:
always,总是允许再平衡
indices_primaries_active,只有主节点索引允许再平衡
indices_all_active,所有分片允许再平衡,默认
cluster.routing.allocation.cluster_concurrent_rebalance:再平衡时允许多少个并发的分片同时操作,默认为2

3、启发式分片平衡
确认在何处设置每个碎片的数据
cluster.routing.allocation.balance.shard:在节点上分配每个分片的权重,默认0.45
cluster.routing.allocation.balance.index:在特定节点上,每个索引分配的分片的数量,默认0.55
cluster.routing.allocation.balance.threshold:操作的最小最优化的值,默认1

基于磁盘的配置

es可以根据磁盘大小来决定是否重新进行分片的分配

cluster.routing.allocation.disk.threshold_enabled:是否启用磁盘分配决策,默认为true
cluster.routing.allocation.disk.watermark.low:允许分配时的磁盘空间最小值,可以是比例或者绝对值,如85%或者1G。当磁盘占用超过设定值后,系统将不会对节点进行分配操作
cluster.routing.allocation.disk.watermark.hith:允许保存分片节点磁盘空间的最大值,当超过此值后,系统会把分片迁移到别的节点,默认为90%。可设置比例或实际大小,如500mb
cluster.info.update.interval:检查集群中每个节点的磁盘使用情况的时间间隔,默认为30秒
cluster.routing.allocation.disk.include_relocations:当计算节点磁盘使用时需要考虑当前被分片的情况,默认true
#PUT /_cluster/settings {transient":{"cluster.routing.allocation.disk.watermark.low":"80%","cluster.routing.allocation.disk.watermark.hith":"5gb","cluster.info.update_interval":"1m"}}
#每分钟检查一次磁盘,当磁盘已用空间小于80%时,参与分片分配;当可用空间不足5GB时,将节点分片迁移到别的节点
分片智能分配
解决多个节点在同一虚拟机、同一机架、同一网络区域时,因物理原因多个节点同时出故障的问题。
区域分片分配可以在启用时加上--node.rack_id接指定名称或配置到配置文件中:
elasticsearch --node.rack_id rack_one
cluster.routing.allocation.awareness.attributes:rack_id
也可以通过API接口设置
#假如有两个节点node.rack_id为rack_one,创建一个索引包含5个主分片和一个副本,那么主分片和副本分片会分配到这两个节点上;当我们新添加两个节点,node.rack_id为rack_two后,系统会自动分配主分片到新的节点上,确保没有两个相同的分片在同一区域中;当搜索时,系统会自动处理,只在一个区域中搜索
强制分配属性,解决不允许相同分片副本分配到同一区域的问题。如我们有两个区域,但每个区域的大小只够分配一半的分片
cluster.routing.allocation.awareness.force.zone.values:zone1,zone2
cluster.routing.allocation.awareness.attributes:zone
分片配置过滤
对索引的分片分配进行控制,允许或禁止分配到指定节点
可在移除节点前把节点上的分片移动到其他节点中
#停止10.0.0.1上的所有节点
#PUT http://127.0.0.1:9200/_cluster/settings {"transient":{"cluster.routing.allocation.exclude._ip":"10.0.0.1"}}
#这样,10.0.0.1节点上的分片会被迁移到其他节点
cluster.routing.allocation.include.{attribute}:将索引分配给一个节点,{attribute}至少有一个逗号分隔的值
cluster.routing.allocation.require.{attribute}:将索引分配给一个节点,{attribute}至少有一个逗号分隔的值
cluster.routing.allocation.exclude.{attribute}:将索引分配给一个节点,{attribute}至少有一个逗号分隔的值
attributes可能的值:
_name,通过节点名称匹配节点
_ip,通过ip匹配节点
_host,通过机器名称匹配节点
所有的属性值可以用通配符
#PUT /_cluster/settings {"transient":{"cluster.routing.allocation.include._ip":"192.168.2.*"}}
其他集群配置
cluster.blocks.read_only:使整个集群为只读
日志记录:设置日志记录的级别
#增加indices.recovery模块,其日志级别为DEBUG
PUT /_cluster/settings {"transient":{"logger.indices.recovery":"DEBUG"}}

索引分词器

es分词器,分词原理及过程、添加新的分词器、插件安装等

分词器概念
分词器analyzer,词元token
分词器analyzer由一个分解器tokenizer、零或多个词元过滤器token filters组成;分解器处理前可以有预处理,为字符过滤器character filter;词元过滤器可以完成大小写转换、增加同义词等;处理后的结果称为索引词term
索引分析模块analysis包括分词器analyzer、分解器tokenizer、词元过滤器filters
分词器可以有别名

分词器测试
POST /_analyze
{"tokenizer":"standard","filters":["lowercase","stop"],"text":"SecIsland is a data company"}
analyzer、tokenizer、filters是三个关键字,analyzer在内容上包括tokenizer和filters,所以可以只输入analyzer或者tokenizer和filters自定义分词器
自定义分词器接受分解器tokenzier的逻辑/注册名,以及词元过滤器filter的逻辑名/注册名,自定义分词器不能以_开头,其设置为:
tokenizer,分解器的逻辑/注册名
filter,词元过滤器的逻辑/注册名
char_filter,字符过滤器的逻辑/注册名
position_increment_gap,每个使用本分词器字段的字段值之间可增加的位置,默认为100
中文分词器
smartcn分词器
安装分词器
https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/analysis-smartcn/2.4.5/analysis-smartcn-2.4.5.zip
cd elasticsearch-2.4.5/bin && ./plugin install analysis-smartcn
systemctl restart elasticsearch
卸载: ./plugin remove analysis-smartcn
测试:POST /_analyze {"analyzer":"smartcn","text":"联想是全球最大的笔记本厂商"}
IKAnanlyzer分词器
因为我现在使用的es是2.4.5,所以对应的IK版本为1.10.6
项目地址:https://github.com/medcl/elasticsearch-analysis-ik
https://github.com/medcl/elasticsearch-analysis-ik/archive/v1.10.6.zip
#编译代码
yum install maven
unzip v1.10.6.zip
cd elasticsearch-analysis-ik-1.10.6
#1.10.6对应的es版本是2.4.6,高于2.4.5,所以,需要编辑pom.xml文件,修改<elasticsearch.version>行,否则es会报错无法启动
mvn package
#将编译好的zip包elasticsearch-analysis-ik-1.10.6/target/releases/elasticsearch-analysis-ik-1.10.6.zip
#mkdir analysis-ik
cd elasticsearch-2.4.5/plugins/analysis-ik
unzip elasticsearch-analysis-ik-1.10.6.zip
systemctl restart elasticsearch
#测试
POST /_analyze {"analyzer":"ik_max_word","text":"联想是全球最大的笔记本厂商"}
POST /_analyze {"analyzer":"ik_smart","text":"联想是全球最大的笔记本厂商"}
POST /_analyze {"analyzer":"ik","text":"联想是全球最大的笔记本厂商"}
插件

插件可以添加自定义映射类型、自定义分词器、本地脚本、自定义发现等
插件的类型:
Java插件,插件只包含jar文件,必须安装到集群中的每个节点上,安装后必须重启
站点插件,包含静态web内容,只需在一个节点上安装,不需要重启,通过URL访问,http://127.0.0.1:9200/_plugin/[pluginname]
混合插件,既包含jar文件又包含站点

插件管理

插件通过脚本进行管理,可以安装、查询、删除
./plugin [list/install/remove]

插件安装

#安装官方插件
bin/plugin install analysis-icu
#安装github插件
bin/plugin install [org]/[user|component]/[version]
bin/plugin install lmenezes/elasticsearch-kopf #脚本会先到官方下载,然后到maven.com去下载,然后去github去下载
#直接从maven中央库安装,版本号必须要写
#http://mvnrepository.com/artifact/org.elasticsearch.plugin
bin/plugin install org.elasticsearch.plugin/mapper-attachemts/3.0.0
#从本地安装
bin/plugin install file:///path/to/plugin.zip

有用的插件

#python脚本支持
./plugin install lang-python#使用SQL语法操作ES
#项目地址:https://github.com/NLPchina/elasticsearch-sql/
./plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/2.4.5.0/elasticsearch-sql-2.4.5.0.zip
systemctl restart elasticsearch
使用:
http://192.168.1.10:9200/_plugin/sql/
SELECT * FROM secisland
SELECT * FROM bank WHERE age >30 AND gender = 'm'
select COUNT(*),SUM(age),MIN(age) as m, MAX(age),AVG(age) FROM bank GROUP BY gender ORDER BY SUM(age), m DESC
http://192.168.1.10:2200/_sql?sql=select * from secisland limit 10
注:2.4.5不支持delete命令
插件清单

插件分类:API插件、报警插件、分词插件、发现插件、管理和站点插件、映射器插件、脚本插件、安全插件、快照/恢复插件、传输插件

API插件
对es添加新的API特性或者功能,通常用于搜索或者映射
核心插件是delete-by-query,该插件通过查询删除文档,因为它是内部是一条一条删除的,不要用此方法删除大量文档,会导致耗时较长,比较好的方法是创建一个新的索引,把需要的文档copy过去
DELETE /secisland/secilog/_query?q=user:kimchy
DELETE /secisland/secilog/_query {"query":{"term":{"user":"kimchy"}}}
其它插件:
carrot2 Plugin,基于carrot2或Lingo3G算法的聚合插件
SQL language Plugin,通过SQL语法来搜索ES
WebSocket Change Feed Plugin,通过WebSocket连接到ES节点接收数据报警插件
当ES索引等指标超出阈值时触发报警
Watcher,官方支持的收费报警插件分词插件
核心插件analysis-icu,集成lucene icu模块到ES,支持Unicode的ICU库
analysis-phonetic,语音分析插件
analysis-smartcn,中科院的中文分词插件,不支持扩展,不建议使用
analysis-stempel,支持lucene的stempel analysis模块
社区插件:
IK Analysis Plugin,比较好的中文插件
Mmseg Analysis Plugin,集成lucene mmseg4j-analyzer的插件,支持中文
Pinyin Analysis Plugin,集成Pinyin4j插件,支持汉字和拼音系统之间转换的java库,可自定义拼音输出格式发现插件
核心插件
AWS Cloud,亚马逊云
Azure Cloud,微软云
GCE Cloud,Google云
Multicast,组播插件发送多播消息
社区插件
eskka Discovery Plugin,支持Gossip协议的Akka Cluster集群节点
Kubernets Discovery Plugin,通过Kubernets API发现节点管理和站点插件
Marvel,官方支持的收费插件
Elasticsearch Head Plugin,社区免费

高级配置

es的配置一种是静态配置,另一种是动态配置;静态配置的参数只能在配置文件中事先写好,动态配置可以通过_cluster/settings进行配置

网络相关配置
本地网关配置
本地网关是当所有集群重新启动时存储集群状态和分片数据的模块
下面的静态配置控制集群中每个节点在恢复任何本地存储的分片前,应该等待多长时间
gateway.expected_nodes,集群中预计节点(数据或主节点)的数量,本地分片恢复会在预计数量节点加入集群后开始执行,默认为0
gateway.expected_master_nodes,集群中主节点预计数量,本地分片恢复会在预计数量主节点加入集群后开始,默认0
gateway.expected_data_nodes,集群中数据节点预计数量,本地分片恢复会在预计数量数据节点加入集群后开始,默认0
gateway.recover_after_time,若没有达到预计节点数量,本地分片尝试恢复之前等待配置的时间,默认5m
HTTP配置
HTTP的配置不会动态更新
禁用HTTP,设置http.enabled为false以完全禁用。es节点间以及java客户端使用传输接口进行内部通信,而不是使用HTTP接口,可以在数据节点禁用HTTP

网络配置

es默认绑定本地网络地址

1、常用网络配置

其中,network.host特殊值有:
_[networkInterface]_,网络接口地址,如_eth0_
_local_,回环地址,如127.0.0.1
_site_,本地站点地址,如192.168.1.10
_global_,系统中任何广域地址,如114.11.22.34
这些特殊值默认支持IPv4和IPv6,但也可以使用:ipv4和:ipv6进行限定,如_eth0:ipv4_,仅会绑定eth0接口的IPv4地址2、高级网络配置
通用网络配置中的network.host是同时设置绑定主机和发布主机的快捷方式。但在高级应用的情况中,如在代理服务器后面运行时,需要进行高级配置
network.bink_host,绑定网络接口来监听传入的请求,节点可以绑定多个接口,如两张网卡,或者本地站点地址和本地地址。默认为network.host的值
network.publish_host,发布主机是节点发布到集群中其他节点的单独接口,其他节点可以连接到本节点。节点可以绑定多个地址,但只能有一个发布地址,默认为network.bind_host中的最佳地址,然后根据可达性选择
这些设置接受和network.host同样的配置,接受IP地址、主机名和特殊值3、高级TCP配置
任何使用TCP协议的组件,如HTTP和传输模块共享这些设置
network.tcp.no_deplay,启用或禁用TCP无延迟设置,默认true
network.tcp.keep_alive,启用或禁用TCP保持连接,默认true
network.tcp.reuse_address,地址是否应该被重用,非windows上默认是true
network.tcp.end_buffer_size,TCP发送缓存的大小,默认没有显式设置
network.tcp.receive_buffer_size,TCP接收缓存大小,默认没有显式设置
传输配置

传输模块用于集群中节点间内部通信,传输机制本质上是异步的,线程不会被阻塞等待响应

1、TCP传输
TCP传输是传输模块TCP协议的一种实现

通过使用传输配置文件,es可以对不同接口绑定多个端口,如
transport.profiles.default.port:9300-9400
transport.profiles.default.bind_host:10.0.0.1
transport.profiles.client.port:9500-9600
transport.profiles.dmz.port:9700-9800
transport.profiles.dmz.bind_host:172.16.1.22、本地传输
这个方便的传输用于在JVM中执行集成测试,当使用NodeBuilder#local(true)时,会自动启用3、传输追踪
传输模块有专门的追踪日志,记录到达和发出的请求,通过将transport.tracer设置为TRACE,可以动态激活日志
PUT /_cluster/settings {"transient":{"logger.transport.tracer":"TRACE"}
使用包含和排除设置,可以控制需要追踪的行为
PUT /_cluster/settings {"transient":{"transport.tracer.include":"*","transport.tracer.exclude":"internal:discovery/zen/fd*"}}
脚本配置
脚本默认是关闭的
可以通过配置来启用脚本引擎,在配置文件中添加如下内容
script.inline:true
script.indexed:true
可选的配置值:false,完全禁用;true,启用;sandbox,仅可用沙盒语言执行
默认配置值为:
script.inline:sandbox
script.indexed:sandbox
script.file:true可以在以下操作中执行脚本
aggs,聚合
search,搜索接口,过滤接口或建议接口,如filters、script_fields
update,升级接口
plugin,通用plugin类别下,脚本使用的任何插件
插件也要吧进行自定义操作,格式:${pluginName}_${operation},如在任何脚本引擎上禁用更新和映射
script.update:false
script.mapping:false
也支持明确的脚本语言设置,需要script.engine.<engine>前缀,优先权高于其他通用设置
script.engine.groovy.file.aggs:true
script.engine.groovy.file.mapping:true
script.engine.groovy.file.search:true
script.engine.groovy.file.update:true
script.engine.groovy.indexed.aggs:true
script.engine.groovy.indexed.mapping:true
script.engine.groovy.indexed.update:false
script.engine.groovy.indexed.plugin:false
script.engine.groovy.inline.aggs:true
script.engine.groovy.inline.mapping:false
script.engine.groovy.inline.search:false
script.engine.groovy.inline.update:true
script.engine.groovy.inline.plugin:false
系统默认使用Groovy作为脚本语言,可以通过配置script.default_lang进行修改
Groovy,非沙盒,内置
Expression,沙盒,内置
Mustache,沙盒,内置
JavaScript,非沙盒,elasticsearch-lang-javascript
Python,非沙盒,elasticsearch-lang-python
为增加安全性,es不允许在请求中指定非沙盒语言
脚本使用
使用脚本的三种方式
直接在请求体中使用脚本
把脚本存储在索引中,通过引用脚本id来使用
把脚本存储在本地磁盘中,默认位置elasticsearch/config/scripts,通过引用脚本名称进行使用PUT /secisland/secilog/1 {"eventCount":1,"eventName":"linux login event"}
方式一:
POST /secisland/secilog/1/_update {"script":"ctx._source.eventCount+=count","params":{"count":4}
方式二:
先将脚本存储在es中
POST /_script/groovy/indexedCalculateCount {"script":"ctx._source.eventCount+=count"}
POST /secisland/secilog/1/_upgrade {"script":{"id":"indexedCalculateCount","lang":"groovy","params":{"count":8}}}
方式三:
先把脚本存储在文件中
文件名:indexedCalculateCount.groovy 内容:ctx._source.eventCount+=count
es对文件读取有个时间,不能立即生效,急的话可以重启es
POST /secisland/secilog/1/_update {"script":{"file":"indexedCalculateCount","lang":"groovy","params":{"count":8}}}
脚本配置

 

1、索引脚本
es在名为_scripts的内部索引中存储脚本,并通过id进行引用,脚本请求格式为:/_scripts/{lang}/{id}  其中lang表示语言,id表示编号
保存脚本:
POST /_scripts/groovy/indexedCalculateScore {"scripts":"log(_score*2)+my_modifier"}
使用脚本:
POST /_search
{"query":{"function_score":{"query"{"match":{"body":"foo"}},"functions":[{"script_score":{"script":{"id":"indexedCalculateScore","lang":"groovy","params":{"my_modifier":8}}}}]}}}
查看脚本:
GET /_scripts/groovy/indexedCalculateScore
删除脚本:
DELETE /_scripts/groovy/indexedCalculateScore

2、启用动态脚本
在应用或者代理后执行es,可以从外界保护es,如果允许用户运行内联脚本或索引脚本,会继承运行es的用户权限。因此动态脚本默认仅支持沙盒语言

3、脚本自动重载
周期性扫描config/scripts目录的修改,更新脚本的载入,重载频率可以使用resource.reload.interval设置,默认为60秒
设置script.auto_reload_enabled为false可以完全禁用脚本重载

4、本地(java)脚本
有时,groovy和expressions是不够的,这种情况下,可以执行本地脚本,执行本地脚本的最好方式是编写且安装一个插件

5、lucene表达式脚本
lucene表达式提供一个机制将javascript表达式编译成字节码。表达式脚本也以用于script_score、script_fields、排序脚本和数字型聚合脚本

6、得分
聚合中所有可以使用的脚本,当前文档得分可以用_score获得

7、文档字段
大多数脚本围绕指定字段数据来使用,doc['field_name']可以用来访问文档内指定字段的数据,但只能是简单字段,不能返回json对象,并且只有不分词或单索引词字段才有意义

8、保存的字段
执行脚本时,保存的字段也可以访问,通过使用_fileds['my_field_name'].value或_fields['my_field_name'].values

9、在脚本中访问文档得分
当使用脚本计算文档得分,可以在groovy脚本中使用_score变量访问得分

10、源字段
执行脚本时,可以访问源字段,每个文档都会加载源字段、分析并提供给脚本进行评估,如_source.obj1.obj2.field3

11、groovy内置方法

快照和恢复配置

 

es中可以创建快照,他创建单个索引或整个集群到一个远程的存储库中。在执行快照操作前,需要在es中注册快照仓库。注册仓库的设置需要执行仓库类型请求
PUT /_snapshot/my_backup {"type":"fs","settings":{...repository specific settings...}}
注册后,可以通过查询来得到之前的注册信息。查询支持逗号分隔、支持通配符甚至_all查询多个注册信息
GET /_snapshot/my_buckup
#返回 {"my_backup":{"type":"fs","settings":{"compress":"true","location":"/mount/backups/my_backup"}}}
共享文件系统存储"type":"fs"使用共享文件系统来存储快照。为注册共享文件系统存储库,必须将同一个共享文件系统安装到所有主节点和数据节点的相同位置上。这个位置必须在所有主节点、数据节点上设置path.repo参数。假设共享文件系统安装在/mount/backups/my_backup下,在elasticsearch.yml中设置如下:
path.repo:["/mount/backups","/mount/longterm_backups"]
path.repo支持Windows UNC路径:path.repo:["\\\\MY_SERVER\\Snapshots"]
只有当所有节点都重启后,可以使用下面的命令以名称为my_backup的共享文件系统库进行快照和恢复
PUT /_snapshot/my_backup {"type":"fs","settings":{"location":"/mount/backups/my_backup","compress":true}}
系统也支持相对路径,如
PUT /_snapshot/my_backup {"type":"fs","settings":{"location":"my_backup","compress":true}}
系统支持的参数如下:
location,快照位置,必须
compress,启用快照文件的压缩,压缩仅用于元数据文件,数据文件不进行压缩,默认为true
chunk_size,块大小,如1G,10m,5K,默认为null,不限制
max_restore_bytes_per_sec,每个节点恢复速度,默认为40MB/s
max_snapshot_bytes_per_sec,每个节点生成快照速度,默认为40MB/s
readonly,使存储库只读,默认为false

1、只读仓库
URL仓库("type":"url")用于创建只读方式的数据仓库。URL参数支持HTTP、HTTPS、FTP、File、jar协议
在http、https、ftp协议中,支持白名单,在repositories.url.allowed_urls参数中配置
repositories.url.allowed_urls:["http://www.example.org/root/*","https://*.mydomain.com/*?*#*"]
存储库可以通过插件的方式支持更多,如AWS的S3、Hadoop的HDFS等
注册一个存储库时,它立即在所有主节点和数据节点上验证,以确保在集群中所有节点上都可以使用。验证可以在注册或更新存储库时显示禁止
PUT /_snapshot/s3_repository?verify=false {"type":"s3","settings":{"bucket":"my_s3_bucket","region":"eu-west-1"}}
验证过程也可手动执行
POST /_snapshot/s3_repository/_verify

2、快照
一个存储库可以包含同一个集群的多份快照,快照在集群内名称是唯一的
#创建名称为snapshot_1的快照
PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true
默认会创建包含集群中所有打开和启动的索引的一个快照,也可以通过快照请求中的索引列来改变,如
PUT /_snapshot/my_backup/snapshot_1 {"indices":"index_1,index_2","ignore_unavailable":"true","include_global_state":false}
索引快照是渐进的,即增量方式;快照过程是非阻塞的,不影响搜索和索引
#获取快照信息
GET /_snapshot/my_backup/snapshot_1
#查询正在运行的快照
GET /_snapshot/my_backup/_current
#从存储库中删除快照
DELETE /_snapshot/my_backup/snapshot_1
#删除存储库
DELETE /_snapshot/my_backup  #删除存储库时,仅删除存储库的位置引用,快照本身并不被删除

3、恢复
POST /_snapshot/my_backup/snapshot_1/_restore
默认快照中的所有索引及集群状态将被恢复
include_global_state,指定具体的索引和集群状态被恢复
rename_pattern和rename_replacement,重命名索引,支持正则表达式,该表达式支持引用原始文本
include_aliases设置为false可以防止相关索引的别名被一起恢复
POST /_snapshot/my_backup/snapshot_1/_restore {"indices":"index_1,index_2","ignore_unavailable":"true","include_global_state":"false","rename_pattern":"index_(.+)","rename_replacement":"restored_index_$1"}

4、快照状态
#获得当前运行快照的详细状态信息列表
GET /_snapshot/_status
GET /_snapshot/my_backup/_status
GET /_snapshot/my_backup/snapshot_1/_status
#监视快照信息
GET /_snapshot/my_backup/snapshot_1
在恢复操作时,es集群通常会进入红色状态。因为还原开始恢复索引主分片,此时主分片会变得不可用,红色;恢复完成,es转换为标准复制,创建所需要的复本,黄色,最终,变为绿色

线程池配置

节点包含多个线程池用来改善线程内存消耗,这些线程池有许多与之关联的队列,用来保留等待的请求,而不是丢弃

1、线程池类型
cached,无限的线程池,存在挂起的请求,就会产生一个线程。该线程池用于防止提交的请求被阻塞或者丢弃,线程池中无用线程会在持续期(默认5m)销毁。chched线程池保留为通用线程池。设置空闲时间

fixed,拥有固定大小的线程来操作队列中的请求直到请求没有线程提供服务。size控制线程数量,queue_size控制没有线程执行的请求队列的大小,默认为-1,即无限大。当请求到达且队列已经满了,请求会被中止

scaling,拥有动态数量的线程,线程数据与工作量成正比,且在1和size值之间变化,keep_alive参数决定一个线程的空闲时间

2、处理器设置
处理器数量自动检测,线程池的设置会基于结果自动设置。有时,处理器数量会被错误检测,此时可以使用processors进行明确设置

索引配置

索引模块包括分词、分片控制和分配、字段映射、索引相似性配置、慢查询记录、文件系统配置、控制事务和刷新模块

缓存配置
1、总内存控制
es中有很多控制器以防止内存溢出,每个控制器可以指定使用的最大值。此外,还有一个总的控制器,以确认系统使用的最大内存值。这些配置都可以动态更新
indices.breaker.tatal.limit,总的内存使用大小,默认为JVM堆内存的70%2、列数据内存控制
控制es在加载数据前估计数据量大小,若估计超过设定的阀值,会产生异常阻止该字段数据的加载
indices.breaker.fielddata.limit,列数据内存大小限制,默认为JVM堆内存的60%
indices.breaker.fielddata.overhead,所有列估计内存大小的乘积,默认是1.033、请求内存控制
防止每个请求的数据结构超过阀值
indices.breaker.request.limit,请求控制器大小,默认为JVM的40%
indices.breaker.request.overhead,所有请求的乘积,默认为14、数据缓存
现场数据缓存用于排序或聚合时,将所有字段值加载到内存中以便快速访问文档中的值
indices.fielddata.cache.size,数据缓存的最大值,可以是一个节点堆内存大小的比例,如30%,也可以是绝对值,如12GB,默认是无限。这个配置为静态配置,必须在节点每个数据节点启动前配置好,可以通过/_nodes/stats查看使用情况

5、节点查询缓存
缓存查询的结果。每个节点都有一个查询缓存。缓存使用最近最少使用算法,缓存满时,最少使用的数据优先删除。查询缓存只有使用过滤时才会起作用
indices.queries.cache.size,5%或者512MB,默认JVM的10%

6、索引缓冲区
用于存储新的索引文档,缓冲区满后,缓冲区的文件写入磁盘上的一个段。静态设置,必须在集群中每个数据节点上配置
indices.memory.index_buffer_size,节点索引缓冲区大小,为比例或绝对大小,默认为JVM的10%
indices.memory.min_index_buffer_size,最小索引缓冲区,默认48MB
indices.memory.max_index_buffer_size,最大索引缓冲区,默认无限制
indices.memory.min_shard_index_buffer_size,分配给每个分片索引缓冲区的内存最小值,默认4MB

7、分片请求缓存
请求缓存只缓存查询条件size=0的搜索,缓存的内容有hits.total、aggregations、suggestions,不缓存原始的hits。通过now查询的结果不缓存
缓存失效:只有分片数据实际上变化时刷新分片缓存才会失效。当缓存不够时,最少使用的数据将被删除
#默认缓存未启用,但在创建新的索引时可启用
PUT /secisland {"settings":{"index.requests.cache.enable":true}}
#动态设置
PUT /secisland/_settings {"index.requests.cache.enable":true}
分片请求缓存是在节点级别进行管理的,默认为JVM的1%
indices.requests.cache.size:2%

8、索引恢复
indices.recovery.concurrent_streams,默认为3
indices.recovery.concurrent_small_file_streams,默认为2
indices.recovery.file_chunk_size,默认512KB
indices.recovery.translog_ops,默认1000
indices.recovery.translog_size,默认512KB
indices.recovery.compress,默认为true
indices.recovery.max_bytes_per_sec,默认为40MB

9、TTL区间
文档有个ttl值,可以设置当过期时是否需要删除
indices.ttl.interval,删除程序的运行时间,默认60s
indices.ttl.bulk_size,删除处理与批量请求的数量,默认10000

索引碎片分配
1、碎片分配过滤
控制哪个碎片被分配到哪个节点,启动时,可能随机将元数据属性分配给各个节点
#将test索引移动到bit或medium节点
PUT /test/_settings {"index.routing.allocation.include.size":"big,medium"}
#从small节点移除test索引
PUT /test/_settings {"index.routing.allocation.exclude.size":"small"}
#若指定多个规则,则所有条件必须满足
PUT /test/_settings {"index.routing.allocation.include.size":"big","index.routing.allocation.include.rack":"rack1"}
下面的设置是动态的,允许活动索引从一个节点移动到别一个节点
index.routing.allocation.include.{attribute},分配索引到一个节点,节点的{attribute}拥有至少一个逗号分隔的值
index.routing.allocation.require.{attribute},分配索引到一个节点,节点的{attribute}拥有所有逗号分隔的值
index.routing.allocation.exclude.{attribute},分配索引到一个节点,节点的{attribute}不拥有任何逗号分隔的值
{attribute}包含:
_name,通过节点名匹配节点
_host_ip,通过主机IP匹配节点,IP和主机名
_publish_ip,通过发布IP地址匹配节点
_ip,通过_host_ip或_publish_ip匹配
_host,通过主机名匹配节点
PUT /test/_settings {"index.routing.allocation.include._ip":"192.168.2.*"2、延迟分配
延迟分配由于节点离开造成的未赋值碎片
副本分片的分配可以通过动态设置index.unassigned.node_left.delayed_timeout延迟,默认为1m
可以在一个活动索引(或所有索引)上更新设置
PUT /_all/_settings {"settings":{"index.unassigned.node_left.delayed_timeout":"5m"}
永久移除节点
如果一个节点不会返回集群且希望es立即分配缺失分片,可设置超时为0
PUT /_all/_settings {"settings":{"index.unassigned.node_left.delayed_timeout":"0"}}
在缺失分片已经开始恢复后重设延时3、每个节点的总碎片
每个节点对相同的索引限制碎片数量。
下面的动态设置可以强制限制每个节点允许单个索引分片的总数量
index.rouging.allocation.total_shards_per_node,分配到单个节点的最大分片数量(副本和主分片),默认没有限制
cluster.routing.allocation.tatal_shards_per_node,分配到单个节点的最大总分片数量(副本和主分片),默认没有限制

合并

合并小的分片为更大的分片来保持索引大小在范围内
index.merge.scheduler.max_thread_count,一次合并的最大线程数

相似模块

相似性(得分/排名模型)定义了匹配文档如何进行评分,相似性是针对字段的,通过映射可以对每个字段定义不同的相似性模块

1、配置相似性
"similarity":{"my_similarity":{"type":"DFR","basic_model":"g","after_effect":"1","normalization":"h2","nomalization.h2.c":"3.0"}}
在映射中使用自定义相似性模块
{"book":{"properties":{"title":{"type":"string","similarity":"my_similarity"}}}2、可用的相似性模块
默认相似性模块基于TF/IDF模式,拥有选项有:
discount_overlaps:决定重叠词元(词元的位置增量为0)是否要被忽略。默认true。
类型名:default
BM25相似性模块:基于TF/IDF,拥有内置的tf标准且对短字段(如名字)效率更高
参数:
k1,控制非线性索引词频率标准、饱和度
b,控制文档长度标准化到tf值的程度
discount_overlaps,决定重叠词元是否要被忽略,默认true
类型名:BM25
DFR相似性模块:实现随机性框架的分支
参数:
basic_model,可能的值有be、d、g、if、in、ine、p
after_effect,可能的值有no、b、l
nomalization,可能的值有no、h1、h2、h3、z
类型名:DFR
IB相似性模块:基于信息的模式,算法基于设想。对于书面文本这个方式会对比不同作者的写作风格
参数:
distribution,可能值ll、spl
lambda,可能值df、ttf
normalization,同DFR
类型名:IB
LM Dirichlet相似性模块
参数:
mu,默认2000
类型名:LMDirichlet
LM Jelined Mercer相似性模块
参数:
lambda,最佳值取决于采集和查询,标题查询约为0.1,长查询约为0.7
类型名:LMJelinekMercer
在elasticsearch.yml中要吧修改默认相似性模块
index.similarity.default.type:BM25
响应慢日志监控
1、搜索慢日志
该配置只针对当前分片节点有效
index.search.slowlog.threshold.query.warn:10s
index.search.slowlog.threshold.query.info:5s
index.search.slowlog.threshold.query.debug:2s
index.search.slowlog.threshold.query.trace:500ms
index.search.slowlog.threshold.fetch.warn:1s
index.search.slowlog.threshold.fetch.info:800ms
index.search.slowlog.threshold.fetch.debug:500ms
index.search.slowlog.threshold.fetch.trace:200ms
这些设置是动态的,且可以对每个索引进行设置
默认搜索慢日志没有启用(设置为-1),日志级别(warn、info、debug、trace),日志记录是在分片级别范围完成的
默认的配置文件是在logging.yml文件中:index_search_slow_log_file2、索引慢日志
日志文件以_index_indexing_slowlog.log结尾
日志和阈值在elasticsearch.yml中配置
index.indexing.slowlog.threshold.index.warn:10s
index.indexing.slowlog.threshold.index.info:5s
index.indexing.slowlog.threshold.index.debug:2s
index.indexing.slowlog.threshold.index.trace:500ms
index.indexing.slowlog.level:info
index.indexing.slowlog.source:1000
默认会记录_source中前1000个字符到慢日志中。设置为false或0会完全路过日志记录源,true则记录整个源
默认的配置文件在logging.yml文件中:index_indexing_slow_log_file
存储
存储模块可以控制索引数据如何在磁盘上存储和访问
windows64位:mmapfs;windows32位:simplefs;其他default,混合niofs和mmapfs
可以通过在elasticsearch.yml中配置
index.store.type:niofs
也可以在索引创建时静态设置
PUT /secisland {"settings":{"index.store.type":"niofs"}}
simplefs,使用随机存取文件,并发性较差,多线程会受到阻塞。当需要保留索引时,通常用niofs
niofs,使用NIO存储分片索引,多线程可以从同一文件同时读取数据,windows中不推荐这个类型,因为SUN Java的实现存在漏洞
mmapfs,通过映射文件到内存mmap存储分片索引,内存映射在进程中使用虚拟内存地址空间一部分,需要确保有充足虚拟地址空间
default_fs,NIO FS和MMapFS的混合,对每个类型的文件选择最佳的文件系统,如果索引词字典特别大,可以应用地址空间设置 sysctl -w vm.max_map_count=262144
事务日志

 

为防止数据丢失,每个分片都有事务日志translog或与之相关的日志,任何索引或删除操作在lucene索引内部执行后会被写入事务日志
flush操作是执行lucene提交并开始新的事务日志的过程

1、冲洗设置
下面的动态更新设置控制内存缓冲区数据保存到磁盘的频率
index.translog.flush_threshold_size,一旦事务日志达到这个大小,冲洗操作就会执行,默认512MB
index.translog.flush_threshold_ops,多少个操作之后执行冲洗,默认unlimited
index.translog.flush_threshold_period,无论事务日志大小,触发冲洗操作需要等待的时间,默认30m
index.translog.interval,多久检查一次不否需要执行冲洗操作,在间隔值和2倍间隔值之间随机,默认5s

2、事务日志设置
每个索引使用下面的动态更新设置控制事务日志
index.translog.sync_interval,事务日志多久被提交和同步到磁盘上,默认5s
index.translog.durability,请求完成后,事务日志是否同步和提交。request(默认),每次请求之后执行同步和提交。在硬件失败的情况下,所有收到的写入会事先提交到磁盘上;async经过一个同步间隔,都会后台执行同步和提交,在硬件失败的情况下,从最后一次自动提交之后收到的写入都会被丢弃
index.translog.fs.type,是否在内存中缓存事务日志。buffered(默认),事务日志先写入内存中64KB大小的缓存,且只有当缓存填满时才会写入磁盘,或者同步写请求或同步间隔触发;simple,事务日志立即写入文件系统,不用缓存,这些写入只会在同步和提交被触发时才会保存在磁盘上

 

转载请注明:轻风博客 » elasticsearch技术解析与实战(五) 集群管理和索引分词器及高级配置

喜欢 (0)or分享 (0)