文章目录

  • 1 ElasticSearch 介绍
    • 1.1 介绍
    • 1.2 原理与应用
      • 1.2.1索引结构
      • 1.2.3 RESTful应用方法
  • 2 ElasticaSearch 安装
    • 2.1 安装
    • 2.2 配置文件
      • 2.2.1 三个配置文件
    • 2.2.2 elasticsearch.yml
      • 2.2.3 jvm.options
      • 2.2.4 log4j2.properties
      • 2.2.5 系统配置(linux)
    • 2.3 启动ES
    • 2.4 head 插件安装
  • 3 ES 快速入门
    • 3.1 创建索引库
    • 3.2 创建映射
      • 3.2.1 概念说明
      • 3.2.2 创建映射
    • 3.3 创建文档
    • 3.4 搜索文档
      • 3.4.1查询结果分析
  • 4 IK 分词器
      • 4.1 测试分词器
    • 4.2 安装IK分词器
    • 4.3 两种分词模式
    • 4.4 自定义词库
  • 5 映射
    • 5.1 映射维护方法
    • 5.2 常用映射类型
      • 5.2.1 text文本字段
      • 5.2.2 keyword关键字字段
      • 5.2.3 date日期类型
      • 5.2.4 数值类型
  • 6 索引管理
    • 6.1 搭建工程
      • 6.1.1 ES客户端
      • 6.1.2 创建搜索(Springboot)工程
    • 6.2 创建索引库
      • 6.2.1 API
      • 6.2.2 Java Client
    • 6.3 添加文档
    • 6.4 查询文档
    • 6.5 更新文档
    • 6.6 删除文档
  • 7 搜索管理
    • 7.1 准备环境
      • 7.1.2 插入测试数据
      • 7.1.3 简单搜索
    • 7.2 DSL 搜索
      • 7.2.1 查询所有文档
      • 7.2.2 分页查询
      • 7.2.3 Term Query
      • 7.2.4 根据id精确匹配
      • 7.2.5 match Query
      • 7.2.6 multi Query
      • 7.2.7 布尔查询
      • 7.2.8 过虑器
      • 7.2.9 排序
      • 7.2.10 高亮显示
  • 8 集群管理
    • 8.1 集群结构
  • 8.2 搭建集群
    • 8.2.1 结点的三个角色
    • 8.2.2创建结点 1
    • 8.2.3创建结点2
    • 8.2.4 启动测试
    • 8.2.5 集群的健康

1 ElasticSearch 介绍

1.1 介绍

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。[来源于百度百科]
官方网址:https://www.elastic.co/cn/products/elasticsearch
文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html
Github :https://github.com/elastic/elasticsearch
归结为两点:elasticsearch是一个基于Lucene的高扩展的分布式搜索服务器,支持开箱即用;elasticsearch隐藏了Lucene的复杂性,对外提供Restful 接口来操作索引、搜索。
突出优点:扩展性好,可部署上百台服务器集群,处理PB级数据;近实时的去索引数据、搜索数据。各种全文索引工具对比

1.2 原理与应用

1.2.1索引结构


ES的索引采用的是倒排索引的方式,除了存文档之外还存储了分词数据集,每个词都会记录与之关联的文档。在检索的时候就很方便的通过词来找到对应的文档。

1.2.3 RESTful应用方法

Elasticsearch 使用的是标准的 RESTful 风格的 API 和 JSON。此外,还构建和维护了很多其他语言的客户端,例如 Java、Python、.NET、SQL 和 PHP以及其他社区客户端。这些客户端使用起来简单自然,而且就像 Elasticsearch 一样,不会对您的使用方式进行限制。

2 ElasticaSearch 安装

2.1 安装

安装配置:
1、新版本要求至少jdk1.8以上。
2、支持tar、zip、rpm等多种安装方式。
在windows下开发建议使用ZIP安装方式。
3、支持docker方式安装
详细参见:https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html
下载并解压 ES: Elasticsearch 6.2.4

2.2 配置文件

2.2.1 三个配置文件

ES的配置文件的地址根据安装形式的不同而不同:使用zip、tar安装,配置文件的地址在安装目录的config下;使用RPM安装,配置文件在/etc/elasticsearch下;使用MSI安装,配置文件的地址在安装目录的config下,并且会自动将config目录地址写入环境变量ES_PATH_CONF。
配置文件如下:

  • elasticsearch.yml : 用于配置Elasticsearch运行参数
  • jvm.options : 用于配置Elasticsearch JVM设置
  • log4j2.properties: 用于配置Elasticsearch日志

2.2.2 elasticsearch.yml

配置格式是YAML,可以采用如下两种方式:

  • 方式1:层次方式
    path: data: /var/lib/elasticsearch logs: /var/log/elasticsearch
  • 方式2:属性方式
    path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch
#设置为true可以锁住ES使用的内存,避免内存与swap分区交换数据。
bootstrap.memory_lock: false
#配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。
cluster.name: es-learning
#设置对外服务的http端口,默认为9200。
http.port: 9200
#设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip。
network.host: 0.0.0.0
# 指定该节点是否存储索引数据,默认为true。
node.data: true
#ingest node主要是通过使用ingest pipeline来对文档在索引之前进行转换或者增强。
node.ingest: true
#指定该节点是否有资格被选举成为master结点,默认是true,如果原来的master宕机会重新选举新的master。
node.master: true
#单机允许的最大存储结点数,通常单机启动一个结点建议设置为1,开发环境如果单机启动多个节点可设置大于1.
node.max_local_storage_nodes: 1
#节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,
#方便管理一个或多个节点组成一个cluster集群,集群是一个逻辑的概念,节点是物理概念。
node.name: learning-node1
#path.conf: 设置配置文件的存储路径,tar或zip包安装默认在es根目录下的config文件夹,rpm安装默认在/etc/elasticsearch
#path.plugins: 设置插件的存放路径,默认是es根目录下的plugins文件夹
#设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开。
path.data: D:\Elastic\6.2.4\data
#设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.logs: D:\Elastic\6.2.4\logs
#集群结点之间通信端口
transport.tcp.port: 9300
#设置集群中master节点的初始列表。
#discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
#设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些。
#discovery.zen.ping.timeout: 3s
#主结点数量的最少值 ,此值的公式为:(master_eligible_nodes / 2) + 1 ,比如:有3个符合要求的主结点,那么这里要设置为2。
#discovery.zen.minimum_master_nodes: 1
#如果启用了 HTTP 端口,那么此属性会指定是否允许跨源 REST 请求。
http.cors.enabled: true
#跨域访问允许的域名地址
http.cors.allow-origin: /.*/

2.2.3 jvm.options

在jvm.options中设置最小及最大的JVM堆内存大小:-Xms、-Xmx 建议两个值设置为相等且不超过物理内存的一半。

2.2.4 log4j2.properties

日志文件设置,ES使用log4j,采用默认配置即可,可以更具不同环境需要修改日志级别的配置。

2.2.5 系统配置(linux)

在linux上根据系统资源情况,可将每个进程最多允许打开的文件数设置大些。

#查询当前文件数
su limit -n
#设置limit的值
sudo ulimit ‐n 65536

也可以通过修改 /etc/security/limits.conf 添加elasticsearch ‐ nofile 65536 进行持久设置.

2.3 启动ES

进入bin目录,在cmd下运行:elasticsearch.bat
浏览器输入:http://localhost:9200
显示结果如下(配置不同内容则不同)说明 ES启动成功:

{"name" : "learning-node1","cluster_name" : "es-learning","cluster_uuid" : "bOyFIKYdT1Cya41fqsW0VQ","version" : {"number" : "6.2.4","build_hash" : "ccec39f","build_date" : "2019-06-12T20:37:28.497551Z","build_snapshot" : false,"lucene_version" : "7.2.1","minimum_wire_compatibility_version" : "5.6.0","minimum_index_compatibility_version" : "5.0.0"},"tagline" : "You Know, for Search"
}

2.4 head 插件安装

head插件是ES的一个可视化管理插件,用来监视ES的状态,并通过head客户端和ES服务进行交互,比如创建映射、创建索引等,head的项目地址在https://github.com/mobz/elasticsearch-head 。从ES6.0开始,head插件支持使用node.js运行。安装node.js
2、下载head并运行

git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
open http://localhost:9100/


就是一个简单的图形操作界面,使用方式就不介绍了。

3 ES 快速入门

ES作为一个索引及搜索服务,对外提供丰富的REST接口,新使用几个快速入门的实例对ES的使用方法及流程有个初步的认识。

3.1 创建索引库

ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档。它就相当于MySQL中的表,或相当于Mongodb中的集合。关于索引这个语:

  • 索引(名词):ES是基于Lucene构建的一个搜索服务,它要从索引库搜索符合条件索引数据。
  • 索引(动词):索引库刚创建起来是空的,将数据添加到索引库的过程称为索引。

下边介绍两种创建索引库的方法,它们的工作原理是相同的,都是客户端向ES服务发送命令。
put http://localhost:9200/索引库名称

{"settings":{"index":{"number_of_shards":1,"number_of_replicas":0}    }
}
  • number_of_shards:设置分片的数量,在集群中通常设置多个分片,表示一个索引库将拆分成多片分别存储不同的结点,提高了ES的处理能力和高可用性,入门程序使用单机环境,这里设置为1。
  • number_of_replicas:设置副本的数量,设置副本是为了提高ES的高可靠性,单机环境设置为0.
    如下是创建的例子,创建es_index索引库,共1个分片,0个副本:

3.2 创建映射

3.2.1 概念说明

在索引中每个文档都包括了一个或多个field,创建映射就是向索引库中创建field的过程,下边是document和field与关系数据库的概念的类比:
文档(Document) —— Row记录
字段(Field) —— Columns 列
注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,ES官方将在ES9.0版本中彻底删除type。
上边讲的创建索引库相当于关系数据库中的数据库还是表?

  • 如果相当于数据库就表示一个索引库可以创建很多不同类型的文档,这在ES中也是允许的。
  • 如果相当于表就表示一个索引库只能存储相同类型的文档,ES官方建议 在一个索引库中只存储相同类型的文档。

3.2.2 创建映射

请求命令如下:
post http://localhost:9200/索引库名称 /类型名称/_mapping
创建类型为es_index的映射,共包括两个字段:name、description
由于ES6.0版本还没有将type彻底删除,所以暂时把type起一个没有特殊意义的名字。
post 请求:http://localhost:9200/es_index/doc_type/_mapping
表示:在 es_index索引库下的doc_type类型下创建映射。doc_type是类型名,可以自定义,在ES6.0中要弱化类型的概念,给它起一个没有具体业务意义的名称。

{"properties": {   "name": {"type": "text"},"description": {"type": "text"}}
}

3.3 创建文档

ES中的文档相当于MySQL数据库表中的记录。
请求方式:POST或PUT (如果不指定id值ES会自动生成ID) http://localhost:9200/es_index/doc_type/id
http://localhost:9200/es_index/doc_type/6666

{"name":"全文检索-Elasticearch","description":"Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。"
}

3.4 搜索文档

1、根据id查询文档
请求方式:GET http://localhost:9200/es_index/doc_type/6666

2、查询所有记录
请求方式:GET http://localhost:9200/es_index/doc_type/_search

2、查询名称中包括 “全文” 的的记录
请求方式:GET http://localhost:9200/es_index/doc_type/_search?q=name:全文

3.4.1查询结果分析

分析以下查询结果:

{"took": 77,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": 1,"max_score": 1.179499,"hits": [{"_index": "es_index","_type": "doc_type","_id": "6666","_score": 1.179499,"_source": {"name": "全文检索-Elasticearch","description": "Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。"}}]}
}
  • took:本次操作花费的时间,单位为毫秒。
  • timed_out:请求是否超时
  • _shards:说明本次操作共搜索了哪些分片
  • hits:搜索命中的记录
  • hits.total : 符合条件的文档总数 hits.hits :匹配度较高的前N个文档
  • hits.max_score:文档匹配得分,这里为最高分
  • _score:每个文档都有一个匹配度得分,按照降序排列。
  • _source:显示了文档的原始内容。

4 IK 分词器

4.1 测试分词器

在添加文档时会进行分词,索引中存放的就是一个一个的词(term),当你去搜索时就是拿关键字去匹配词,最终找到词关联的文档。
测试当前索引库使用的默认分词器:
请求方式POST : http://localhost:9200/_analyze

{"text":"测试分词器"}


当前索引库使用的默认分词器对中文就是单字分词。

4.2 安装IK分词器

使用IK分词器可以实现对中文分词的效果。
下载IK分词器:(Github地址:https://github.com/medcl/elasticsearch-analysis-ik)
解压,并将解压的文件拷贝到ES安装目录的plugins下的ik目录下

指定IK分词,再次测试分词效果

{"text":"测试分词器","analyzer":"ik_max_word" }

4.3 两种分词模式

ik分词器有两种分词模式:ik_max_word和ik_smart模式。

  • ik_max_word 会将文本做最细粒度的拆分
{"tokens": [{"token": "中华人民共和国","start_offset": 0,"end_offset": 7,"type": "CN_WORD","position": 0},{"token": "中华人民","start_offset": 0,"end_offset": 4,"type": "CN_WORD","position": 1},{"token": "中华","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 2},{"token": "华人","start_offset": 1,"end_offset": 3,"type": "CN_WORD","position": 3},{"token": "人民共和国","start_offset": 2,"end_offset": 7,"type": "CN_WORD","position": 4},{"token": "人民","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 5},{"token": "共和国","start_offset": 4,"end_offset": 7,"type": "CN_WORD","position": 6},{"token": "共和","start_offset": 4,"end_offset": 6,"type": "CN_WORD","position": 7},{"token": "国","start_offset": 6,"end_offset": 7,"type": "CN_CHAR","position": 8}]
}
  • ik_smart 会做最粗粒度的拆分

4.4 自定义词库

如果要让分词器支持一些专有词语,可以自定义词库。iK分词器自带一个main.dic的文件,在插件的config目录中。我们可以在上边的目录中新建一个自定义的词库文件(注意文件格式为utf-8(不要选择utf-8 BOM)),然后可以在
IKAnalyzer.cfg.xml中配置。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict"></entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords"></entry><!--用户可以在这里配置远程扩展字典 --><!-- <entry key="remote_ext_dict">words_location</entry> --><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

5 映射

上边章节安装了ik分词器,如果在索引和搜索时去使用ik分词器呢?如何指定其它类型的field,比如日期类型、数值类型等。
本章节学习各种映射类型及映射维护方法。

5.1 映射维护方法

1、查询所有索引的映射:
GET: http://localhost:9200/_mapping

2、创建映射
post 请求:http://localhost:9200/es_index/doc_type/_mapping

{"properties": {   "name": {"type": "text"},"description": {"type": "text"},"type": {"type": "keyword"}}
}


3、更新映射
映射创建成功可以添加新字段,已有字段不允许更新。
4、删除映射
通过删除索引来删除映射。

5.2 常用映射类型

5.2.1 text文本字段

ES6.2核心的字段类型如下:

字符串包括 text和keyword两种类型。text类型的可以设置的属性如下:

  • 1)analyzer属性指定分词器。
    如指定name的字段类型为text,使用ik分词器的ik_max_word分词模式。对于ik分词器建议是索引时使用ik_max_word将搜索内容进行细粒度分词,搜索时使用ik_smart提高搜索精确性。
    "name":{"type":"text","analyzer":"ik_max_word","search_analyzer":"ik_smart"}
  • 2)index 属性指定是否索引。
    默认为index=true,即要进行索引,只有进行索引才可以从索引库搜索到。
    但是也有一些内容不需要索引,比如:商品图片地址只被用来展示图片,不进行搜索图片,此时可以将index设置为false。
"logo":{"type":"text","index":false}
  • 3)store
    是否在source之外存储,每个文档索引后会在 ES中保存一份原始文档,存放在"_source"中,一般情况下不需要设置store为true,因为在_source中已经有一份原始文档了。

5.2.2 keyword关键字字段

上边介绍的 text文本字段在映射时要设置分词器,keyword字段为关键字字段,通常搜索keyword是按照整体搜索,所以创建keyword字段的索引时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。

    "mobile":{"type":"keyword"}

5.2.3 date日期类型

日期类型不用设置分词器,通常用于排序。

  • 1)format 设置日期格式
    设置允许date字段存储年月日时分秒、年月日及毫秒三种格式。
{"timestamp":{"type":"date","format":"yyyy‐MM‐dd HH:mm:ss || yyyy‐MM‐dd"}
}

5.2.4 数值类型

ES6.2数值类型官方文档

原则:尽量选择范围小的类型,提高搜索效率;对于浮点数尽量用比例因子,比如一个价格字段,单位为元,我们将比例因子设置为100这在ES中会将你传入的数值乘100后存储,映射如下:

{"price":{"type":"scaled_float","scaling_factor":100}
}

如果输入的价格是23.456,ES会将23.456乘以100再取一个接近原始值的数,得出2346。使用比例因子的好处是整型比浮点型更易压缩,节省磁盘空间。如果比例因子不适合,则从下表选择范围小的去用:

6 索引管理

6.1 搭建工程

6.1.1 ES客户端

ES提供多种不同的客户端:
1、TransportClient ES提供的传统客户端,官方计划8.0版本删除此客户端。
2、RestClient 是官方推荐使用的,它包括两种:Java Low Level REST Client和 Java High Level REST Client。ES在6.0之后提供 Java High Level REST Client, 两种客户端官方更推荐使用 Java High Level REST Client,不过当
前它还处于完善中,有些功能还没有。本文准备采用 Java High Level REST Client,如果它有不支持的功能,则使用Java Low Level REST Client。

6.1.2 创建搜索(Springboot)工程

  1. 添加依赖:
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch‐rest‐high‐level‐client</artifactId><version>6.2.4</version>
</dependency>
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>6.2.4</version>
</dependency>
  1. 配置文件 application.yml
server:port: ${port:9090}
spring:application:name: es‐search‐serviceelasticsearch:hostlist: ${eshostlist:127.0.0.1:9200} #多个结点中间用逗号分隔
  1. 配置类ElasticsearchConfig
package com.qqxhb.search.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticsearchConfig {@Value("${elasticsearch.hostlist}")private String hostlist;@Beanpublic RestHighLevelClient restHighLevelClient(){//解析hostlist配置信息String[] split = hostlist.split(",");//创建HttpHost数组,其中存放es主机和端口的配置信息HttpHost[] httpHostArray = new HttpHost[split.length];for(int i=0;i<split.length;i++){String item = split[i];httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");}//创建RestHighLevelClient客户端return new RestHighLevelClient(RestClient.builder(httpHostArray));}//项目主要使用RestHighLevelClient,对于低级的客户端暂时不用    @Beanpublic RestClient restClient(){//解析hostlist配置信息String[] split = hostlist.split(",");//创建HttpHost数组,其中存放es主机和端口的配置信息HttpHost[] httpHostArray = new HttpHost[split.length];for(int i=0;i<split.length;i++){String item = split[i];httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");}return RestClient.builder(httpHostArray).build();}
}

6.2 创建索引库

6.2.1 API

创建索引: put http://localhost:9200/索引名称

{"settings":{"index":{"number_of_shards":1,"number_of_replicas":0}    }
}

创建映射: put http://localhost:9200/索引库名称 /类型名称/_mapping

{"properties": {   "name": {"type": "text","analyzer":"ik_max_word","search_analyzer":"ik_smart"},"description": {"type": "text","analyzer":"ik_max_word","search_analyzer":"ik_smart"},"studymodel": {"type": "keyword"},"price": {"type": "float"},"timestamp": {"type":   "date",      "format": "yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd||epoch_millis"      }    }
}

6.2.2 Java Client

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestIndex {@AutowiredRestHighLevelClient client;@AutowiredRestClient restClient;//创建索引库@Testpublic void testCreateIndex() throws IOException {//创建索引请求对象,并设置索引名称CreateIndexRequest createIndexRequest = new CreateIndexRequest("es_learning");//设置索引参数createIndexRequest.settings(Settings.builder().put("number_of_shards",1).put("number_of_replicas",0));//设置映射createIndexRequest.mapping("doc_type"," {\n" +" \t\"properties\": {\n" +"           \"name\": {\n" +"              \"type\": \"text\",\n" +"              \"analyzer\":\"ik_max_word\",\n" +"              \"search_analyzer\":\"ik_smart\"\n" +"           },\n" +"           \"description\": {\n" +"              \"type\": \"text\",\n" +"              \"analyzer\":\"ik_max_word\",\n" +"              \"search_analyzer\":\"ik_smart\"\n" +"           },\n" +"           \"studymodel\": {\n" +"              \"type\": \"keyword\"\n" +"           },\n" +"           \"price\": {\n" +"              \"type\": \"float\"\n" +"           }\n" +"        }\n" +"}", XContentType.JSON);//创建索引操作客户端IndicesClient indices = client.indices();//创建响应对象CreateIndexResponse createIndexResponse = indices.create(createIndexRequest);//得到响应结果boolean acknowledged = createIndexResponse.isAcknowledged();System.out.println(acknowledged);}//删除索引库@Testpublic void testDeleteIndex() throws IOException {//删除索引请求对象DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("xc_course");//删除索引DeleteIndexResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest);//删除索引响应结果boolean acknowledged = deleteIndexResponse.isAcknowledged();System.out.println(acknowledged);}
}

6.3 添加文档

 //添加文档@Testpublic void testAddDoc() throws IOException {//准备json数据Map<String, Object> jsonMap = new HashMap<>();jsonMap.put("name", "spring cloud");jsonMap.put("description", "注册中心eureka。");jsonMap.put("studymodel", "201001");SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss");jsonMap.put("timestamp", dateFormat.format(new Date()));jsonMap.put("price", 5.6f);//索引请求对象IndexRequest indexRequest = new IndexRequest("es_learning","doc_type");//指定索引文档内容indexRequest.source(jsonMap);//索引响应对象IndexResponse indexResponse = client.index(indexRequest);//获取响应结果DocWriteResponse.Result result = indexResponse.getResult();System.out.println(result);}

6.4 查询文档

/查询文档
@Test
public void getDoc() throws IOException {GetRequest getRequest = new GetRequest("es_learning","doc_type","mm6qWWsBNAqzzaUTFEOB");GetResponse getResponse = client.get(getRequest);boolean exists = getResponse.isExists();Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();System.out.println(sourceAsMap);
}

6.5 更新文档

ES更新文档的顺序是:先检索到文档、将原来的文档标记为删除、创建新文档、删除旧文档,创建新文档就会重建索引。

//更新文档@Testpublic void updateDoc() throws IOException {UpdateRequest updateRequest = new UpdateRequest("es_learning", "doc_type",
"mm6qWWsBNAqzzaUTFEOB");Map<String, String> map = new HashMap<>();map.put("name", "spring cloud实战");updateRequest.doc(map);UpdateResponse update = client.update(updateRequest);RestStatus status = update.status();System.out.println(status);}

6.6 删除文档

//根据id删除文档@Testpublic void testDelDoc() throws IOException {//删除文档idString id = "mm6qWWsBNAqzzaUTFEOB";//删除索引请求对象DeleteRequest deleteRequest = new DeleteRequest("es_learning","doc",doc_type);//响应对象DeleteResponse deleteResponse = client.delete(deleteRequest);//获取响应结果DocWriteResponse.Result result = deleteResponse.getResult();System.out.println(result);}

7 搜索管理

7.1 准备环境

7.1.1 创建映射
创建es_learning索引库。
创建如下映射
POST: http://localhost:9200/es_learning/doc_type/_mapping

{"properties":{"description":{"type":"text","analyzer":"ik_max_word","search_analyzer":"ik_smart"},"name":{"type":"text","analyzer":"ik_max_word","search_analyzer":"ik_smart"},"logo":{"type":"text","index":false},"price":{"type":"float"},"studymodel":{"type":"keyword"},"timestamp":{"type":"date","format":"yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd||epoch_millis"}}
}

7.1.2 插入测试数据

http://localhost:9200/es_learning/doc_type/1
{"name": "Springboot",
"description": "Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。",
"studymodel": "201002",
"price":38.6,
"timestamp":"2019‐06‐15 14:11:35",
"pic":"springboot.jpg"
}
http://localhost:9200/es_learning/doc_type/2
{"name": "spring基础",
"description": "spring 在java领域非常流行,java程序员都在用。",
"studymodel": "201001",
"price":88.6,
"timestamp":"2019‐06‐15 14:11:35",
"pic":"spring.jpg"
}
http://localhost:9200/es_learning/doc_type/3
{"name": "elasticsearch",
"description": "ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。",
"studymodel": "201001",
"price":99.9,
"timestamp":"2019‐06‐15 14:11:35",
"pic":"elasticsearch.png"
}

7.1.3 简单搜索

简单搜索就是通过url进行查询,以get方式请求ES。
格式:get …/_search?q=…
q:搜索字符串。
?q=name:spring 搜索name中包括spring的文档。

7.2 DSL 搜索

DSL(Domain Specific Language)是ES提出的基于json的搜索方式,在搜索时传入特定的json格式的数据来完成不同的搜索需求。DSL比URI搜索方式功能强大,在项目中建议使用DSL方式来完成搜索。

7.2.1 查询所有文档

查询所有索引库的文档。
GET http://localhost:9200/_search

查询指定索引库指定类型下的文档.
GET http://localhost:9200/es_learning/doc_type/_search

POST http://localhost:9200/es_learning/doc_type/_search

{"query":{"match_all":{}},"_source":["name","studymodel"]
}


_source:source源过虑设置,指定结果中所包括的字段有哪些。

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestSearch {@AutowiredRestHighLevelClient client;@AutowiredRestClient restClient;
//搜索type下的全部记录    @Testpublic void testSearchAll() throws IOException {SearchRequest searchRequest = new SearchRequest("es_learning");searchRequest.types("doc_type");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchAllQuery());//source源字段过虑searchSourceBuilder.fetchSource(new String[]{"name","studymodel"}, new String[]{});searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest);SearchHits hits = searchResponse.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {String index = hit.getIndex();String type = hit.getType();String id = hit.getId();float score = hit.getScore();String sourceAsString = hit.getSourceAsString();Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");String studymodel = (String) sourceAsMap.get("studymodel");String description = (String) sourceAsMap.get("description");System.out.println(name);System.out.println(studymodel);System.out.println(description);}}
}

7.2.2 分页查询

ES支持分页查询,传入两个参数:from和size。
form:表示起始文档的下标,从0开始。
size:查询的文档数量。
POST http://localhost:9200/es_learning/doc_type/_search

{"from":0,"size":1,"query":{"match_all":{}},"_source":["name","studymodel"]
}

SearchRequest searchRequest = new SearchRequest("es_learning");
searchRequest.types("doc_type");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//分页查询,设置起始下标,从0开始
searchSourceBuilder.from(0);
//每页显示个数
searchSourceBuilder.size(10);
//source源字段过虑
searchSourceBuilder.fetchSource(new String[]{"name","studymodel"}, new String[]{});
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

7.2.3 Term Query

Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词。
POST http://localhost:9200/es_learning/doc_type/_search

{"query":{"term":{"name":"springboot"}},"_source":["name","studymodel"]
}
SearchRequest searchRequest = new SearchRequest("es_learning");
searchRequest.types("doc_type");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("name","springboot"));
//source源字段过虑
searchSourceBuilder.fetchSource(new String[]{"name","studymodel"}, new String[]{});
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

7.2.4 根据id精确匹配

ES提供根据多个id值匹配的方法:
POST http://localhost:9200/es_learning/doc_type/_search

{"query":{"ids":{"type":"doc_type","values":["2","3","4"]}}
}
SearchRequest searchRequest = new SearchRequest("es_learning");
searchRequest.types("doc_type");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
String[] split = new String[]{"2","3","4"};
List<String> idList = Arrays.asList(split);
searchSourceBuilder.query(QueryBuilders.termsQuery("_id", idList));

7.2.5 match Query

1、基本使用
match Query即全文检索,它的搜索方式是先将搜索字符串分词,再使用各各词条从索引中搜索。
match query与Term query区别是match query在搜索前先将搜索关键字分词,再拿各各词语去索引中搜索。
POST http://localhost:9200/es_learning/doc_type/_search

{"query":{"match":{"description":{"query":"spring boot","operator":"or"}}}
}

query:搜索的关键字,对于英文关键字如果有多个单词则中间要用半角逗号分隔,而对于中文关键字中间可以用逗号分隔也可以不用。
operator:or 表示 只要有一个词在文档中出现则就符合条件,and表示每个词都在文档中出现则才符合条件。

//根据关键字搜索
@Test
public void testMatchQuery() throws IOException {SearchRequest searchRequest = new SearchRequest("es_learning");searchRequest.types("doc_type");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//source源字段过虑searchSourceBuilder.fetchSource(new String[]{"name","studymodel"}, new String[]{});//匹配关键字searchSourceBuilder.query(QueryBuilders.matchQuery("description", "spring boot").operator(Operator.OR));searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest);SearchHits hits = searchResponse.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {String index = hit.getIndex();String type = hit.getType();String id = hit.getId();float score = hit.getScore();String sourceAsString = hit.getSourceAsString();Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");String studymodel = (String) sourceAsMap.get("studymodel");String description = (String) sourceAsMap.get("description");System.out.println(name);System.out.println(studymodel);System.out.println(description);}
}

2、minimum_should_match
上边使用的operator = or表示只要有一个词匹配上就得分,如果实现三个词至少有两个词匹配如何实现?使用minimum_should_match可以指定文档匹配词的占比:

{"query":{"match":{"description":{"query":"spring框架","minimum_should_match":"80%"}}}
}

设置"minimum_should_match": "80%"表示,三个词在文档的匹配占比为80%,即3*0.8=2.4,向下取整得2,表示至少有两个词在文档中要匹配成功。

SearchRequest searchRequest = new SearchRequest("es_learning");searchRequest.types("doc_type");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//匹配关键字
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("description", "前台页面开发框架 架
构")
.minimumShouldMatch("80%");//设置匹配占比
searchSourceBuilder.query(matchQueryBuilder);

7.2.6 multi Query

上边学习的termQuery和matchQuery一次只能匹配一个Field,本节学习multiQuery,一次可以匹配多个字段。
1、基本使用
单项匹配是在一个field中去匹配,多项匹配是拿关键字去多个Field中匹配。

{"query":{"multi_match":{"query":"spring boot","minimum_should_match":"50%","fields":["name","description"]}}
}

2、提升boost
匹配多个字段时可以提升字段的 boost(权重)来提高得分

{"query":{"multi_match":{"query":"spring boot","minimum_should_match":"50%","fields":["name^10","description"]}}
}

“name^10” 表示权重提升10倍,执行上边的查询。

MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring 框架",
"name", "description").minimumShouldMatch("50%");
multiMatchQueryBuilder.field("name",10);//提升boost

7.2.7 布尔查询

布尔查询对应于Lucene的BooleanQuery查询,实现将多个查询组合起来。

  • must:文档必须匹配must所包括的查询条件,相当于 “AND”
  • should:文档应该匹配should所包括的查询条件其中的一个或多个,相当于 “OR”
  • must_not:文档不能匹配must_not所包括的该查询条件,相当于“NOT”
{"_source":["name","studymodel","description"],"from":0,"size":1,"query":{"bool":{"must":[{"multi_match":{"query":"spring框架","minimum_should_match":"50%","fields":["name^10","description"]}},{"term":{"studymodel":"201001"}}]}}
}
//BoolQuery ,将搜索关键字分词,拿分词去索引库搜索
@Test
public void testBoolQuery() throws IOException {//创建搜索请求对象SearchRequest searchRequest= new SearchRequest("es_learning");searchRequest.types("doc_type");//创建搜索源配置对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.fetchSource(new String[]{"name","pic","studymodel"},new String[]{});//multiQueryString keyword = "spring开发框架";MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring框架",
"name", "description").minimumShouldMatch("50%");multiMatchQueryBuilder.field("name",10);//TermQueryTermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "201001");// 布尔查询BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(multiMatchQueryBuilder);boolQueryBuilder.must(termQueryBuilder);//设置布尔查询对象searchSourceBuilder.query(boolQueryBuilder);searchRequest.source(searchSourceBuilder);//设置搜索源配置SearchResponse searchResponse = client.search(searchRequest);SearchHits hits = searchResponse.getHits();SearchHit[] searchHits = hits.getHits();for(SearchHit hit:searchHits){Map<String, Object> sourceAsMap = hit.getSourceAsMap();System.out.println(sourceAsMap);}
}

7.2.8 过虑器

过虑是针对搜索的结果进行过虑,过虑器主要判断的是文档是否匹配,不去计算和判断文档的匹配度得分,所以过虑器性能比查询要高,且方便缓存,推荐尽量使用过虑器去实现查询或者过虑器和查询共同使用。过虑器在布尔查询中使用,下边是在搜索结果的基础上进行过虑:

{"_source":["name","studymodel","description","price"],"query":{"bool":{"must":[{"multi_match":{"query":"spring框架","minimum_should_match":"50%","fields":["name^10","description"]}}],"filter":[{"term":{"studymodel":"201001"}},{"range":{"price":{"gte":60,"lte":100}}}]}}
}
  • range:范围过虑,保留大于等于60 并且小于等于100的记录。
  • term :项匹配过虑,保留studymodel等于"201001"的记录。
    注意:range和term一次只能对一个Field设置范围过虑。
// 布尔查询使用过虑器@Testpublic void testFilter() throws IOException {SearchRequest searchRequest = new SearchRequest("es_learning");searchRequest.types("doc_type");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//source源字段过虑searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","description"},
new String[]{});searchRequest.source(searchSourceBuilder);//匹配关键字MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring框
架", "name", "description");//设置匹配占比multiMatchQueryBuilder.minimumShouldMatch("50%");//提升另个字段的Boost值multiMatchQueryBuilder.field("name",10);searchSourceBuilder.query(multiMatchQueryBuilder);//布尔查询BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(searchSourceBuilder.query());//过虑boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel", "201001"));boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(60).lte(100));SearchResponse searchResponse = client.search(searchRequest);SearchHits hits = searchResponse.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {String index = hit.getIndex();String type = hit.getType();String id = hit.getId();float score = hit.getScore();String sourceAsString = hit.getSourceAsString();Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");String studymodel = (String) sourceAsMap.get("studymodel");String description = (String) sourceAsMap.get("description");System.out.println(name);System.out.println(studymodel);System.out.println(description);}}

7.2.9 排序

可以在字段上添加一个或多个排序,支持在keyword、date、float等类型上添加,text类型的字段上不允许添加排序。

{"_source":["name","studymodel","description","price"],"query":{"bool":{"filter":[{"range":{"price":{"gte":0,"lte":100}}}]}},"sort":[{"studymodel":"desc"},{"price":"asc"}]
}
@Test public void testSort() throws IOException {SearchRequest searchRequest = new SearchRequest("es_learning");searchRequest.types("doc_type");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//source源字段过虑searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","description"}, new String[]{});searchRequest.source(searchSourceBuilder);//布尔查询BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//过虑boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));// 排序searchSourceBuilder.sort(new FieldSortBuilder("studymodel").order(SortOrder.DESC));searchSourceBuilder.sort(new FieldSortBuilder("price").order(SortOrder.ASC));SearchResponse searchResponse = client.search(searchRequest);SearchHits hits = searchResponse.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {String index = hit.getIndex();String type = hit.getType();String id = hit.getId();float score = hit.getScore();String sourceAsString = hit.getSourceAsString();Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");String studymodel = (String) sourceAsMap.get("studymodel");String description = (String) sourceAsMap.get("description");System.out.println(name);System.out.println(studymodel);System.out.println(description);}}

7.2.10 高亮显示

高亮显示可以将搜索结果一个或多个字突出显示,以便向用户展示匹配关键字的位置。在搜索语句中添加highlight即可实现。

{"_source":["name","studymodel","description","price"],"query":{"bool":{"filter":[{"range":{"price":{"gte":0,"lte":100}}}]}},"sort":[{"studymodel":"desc"},{"price":"asc"}],"highlight":{"pre_tags":["<tag1>"],"post_tags":["</tag2>"],"fields":{"name":{},"description":{}}}
}
 @Testpublic void testHighlight() throws IOException {SearchRequest searchRequest = new SearchRequest("xc_course");searchRequest.types("doc");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//source源字段过虑searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","description"}, new String[]{});searchRequest.source(searchSourceBuilder);//匹配关键字MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("开发", "name", "description");searchSourceBuilder.query(multiMatchQueryBuilder);//布尔查询BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(searchSourceBuilder.query());//过虑boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));//排序searchSourceBuilder.sort(new FieldSortBuilder("studymodel").order(SortOrder.DESC));searchSourceBuilder.sort(new FieldSortBuilder("price").order(SortOrder.ASC));//高亮设置HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.preTags("<tag>");//设置前缀highlightBuilder.postTags("</tag>");//设置后缀// 设置高亮字段highlightBuilder.fields().add(new HighlightBuilder.Field("name"));searchSourceBuilder.highlighter(highlightBuilder);SearchResponse searchResponse = client.search(searchRequest);SearchHits hits = searchResponse.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {Map<String, Object> sourceAsMap = hit.getSourceAsMap();//名称String name = (String) sourceAsMap.get("name");//取出高亮字段内容Map<String, HighlightField> highlightFields = hit.getHighlightFields();if(highlightFields!=null){HighlightField nameField = highlightFields.get("name");if(nameField!=null){Text[] fragments = nameField.getFragments();StringBuffer stringBuffer = new StringBuffer();for (Text str : fragments) {stringBuffer.append(str.string());}name = stringBuffer.toString();}}String index = hit.getIndex();String type = hit.getType();String id = hit.getId();float score = hit.getScore();String sourceAsString = hit.getSourceAsString();String studymodel = (String) sourceAsMap.get("studymodel");String description = (String) sourceAsMap.get("description");System.out.println(name);System.out.println(studymodel);System.out.println(description);}}

8 集群管理

8.1 集群结构

ES通常以集群方式工作,这样做不仅能够提高 ES的搜索能力还可以处理大数据搜索的能力,同时也增加了系统的容错能力及高可用,ES可以实现PB级数据的搜索。

从上图总结以下概念:

  • 结点 ES集群由多个服务器组成,每个服务器即为一个Node结点(该服务只部署了一个ES进程)。
  • 分片 当我们的文档量很大时,由于内存和硬盘的限制,同时也为了提高ES的处理能力、容错能力及高可用能力,我们将索引分成若干分片,每个分片可以放在不同的服务器,这样就实现了多个服务器共同对外提供索引及搜索服务。一个搜索请求过来,会分别从各各分片去查询,最后将查询到的数据合并返回给用户。
  • 副本 为了提高ES的高可用同时也为了提高搜索的吞吐量,我们将分片复制一份或多份存储在其它的服务器,这样即使当前的服务器挂掉了,拥有副本的服务器照常可以提供服务。
  • 主结点 一个集群中会有一个或多个主结点,主结点的作用是集群管理,比如增加节点,移除节点等,主结点挂掉后ES会重新选一个主结点。
  • 结点转发 每个结点都知道其它结点的信息,我们可以对任意一个结点发起请求,接收请求的结点会转发给其它结点查询数据。

8.2 搭建集群

下边的例子实现创建一个2结点的集群,并且索引的分片我们设置2片,每片一个副本。

8.2.1 结点的三个角色

  • 主结点:master节点主要用于集群的管理及索引 比如新增结点、分片分配、索引的新增和删除等。
  • 数据结点: data 节点上保存了数据分片,它负责索引和搜索操作。
  • 客户端结点:client 节点仅作为请求客户端存在,client的作用也作为负载均衡器,client 节点不存数据,只是将请求均衡转发到其它结点。
    通过下边两项参数来配置结点的功能:
    node.master: #是否允许为主结点
    node.data: #允许存储数据作为数据结点
    node.ingest: #是否允许成为协调节点,
    四种组合方式:
    master=true,data=true:即是主结点又是数据结点
    master=false,data=true:仅是数据结点
    master=true,data=false:仅是主结点,不存储数据
    master=false,data=false:即不是主结点也不是数据结点,此时可设置ingest为true表示它是一个客户端。

8.2.2创建结点 1

解压elasticsearch-6.2.4.zip ,结点1对外服务的http端口是:9200 ;集群管理端口是9300;结点名:es_node_1,elasticsearch.yml内容如下

cluster.name: es-cluster
node.name: es_node_1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
discovery.zen.minimum_master_nodes: 1
node.ingest: true
node.max_local_storage_nodes: 2
path.data: D:\ElasticSearch\elasticsearch‐6.2.1‐1\data
path.logs: D:\ElasticSearch\elasticsearch‐6.2.1‐1\logs
http.cors.enabled: true
http.cors.allow‐origin: /.*/

8.2.3创建结点2

解压elasticsearch-6.2.4.zip ,结点1对外服务的http端口是:9202 ;集群管理端口是9302;结点名:es_node_2,elasticsearch.yml内容如下

cluster.name: es-cluster
node.name: es_node_2
network.host: 0.0.0.0
http.port: 9202
transport.tcp.port: 9302
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
discovery.zen.minimum_master_nodes: 1
node.ingest: true
node.max_local_storage_nodes: 2
path.data: D:\ElasticSearch\elasticsearch‐6.2.1‐1\data
path.logs: D:\ElasticSearch\elasticsearch‐6.2.1‐1\logs
http.cors.enabled: true
http.cors.allow‐origin: /.*/

8.2.4 启动测试

为每个结点安装IK分词器,并启动,然后创建索引库并设置分片数。
在一个节点上创建文档,发现在其他节点上也可以查询到数据,还可进行节点的增删测试。

8.2.5 集群的健康

通过访问 GET /_cluster/health 来查看Elasticsearch 的集群健康情况。
用三种颜色来展示健康状态:green:所有的主分片和副本分片都正常运行; yellow:所有的主分片都正常运行,但有些副本分片运行不正常;red:存在主分片运行不正常。
Get请求:http://localhost:9200/_cluster/health

{ "cluster_name": "es-cluster","status": "green","timed_out": false,"number_of_nodes": 2,"number_of_data_nodes": 2,"active_primary_shards": 2,"active_shards": 4,"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
}

全文检索-Elasticsearch安装、集群和使用超全解读相关推荐

  1. KubeSphere安装redis集群,全程超带劲

    前言 redis是在开发过程中经常用到的缓存中间件,在生产环境中为了考虑稳定性和高可用一般为集群模式的部署. 常规部署在虚拟机上的方式配置繁琐并且需要手动重启节点,而使用K8S进行redis集群的部署 ...

  2. ElasticSearch入门 —— 集群搭建

    Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. 但是,Luce ...

  3. 搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群

    笔记内容:搭建ELK日志分析平台(上)-- ELK介绍及搭建 Elasticsearch 分布式集群 笔记日期:2018-03-02 27.1 ELK介绍 27.2 ELK安装准备工作 27.3 安装 ...

  4. Ubuntu环境下用docker从0到1部署Elasticsearch 7集群

    目录 一.镜像准备 二.配置准备 1.ubuntu安装ssh 2. 开放22号端口 3. 配置密码可访问 4. 登录到ubuntu服务器 三.搭建集群准备 1. FileZilla工具网盘下载 2. ...

  5. Elasticsearch+Kibana集群部署(3节点)

    Elasticsearch+Kibana集群部署(3节点) l i n d o r − − 良民笔记 lindor--良民笔记 lindor−−良民笔记 文章目录 Elasticsearch+Kiba ...

  6. ElasticSearch之集群原理

    ElasticSearch 的主旨是随时可用和按需扩容. 而扩容可以通过购买性能更强大(垂直扩容,或 纵向扩容) 或者数量更多的服务器(水平扩容,或 横向扩容 )来实现. 虽然 ElasticSear ...

  7. kubeadm 安装集群 1.16.12

    kubeadm 安装集群 添加源 mirror=https://mirrors.aliyun.com # mirror=https://mirrors.ustc.edu.cn### docker 源 ...

  8. 安装集群图形化界面(Dashboard )、海外构建镜像

    文章目录 一.安装集群图形化界面(Dashboard ) 1.安装图形化界面 2.部署nginx服务 3.使用Dashboard创建应用 二.海外构建镜像 1. 实现原理 2.所需要的平台 3.实现具 ...

  9. rancher 一键安装集群脚本

    rancher 一键安装集群脚本 注意:操作系统任意如果是centos8需要更换yum源 cd /etc/yum.repos.d/sed -i 's/mirrorlist/#mirrorlist/g' ...

最新文章

  1. Confluence 6 如何配置快速导航的同时查找数量
  2. Redis【3】其他部分~
  3. 【虚拟化】docker部署nginx
  4. vue list数组合并和插入数据
  5. nginx 配置示例_Nginx位置指令示例
  6. ChromeFFOpera下DIV不设置高度显示背景颜色和边框的办法
  7. 关于网上商城开发的随笔记录1
  8. [算法]数组排序之后相邻数的最大差值
  9. 推荐几本大学生必看的书单
  10. java 斑马_java调用斑马GK888t打印机(ZPL指令)
  11. U盘所有文件(夹)变成.exe文件的解决方法
  12. uniapp选择所有城市通过索引方式(源码自带所有城市json格式数据)
  13. 安卓SurfaceView 实现下雨效果
  14. OpenCV中八种不同的目标追踪算法
  15. 【第五周】新蜂团体贡献分
  16. python画樱花树教程_turtle模块-知乎画樱花树
  17. Auto.JS 教程(1)
  18. 20201123英语单词学习(仅供自己记录)
  19. 物联网平台搭建的全过程介绍(二)——物联网平台通信思维导图
  20. Android Java 必备:Socket通信

热门文章

  1. 各种颜色的英文表述,以及RGB代码
  2. 四川内江现天眼猫 额头正中间长眼睛
  3. python热图_python – 使用matplotlib中的3D数据生成热图
  4. iPad越狱搭建java环境_win7+virtualbox安装Mac os搭建完美越狱环境
  5. 商用智能显示屏在自动售检票系统(AFC)中的应用
  6. 软件测试,在EasyMock中遇到expected: 1, actual: 0的解决办法,当你传入的是对象参数时所需要规避的坑
  7. 最新版 FatFS f_mkfs 详解
  8. NOMSQL数据库之Mongodb
  9. Flink SQL 核心解密 —— 提升吞吐的利器 MicroBatch
  10. 虚拟现实vr技术靠哪些设备进行空间定位