首页 > 其他分享 >Elasticsearch 笔记

Elasticsearch 笔记

时间:2025-01-19 08:59:30浏览次数:1  
标签:http 9200 笔记 查询 索引 文档 elasticsearch Elasticsearch

目录

ES 相关概念

关系型数据库(比如Mysql) 非关系型数据库(Elasticsearch)
数据库 Database 索引 Index
表 Table 类型 Type
数据行 Row 文档 Document
数据列 Column 字段 Field
约束 Schema 映射Mapping

概述

Elasticsearch 是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅
仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在 Elasticsearch 中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。Elasticsearch 比传统关系型数据库如下:

Relational DB ‐> Databases ‐> Tables ‐> Rows ‐> Columns
Elasticsearch ‐> Indices ‐> Types ‐> Documents ‐> Fields

核心概念

1)索引 index

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。可类比 mysql 中的数据库

2)类型 type

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。 可类比 mysql 中的表

3) 字段 Filed

相当于是数据表的字段,对文档数据根据不同属性进行的分类标识 。

4)映射 mapping

mapping 是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的,其它就是处理 es 里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。相当于 mysql 中的创建表的过程,设置主键外键等等

5)文档 document

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSON(Javascript Object Notation)格式来表示,而 JSON 是一个到处存在的互联网数据交互格式。在一个 index/type 里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的 type。 插入索引库以文档为单位,类比与数据库中的一行数据

6)集群 cluster

一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。一个集群由 一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集 群的名字,来加入这个集群。

7)节点 node

一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。和集群类似,一 个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的 时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对 应于 ElasticSearch 集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫 做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此, 它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。
在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何Elasticsearch节点, 这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。

8)分片和复制 shards & replicas

一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有 10 亿文档的索引占据 1TB 的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,ElasticSearch 提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。分片很重要,主要有两方面的原因:

  1. 允许你水平分割/扩展你的内容容量。
  2. 允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。
    至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全 由 ElasticSearch 管理的,对于作为用户的你来说,这些都是透明的。
    在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,ElasticSearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。
    复制之所以重要,有两个主要原因: 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行。总之,每个索引可以被分成多个分片。一个索引也可以被复制 0 次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。
    默认情况下,ElasticSearch 中的每个索引被分片 5 个主分片和 1 个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有 5 个主分片和另外 5 个复制分片(1 个完全拷贝),这样的话每个索引总共就有 10 个分片。

9)接近实时 NRT

ElasticSearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒以内)

ElasticSearch 字段的类型

字段类型

string类型:text,keyword
数字类型:long,integer,short,byte,double,float
日期类型:data
布尔类型:boolean
binary类型:binary
复杂类型:object(实体,对象),nested(列表)
geo类型:geo-point,geo-shape(地理位置)
专业类型:ip,competion(搜索建议)

一级分类 二级分类 具体类型
核心类型 String(字符串)类型 string,text,keyword
整数类型 integer,long,short,byte
浮点类型 double,float,half_float,scaled_float
逻辑类型 boolean
日期类型 date
范围类型 range
二进制类型 binary
复合类型 数组类型 array
对象类型 object
嵌套类型 nested
地理类型 地理坐标类型 geo_point
地理地图 geo_shape
特殊类型 IP类型 ip
范围类型 completion
令牌计数类型 token_count
附件类型 attachment
抽取类型 percolator

映射参数

属性 描述 适合类型
store 值为yes表示存储,no表示不存储,默认为no all
index yes表示分析,no表示不分析,默认为true text
null_value 如果字段为空,可以设置一个默认值,比如"NA"(传过来为空,不能搜索,na可以搜索) all
analyzer 可以设置索引和搜索时用的分析器,默认使用的是standard分析器,还可以使用whitespace,simple。都是英文分析器 all
include_in_all 默认es为每个文档定义一个特殊域_all,它的作用是让每个字段都被搜索到,如果想让某个字段不被搜索到,可以设置为false all
format 时间格式字符串模式 date
参数 名称 描述
analyzer 分析器 语言分析分词,一般采用默认 standard ,如果需要分析英文 使用 english
normalizer 指定 keyword 的一些查询逻辑,比如查询是否区分大小写
boost 在评分性查询中,增加字段的评分比重
coerce 数字强制 一个bool设置,默认为true,把传入的"5"自动转化成5,false 请求将被拒绝
copy_to 复制字段值 把某一字段中的值 复制到 其他一或多个字段中去,只能用来查询,不能用来显示
doc_values 关闭分词索引 默认true,false后 该字段不再建立分词索引,节省磁盘空间(最好用在排序和聚合字段)
dynamic 是否开启自动映射 默认为true
enablededit 禁用子对象解析映射
format 日期格式化
ignore_above 字符串最大长度 大于该长度的字符串将被忽略
ignore_malformed 忽略数据类型异常 默认false
index 是否为该字段 做查询索引 默认true
index_options 指定倒排索引模式
index_prefixes 指定数据前缀关键词,加速 term 查询
fields 把一个字段 处理成 多个字段 用来做不同的查询或聚合
null_value 处理null值 将null处理成想要的数据形式,方便查询或显示(处理前后 数据类型要一致)
properties 映射指定子字段
search_analyzer 指定查询时候的语言分析器

string

字符串类型,es 中最常用的类型,官方文档
比较重要的参数:

index 分析

  • analyzed(默认)
  • not_analyzed
  • no

store 存储

  • true 独立存储
  • false(默认)不存储,从 _source 中解析

Numeric

数值类型,注意 numeric 并不是一个类型,它包括多种类型,比如: long,integer,short,byte,double,float,每种的存储空间都是不一样的,一般默认推荐 integer 和 float。官方文档参考
重要的参数:

index 分析

  • not_analyzed(默认) ,设置为该值可以保证该字段能通过检索查询到
  • no

store 存储

  • true 独立存储
  • false(默认)不存储,从_source中解析

date

日期类型,该类型可以接受一些常见的日期表达方式,官方文档参考
重要的参数:

index 分析

  • not_analyzed(默认) ,设置为该值可以保证该字段能通过检索查询到
  • no

store 存储

  • true 独立存储
  • false(默认)不存储,从 _source 中解析

format 格式化

IP

这个类型可以用来标识 IPV4 的地址,参考官方文档
常用参数:

index 分析

  • not_analyzed(默认) ,设置为该值可以保证该字段能通过检索查询到
  • no

store 存储

  • true 独立存储
  • false(默认)不存储,从 _source 中解析

boolean

布尔类型,所有的类型都可以标识布尔类型,参考官方文档

  • False: 表示该值的有:false, "false", "off", "no", "0", "" (empty string), 0, 0.0
  • True: 所有非False的都是true
    重要的参数:

index 分析

  • not_analyzed(默认) ,设置为该值可以保证该字段能通过检索查询到
  • no

store 存储

  • true 独立存储
  • false(默认)不存储,从 _source 中解析

Docker 中安装 ElasticSearch

下载 ElasticSearch 和 Kibana

docker pull elasticsearch:7.6.2
docker pull kibana:7.6.2

配置

mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml	# ES 可以被任何机器访问
sudo chmod -R 777 /mydata/elasticsearch/
	# sudo:是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。
	# -R:是指几连医用到目录里所有子目录和文件;
	# 777:是指所有用户都拥有的最高权限。

启动 ElasticSearch

单节点

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e  "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.6.2 

# 9200 是ES节点与外部通讯使用的端口。它是http协议的RESTful接口(各种CRUD操作都是走的该端口,如查询:http://localhost:9200/user/_search)。
# 9300是ES节点之间通讯使用的端口。它是tcp通讯端口,集群间和TCPclient都走的它。(java程序中使用ES时,在配置文件中要配置该端口)
# -e  "discovery.type=single-node":以单节点运行
# -e ES_JAVA_OPTS="-Xms64m -Xmx512m":设置 ES 的 JVM 堆大小,初始 64M,最大 512M

多节点

要启动单节点 Elasticsearch 集群进行开发或测试,请指定单节点发现以绕过启动检查:
为了在 Docker 中启动和运行一个三节点 Elasticsearch 集群,你可以使用 Docker Compose:

  • 创建一个 docker-compose.yml 文件:
version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.11.2
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms64m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.11.2
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms64m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    networks:
      - elastic
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.11.2
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms64m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - elastic

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge

这个示例 Docker Compose 文件,提供了一个三节点 Elasticsearch 集群。节点 es01 监听 localhost:9200es02es03 通过 Docker 网络与 es01 通信。
请注意此配置在所有网络接口上暴露端口 9200,并且考虑到 Docker 怎么在 Linux 上操作 iptables,这意味着你的 ElasticSearch 集群可以公开访问,可能会忽略任何防火墙设置。如果你不想暴露端口 9200,转而使用反向代理,在 docker-compose.yml 文件中用 127.0.0.1:9200:9200 替代 9200:9200。ElasticSearch 将只能从主机自身访问。
Docker 命名卷 data01data02data03 存储节点数据目录,以便重启时数据持续存在。如果他们不存在,docker-compose 将会在你创建集群时创建他们。

  1. 确保 Docker Engine 分配了至少 4 GiB 内存。在 Docker 桌面中,你可以在首选项(macOS)或设置(Windows)的高级选项卡中配置资源使用。
    提示
    在 Linux 上,Docker Compose 未与 Docker 一起预装。在 docs.docker.com 查看安装指南:在 Linux 安装 Compose
  2. 运行 docker-compose 以启动集群:
docker-compose up
  1. 提交请求 _cat/nodes 查看节点是否启动运行
curl -X GET "localhost:9200/_cat/nodes?v=true&pretty"

日志消息进入控制台,由配置的 Docker 日志驱动处理。默认情况下,你可以使用 docker logs 访问日志。如果你更想 ElasticSearch 容器把日志写入磁盘,设置环境变量 ES_LOG_STYLEfile。这将导致 ElasticSearch 使用与其他 ElasticSearch 分发格式相同的配置。
要停止集群,运行 docker-compose down。当你使用 docker-compose up 重启集群,Docker 卷中的数据将被保存和加载。为了在停止集群时删除数据卷,指定 -v 选项: docker-compose down -v

启动开启 TLS 的多节点集群

参阅 在 Elasticsearch Docker 容器的加密通信在 Docker 中开启 TLS 运行 Elastic 栈

在生产环境使用 Docker 镜像

以下要求和建议适用于生产环境中在 Docker 中运行 Elasticsearch。

设置 vm.max_map_count 至少为 262144

在生产环境使用,vm.max_map_count 内核设置必须至少为 262144
如何设置 vm.max_map_count 基于你的平台:

  • Linux
    vm.max_map_count 应该永久设置在 /etc/sysctl.conf
grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144

在运行的系统中应用此配置,执行:

sysctl -w vm.max_map_count=262144
  • Mac 版 Docker 的 macOS
    vm.max_map_count 设置必须在 xhyve 虚机中设置:
    a. 从命令行运行:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

b. 按回车,使用 "sysctl" 配置 vm.max_map_count

sysctl -w vm.max_map_count=262144

c. 退出 screen 会话,按 Ctrl a d

  • Docker 桌面版的 Windows 和 macOS
    vm.max_map_count 必须通过 docker-machine 设置。
docker-machine ssh
sudo sysctl -w vm.max_map_count=262144
wsl -d docker-desktop
sysctl -w vm.max_map_count=262144

设置开机启动 ElasticSearch

docker update elasticsearch --restart=always

挂载 ElasticSearch 密钥库

默认情况下,ElasticSearch 会为安全设置自动生成密钥库文件。这个文件是混淆的,但没有加密。如果你想使用密码加密你的安全设置,你必须使用 elasticsearch-keystore 程序去创建一个密码保护的密钥库,然后绑定挂载它到容器中文件 /usr/share/elasticsearch/configuring_elasticsearchelasticsearch.keystore。为了在启动时向 Docker 容器提供密码,将 Docker 的环境变量值 KEYSTORE_PASSWORD 设置为密码值。例如,docker run 命令可以有以下的选项:

-v full_path_to/elasticsearch.keystore:/usr/share/elasticsearch/configuring_elasticsearch/elasticsearch.keystore
-E KEYSTORE_PASSWORD=mypassword

启动 Kibana:

mkdir -p /mydata/kibana/config
sudo chmod -R 777 /mydata/kibana/

docker run --name tempKibana -p 5601:5601 -d kibana:7.6.2  # 用于生成 kibana.yml 文件并挂载本地

# 或者不挂载本地,直接进入下一步(5)
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://172.0.0.5:9200 -p 5601:5601 -d kibana:7.6.2
# ELASTICSEARCH_HOSTS 为 elasticsearch 的地址,如果不知道 ip 可用 localhost 代替 ip

复制 config 文件夹中的文件到宿主机上

docker cp tempKibana:/usr/share/kibana/config /mydata/kibana

删除临时容器

docker rm -f tempKibana

在 /mydata/kibana/config 下找到 kibana.yml进行编辑,让 kibana 与启动的 es 连接,毕竟我们使用 kibana 就是为了可以类似 Navicat 那样能操作 MySQL。这里可以来修改 elasticsearch.host 改为自己的 ip。不知道 ip 地址可以用 localhost
启动 Kibana

docker run --name kibana -p 5601:5601 \
-v /mydata/kibana/config:/usr/share/kibana/config \
-d kibana:7.6.2

设置开机启动 Kibana

docker update kibana --restart=always

测试

查看 elasticsearch 版本信息: http://192.168.137.14:9200/

{
    "name": "e45f2a9790a8",
    "cluster_name": "elasticsearch",
    "cluster_uuid": "W4URpVVvSCWKTddoKQID_A",
    "version": {
        "number": "7.6.2",
        "build_flavor": "default",
        "build_type": "docker",
        "build_hash": "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
        "build_date": "2020-03-26T06:34:37.794943Z",
        "build_snapshot": false,
        "lucene_version": "8.4.0",
        "minimum_wire_compatibility_version": "6.8.0",
        "minimum_index_compatibility_version": "6.0.0-beta1"
    },
    "tagline": "You Know, for Search"
}

显示 ElasticSearch 节点信息 http://192.168.137.14:9200/_cat/nodes

127.0.0.1 16 96 1 0.05 0.03 0.05 dilm * e45f2a9790a8

访问 Kibana: http://192.168.137.14:5601/app/kibana
[image-20200501192629304.png]

配置 ElasticSearch

ElasticSearch 具有良好的默认值,只需要很少的配置。可以使用集群更新设置 API在运行的集群上更改大多数设置。
配置文件应包含特定于节点的设置(如 node.name 和路径),或节点加入群集所需的设置,如 cluster.namenetwork.host

配置文件位置

ElasticSearch 有三个配置文件:

  • elasticsearch.yml 用于配置 ElasticSearch
  • jvm.options 用于配置 ElasticSearch JVM 设置
  • log4j2.properties 用于配置 ElasticSearch 日志记录
    这些文件位于 config 目录中,其默认位置取决于安装是来自存档发行版(tar.gzzip)还是软件包发行版(Debian 或 RPM 软件包)。
    对于压缩分发版,配置目录位置默认为 $ES_HOME/config。可以通过 ES_PATH_CONF 环境变量更改配置目录的位置,如下所示:
ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch

或者,你可以通过命令行或 shell 概要文件导 出ES_PATH_CONF 环境变量。
对于包发行版,配置目录位置默认为 /etc/elasticsearch。还可以通过 ES_PATH_CONF 环境变量更改配置目录的位置,但请注意,在 shell 中设置此值是不够的。相反,这个变量来源于 /etc/default/elasticsearch(对于 Debian 包)和 /etc/sysconfig/elasticsearch(对于 RPM 包)。你需要相应地编辑其中一个文件中的 ES_PATH_CONF=/etc/elasticsearch 条目,以更改配置目录位置。

配置文件格式

配置格式为 YAML。以下是更改数据和日志目录路径的示例:

path:
    data: /var/lib/elasticsearch
    logs: /var/log/elasticsearch

还可以按如下方式展平设置:

path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

在 YAML 中,可以将非标量值格式化为序列:

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11
   - seeds.mydomain.com

虽然不太常见,但也可以将非标量值格式化为数组:

discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.11", "seeds.mydomain.com"]

环境变量替代

配置文件中使用 ${…} 符号引用的环境变量将替换为环境变量的值。例如:

node.name:    ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}

环境变量的值必须是简单字符串。使用逗号分隔的字符串提供 Elasticsearch 将解析为列表的值。例如,ElasticSearch 将以下字符串拆分为 ${HOSTNAME} 环境变量的值列表:

export HOSTNAME="host1,host2"

集群和节点设置类型

集群和节点设置可以根据配置方式进行分类:

  • 动态
    你可以使用集群更新设置 API 在正在运行的集群上配置和更新动态设置。你还可以使用 elasticsearch.yml 在未启动或关闭的节点上本地配置动态设置。
    使用集群更新设置 API 进行的更新可以是持久的,适用于跨集群重新启动;也可以是瞬时的,在集群重新启动后重置。你还可以通过使用 API 为瞬态或持久设置分配 null 来重置它们。
    如果你使用多个方法配置同一设置,Elasticsearch 将按以下优先顺序应用设置:
  1. 瞬态设置
  2. 持续设置
  3. elasticsearch.yml 设置
  4. 默认设置值
    例如,可以应用瞬态设置来覆盖持久设置或 elasticsearch.yml 设置。但是,更改 elasticsearch.yml 设置不会覆盖已定义的瞬态或持久设置。
  • 提示
    如果使用 ElasticSearch 服务,请使用用户设置功能配置所有集群设置。此方法允许 ElasticSearch 服务自动拒绝可能破坏集群的不安全设置。
    如果你在自己的硬件上运行 ElasticSearch,请使用集群更新设置 API 配置动态集群设置。仅使用 elasticsearch.yml 用于静态集群设置和节点设置。API 不需要重新启动,并确保设置的值在所有节点上都相同。
  • 警告
    我们不再建议使用临时集群设置。请改用永久集群设置。如果集群变得不稳定,瞬态设置可能会意外清除,从而导致可能不需要的集群配置。参阅瞬态设置迁移指南
  • 静态
    只能使用 elasticsearch.yml 在未启动或关闭的节点上配置静态设置。
    必须在集群中的每个相关节点上设置静态设置。

Search API

ElasticSearch 为了搜索提供了一些原始的 API,主要是有两大类

  • URL Search
    URL Search 类似 http 的 get 请求,是将请求参数放到 URL 中,比如之前使用的查询文档的接口 get index/_doc/1?pretty
  • Request Body Search
    是以JSON的格式去请求参数,有些类似 http 的 post 请求,是将参数封装在请求体中,这种格式更加符合我们的使用期望,查询场景以及满足的查询条件也丰富。

请求格式是 curl -XGET ip 地址/索引/文档类型/_search?q=查询字段:查询条件

  • 在url 中拼接 “q” 跟着要查询的条件
  • 查询条件格式为:查询字段:查询值 (key:value 格式)
curl -XGET http://localhost:9200/kibana_sample_data_ecommerce/_search?q=customer_first_name:Eddie

比如上边这个查询语义为 查询 customer_first_name 为 Eddie 的文档

URL Search 详解

url 方式的查询,有很多的查询条件是可以设置的,比如下边这个

GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s

这条语句指定了查询字段、排序方式以及分页大小和超时时间等参数。

  • q 指定查询语句
  • df 为默认字段,不指定时,会对所有字段进行查询
  • sort 排序 / from size 指定分页
  • profile 可以查看查询时如何执行的

DisjunctionMaxQuery 泛查询

url 的范查询,其实就是不指定字段只指定查询值去查询,也就是只指定 q 后边的值,这个查询默认会扫描整个文档的所有字段,只要满足 2012 的值都会被搜索出来。

#泛查询,正对_all,所有字段
GET /movies/_search?q=2012

可以看到结果是共有 219 个文档,查看 profile,发现用的是 DisjunctionMaxQuery 查询方式,这个查询方式会将所有字段都进行筛选一遍,在description 中也有描述。

指定字段查询

url 的指定字段查询,其实就是在范查询的基础上指定了只查询一个字段,实现方式是在 url 请求中跟上 df 参数指定所要查询的字段。

#通过df指定字段查询
GET /movies/_search?q=2012&df=title
{
	"profile":"true"
}

#第二种指定字段查询
GET /movies/_search?q=title:2012
{
	"profile":"true"
}

这个结果只会去查询 title 字段中匹配 2012 条件的文档。

TermQuery

term query 其实就是词项匹配查询,比如 Beautiful Mind 这个文本,使用 term 查询,ElasticSearch 会将它拆分成两个词项,Beautiful 与 Mind ,结果只要满足其中一个就可以。
查询语法,在 q 后边的查询条件不加双引号就是 term 查询。
注意:在指定 term 查询的时候,如果是多个条件需要用到分组的概念,() 这种在 ElasticSearch 中就是一个分组,在括号内的查询条件表示是一个分组。

#使用df
GET /movies/_search?q=Beautiful Mind&df=title
{
	"profile":"true"
}

# 第二种方式 使用括号将查询条件括起来
GET /movies/_search?q=title:(Beautiful Mind)
{
	"profile":"true"
}

这个查询会去找既符合 Beautiful 又符合 Mind 的。

Phrase Query

Phrase Query 其实就是文本精确匹配,还是比如 Beautiful Mind 这个文本,ElasticSearch 会在查询寻时把他当成是一个完整的查询条件来查询,不会去分词。
查询语法,在 q 后边的查询条件加上双引号就是 Phrase 查询。

#使用引号,Phrase查询
GET /movies/_search?q=title:"Beautiful Mind"
{
	"profile":"true"
}

可以看出来,只查到了一条记录。

布尔操作

有时候,我们需要制定一个查询条件是 与 的关系还是 或 的关系,这个时候可以使用布尔操作来进行条件的拼接。
注意:布尔操作的标识符必须大写

  • AND 或者是字符 &&
  • OR 或者是字符 ||
  • NOT 或者是字符 !
# 查找美丽心灵
GET /movies/_search?q=title:(Beautiful NOT Mind)
{
	"profile":"true"
}

# 查找美丽心灵
GET /movies/_search?q=title:(Beautiful ! Mind)
{
	"profile":"true"
}

上边这个查询语义表示 查找 title 中包含 Beautiful 字段的并且 不包含 MInd。

分组操作

除了使用布尔操作之外,我们还可以使用一些特殊符号来表示 包含于不包含这种语义。

  • ‘ + ’ 表示must
  • ‘ - ’ 表示must_not
# 查找美丽心灵
GET /movies/_search?q=title:(+Beautiful -BMind)
{
	"profile":"true"
}

# 查找美丽心灵
GET /movies/_search?q=title:(Beautiful %2BMind)
{
	"profile":"true"
}

上边这个查询语义表示 查找 title 中包含 Beautiful 字段的并且 不包含 MInd。%2B 在URl 中表示 '-’,是经过 decode 编码的。

范围查询

我们在查询一个数字类型的字段时,有时候希望可以范围查询,ElasticSearch 也是支持范围查询的。

  • [] 表示闭区间,边界值也会覆盖
#范围查询 ,区间写法
GET /movies/_search?q=title:beautiful AND year:[ 2013 TO 2014 ]
{
	"profile":"true"
}

算数符号查询

想指定返回查询,还可以使用算数符号来表示

  • year:>2010
  • year:<=2010
#范围查询,算数符号
GET /movies/_search?q=year:<=2010
{
	"profile":"true"
}
这个查询条件的语义是查找 年份小于等于 2010 年的电影,可以见到结果中的年份全部都小于 2010.

通配符查询

ElasticSearch 还支持通配符的方式去模糊查询,比如 b*,就是查询所有开头为b的文档。

  • ?代表一个字符
  • \* 代表 0-多个字符

近似查询

有些时候我们不知道某个单词的拼写是否会出错,那么我们可以使用近似查询来保证一定的容错率。在查询条件后边加上 ‘~ 数字’ 这种格式,那么就表示允许匹配单词字母误差不超过数字个数的文档。
title:beautifl~1 表示 单词字母误差在 1 个字母范围内的结果都可以。

//模糊匹配&近似度匹配
GET /movies/_search?q=title:beautifl~1
{
	"profile":"true"
}

GET /movies/_search?q=title:"Lord Rings"~2
{
	"profile":"true"
}

如果是 Phrase 查询的话,那么数字表示两个单词之间可以相差几个单词。比如如上结果,在 Lord Rings 中相隔了两个单词的文档也被查找出来了。

  • 在请求体中以 JSON 方式标注查询条件
  • 支持 POST 与 GET
    请求格式是 curl -XPOST ip 地址/索引/文档类型/_search -H ‘Content-Type:application/json’ -d ‘请求内容’
 curl -XPOST http://localhost:9200/kibana_sample_data_ecommerce/_search  -H 'Content-Type:application/json' -d
'{
	"query": {
	  "match": {
	    "customer_first_name": "Eddie"
	  }
	}
}'

比如上边这个查询语义为 查询 customer_first_name 为 Eddie 的文档

Request Body Search 详解

URl 的请求方式是不推荐使用的,毕竟他操作起来比较繁琐,查询 ElasticSearch 一般使用的是 Request Body Search,通过 JSON 的方式,走查询 DSL 的语法来查询 API。

查询所有文档

ignore_unavailable=true 可以忽略尝试访问不存在的索引“404_idx”导致的报错。

POST /movies,404_idx/_search?ignore_unavailable=true
{
  "profile": true,
	"query": {
		"match_all": {}
	}
}

match_all 这个语句的查询语义是查找所有的文档,可以看到统计出了所有的文档。

分页

可以再 Request Body 加上 from、size 参数来控制分页.
注意:分页越往后成本越大。

  • from 起始位置
  • size 查询文档数量
POST /movies/_search
{
  "from":10,
  "size":20,
  "query":{
    "match_all": {}
  }
}

sort 排序

我们可以再 Request Body 中指定按照那个字段进行排序

  • desc 降序
  • asc 升序
#对年份进行排序
POST movies/_search
{
  "sort":[{"year":"asc"}],
  "query":{
    "match_all": {}
  }
}

_source 查询返回字段过滤

我们有时候可能只需要文档中的某几个字段的值,并不需要将整个文档都拉下来增加网络开支,这个时候我们可以在 _source 中指定我们想要返回的字段。

#source filtering
POST movies/_search
{
  "_source":["title","year"],
  "query":{
    "match_all": {}
  }
}

我们可以看到结果中只返回了 title,year 的值。

脚本字段

有时候我们不只是单纯的获取一个字段的值,我们可能是想要对这个字段的值进行一些运算之后再获取值,ElasticSearch 提供了一个API 属性来计算返回的值,通过 painless 脚本来计算值。
注意:如果是 text 文本的值是不能通过脚本字段来直接获取的。

#脚本字段
GET kibana_sample_data_ecommerce/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['order_date'].value+'---'+doc['customer_id'].value"
      }
    }
  },
  "query": {
    "match_all": {}
  }
}

这个查询的语义是 将 order_data 的值与 customer_id 的值相加。

match 查询

match 查询会对搜索条件进行分词然后查询。

POST movies/_search
{
  "query": {
    "match": {
      "title": "last christmas"
    }
  }
}

当然,我们还可以指定查询的布尔操作等属性,是通过 operator 去实现的,不过只支持 AND 与 OR。

  • AND
  • OR
POST movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "last christmas",
        "operator": "and"
      }
    }
  }
}

短语搜索 Phrase

Request Body Search 的 PhraseQuery 方式是通过 match_phrase 查询来搞得。

POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love",
        "slop": 1
      }
    }
  }
}

slop 的作用类似近似查询, ~ 1 ,表示中间有一个值可以模糊。

Search API 查询返回的结果

  • took 本次查询花费的时间
  • timed_out 是否超时
  • _shards 找了几个分片
  • total 符合条件的文档总数
  • 里层的 hits 查询结果集,默认前十个
  • _index 索引
  • _type 文档类型
  • _id 文档 id
  • _score 相关性算分
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 100,
      "relation" : "eq"
    },
    "max_score" : 3.8400407,
    "hits" : [
      {
        "_index" : "kibana_sample_data_ecommerce",
        "_type" : "_doc",
        "_id" : "MXjM93MBubpWmoaWdDeo",
        "_score" : 3.8400407,
        "_source" : {
          "category" : [
            "Men's Clothing"
          ],
          "currency" : "EUR",
          "customer_first_name" : "Eddie",
          "customer_full_name" : "Eddie Underwood",
          "customer_gender" : "MALE",
          "customer_id" : 38,
          "customer_last_name" : "Underwood"
          }
      }
}

对于搜索来说,用户关注的是当前搜索的结果内容多少是相关的以及多少无关的内容返回回来,_score 就是这样的一个文档与当前搜索条件相关度的一个评分,这个值越高相关度越高搜索结果排名越靠前。

Query DSL(查询领域特定语言)

DSL 是 Domain Specific Language 的缩写,指的是为特定问题领域设计的计算机语言。这种语言专注于某特定领域的问题解决,因而比通用编程语言更有效率。
在 Elasticsearch(ES)中,DSL 指的是 Elasticsearch Query DSL,一种以 JSON 形式表示的查询语言。通过这种语言,用户可以构建复杂的查询、排序和过滤数据等操作。这些查询可以是全文搜索、分面/聚合搜索,也可以是结构化的搜索。

常用 DSL 关键字

  • query: 用于包含查询使用到的语法
  • match_all: 最简单的查询,获取索引所有数据,类似搜索 *。如:”query”:{“match_all”:
  • bool: 复合查询,可以包含多个查询条件,主要有(must,must_not,should)
  • must: 用于包含逻辑与查询条件,即所有查询条件都满足才行
  • must_not: 用于包含逻辑非查询条件,即不包含所有查询的条件数据
  • should: 用于包含逻辑或查询条件,即其中有一个条件满足即可
  • filter: 与 must 一样,包含的所有条件都要满足,但不会参与计算分值,查询速度上会提升不少
  • match: 匹配查询,用于匹配指定属性数据,也可以匹配时间,IP 等特殊数据 注意: match 匹配不会解析通配符,匹配的效果受到索引属性类型影响,如果索引属性设置了分词,那么 match 匹配也会分词匹配,他也不解析”“,但可以设置逻辑关系来处理
  • operator: 匹配逻辑关系,默认是 or,可设置为 and,这样可达到精确匹配的效果
  • query_string: 使用查询解析器来解析查询内容,如 port:80 AND server:http。注意: 此类型请求有很多选项属性,可以设置一些特殊的行为
  • term: 查找包含在反向索引中指定的确切术语的文档
  • terms: 筛选具有匹配任何条件的字段,如”terms” :
  • range: 将文档与具有特定范围内的字段相匹配。Lucene 查询的类型依赖于字段类型,对于字符串字段,即 TermRangeQuery,而对于 number/date 字段,查询是一个数字的范围。如:”range”:{“port”:{“gte”:10,”lte”:20,”boost”:2.0}}
  • gte: 大于或等于
  • gt: 大于
  • lte: 小于或等于
  • lt: 小于
  • boost: 设置查询的 boost 值,默认值为 1.0
  • exists: 返回在原始字段中至少有一个非空值的文档,注意:”“,”-“这些都不算是空值
  • prefix: 匹配包含带有指定前缀字段的字段(没有分析),前缀查询映射到 Lucene 前缀查询,如:”prefix” : { “user” : “ki” },查询user数据前缀为 ki 的 doc
  • wildcard: 匹配具有匹配通配符表达式的字段(未分析)的文档。支持 (*通配符) 是匹配任何字符序列(包括空的序列)和 (?通配符) 它匹配任何一个字符。注意,这个查询可能比较慢,因为它需要迭代多个术语。为了防止非常慢的通配符查询,一个通配符项不应该从通配符开始,或者 ? 通配符查询映射到 Lucene 通配符查询。如:”wildcard” :
  • regexp: regexp 查询允许您使用正则表达式术语查询,意味着 Elasticsearch 将把 regexp 应用到该字段的标记器所产生的词汇,而不是该字段的原始文本。regexp 查询的性能严重依赖于所选择的正则表达式,通配符往往会降低查询性能。如:”regexp”:
  • fuzzy: 模糊查询使用基于 Levenshtein 编辑距离的相似性。如:”fuzzy” :
  • type: 过滤文档匹配所提供的文档/映射类型。如:”type”:
  • ids: 过滤只具有提供的 id 的文档。注意:这个查询使用了_uid 字段,类型是可选的,可以省略,也可以接受一组值。如果没有指定类型,那么将尝试在索引映射中定义的所有类型。如:”ids”:{ “type” : “my_type”,”values” : [“1”,”4”,”100”] }。
  • highlight: 允许在一个或多个字段中突出显示搜索结果,基于 lucene plain highlighter。在默认情况下,高亮显示会将高亮显示的文本包装在 *and* ,可以通过设置 pre_tags 与 post_tags 来自定义,如:”highlight”:{ “pre_tags” : [““], “post_tags” : [““], “fields” : {“_all”:{}} }
  • pre_tags: 自定义包含搜索关键字的前缀
  • post_tags: 自定义包含搜索关键字的后缀
  • fields: 用于指定要高亮的属性,_all 表示所以属性都需要高亮,如:”fields”:{ “_all” : {} },也可以指定具体属性 “fields”:{ “app” : {} },也可以给每个属性单独指定设置 “fields”:{ “app” : {“fragment_size” : 150, “number_of_fragments” : 3} }
  • highlight_query: 可以通过设置 highlight_query 来突出显示搜索查询之外的查询,通常,最好将搜索查询包含在 highlight_query 中。如:”highlight_query”:{ “bool”:{“must”:[{“query_string”:{“query”:app:apache,”analyze_wildcard”:True,”all_fields”:True}}]} }
  • fragment_size: 用于指定高亮显示时,碎片的长度,如果过短,高亮内容会被切分为多个碎片。默认情况下,当使用高亮显示的内容时,碎片大小会被忽略,因为它会输出句子,而不管它们的长度
  • number_of_fragments 用于指定高亮显示时,碎片的数量,如果指定为 0,那么就不会产生任何片段
  • from: 可以通过使用 from 和 size 参数来对结果进行分页,from 参数指定您想要获取的第一个结果的偏移量
  • size: 可以通过使用 from 和 size 参数来对结果进行分页,size 参数指定要返回结果的最大数量
  • sort: 允许在特定的字段上添加一个或多个排序,排序是在每个字段级别上定义的,用特殊的字段名来排序,然后根据索引排序进行排序,如”sort”: [ { “date”: { “order”: “desc” } } ],desc 降序,asc 升序
  • aggs: aggs 主要用于分类集合,可以将查询的数据按指定属性进行分类集合统计.如:”aggs”:{ “deviceType”:{ “terms”:{ “field”:”deviceType”, “size”:6 } } }
  • field: 用于指定要分类的属性名称
  • size: 用于指定分类集合的数量,即只集合前 N 名

查询上下文

使用 query 关键字进行检索,倾向于相关度搜索,故需要计算评分。搜索是Elasticsearch最关键和重要的部分。
在查询上下文中,一个查询语句表示一个文档和查询语句的匹配程度。无论文档匹配与否,查询语句总能计算出一个相关性分数在 _score 字段上。

相关度评分:_score

相关度评分用于对搜索结果排序,评分越高则认为其结果和搜索的预期值相关度越高,即越符合搜索预期值,默认情况下评分越高,则结果越靠前。在 7.x 之前相关度评分默认使用 TF/IDF 算法计算而来,7.x 之后默认为 BM25。

源数据:_source

source 字段包含索引时原始的 JSON 文档内容,字段本身不建立索引(因此无法进行搜索),但是会被存储,所以当执行获取请求是可以返回 source 字段。
虽然很方便,但是 source 字段的确会对索引产生存储开销,因此可以禁用 source 字段,达到节省存储开销的目的。可以通过以下接口进行关闭。

PUT my_index
{
  "mappings": {
    "_source": {
      "enabled": false
    }
  }
}

但是需要注意的是这么做会带来一些弊端,_source 禁用会导致如下功能无法使用:

  • 不支持 update、update_by_query 和 reindex API。
  • 不支持高亮。
  • 不支持 reindex、更改 mapping 分析器和版本升级。
    总结:在禁用 source 之前,应该仔细考虑是否需要进行此操作。如果只是希望降低存储的开销,可以压缩索引比禁用 source 更好。

数据源过滤器

例如,假设你的应用只需要获取部分字段(如 "name" 和 "price" ),而其他字段(如 "desc" 和 "tags" )不经常使用或者数据量较大,导致传输和处理这些额外的数据会增加网络开销和处理时间。在这种情况下,通过设置 includes 和 excludes 可以有效地减少每次请求返回的数据量,提高效率。例如:

PUT product
{
  "mappings": {
    "_source": {
      "includes": ["name", "price"],
      "excludes": ["desc", "tags"]
    }
  }
}

Including: 结果中返回哪些 field。
Excluding: 结果中不要返回哪些 field,不返回的field不代表不能通过该字段进行检索,因为元数据不存在不代表索引不存在,Excluding 优先级比 Including 更高。

需要注意的是,尽管这些设置会影响搜索结果中 _source 字段的内容,但并不会改变实际存储在Elasticsearch 中的数据。也就是说,"desc" 和 "tags" 字段仍然会被索引和存储,只是在获取源数据时不会被返回。

在 mapping 中定义这种方式不推荐,因为 mapping 不可变。我们可以在查询过程中使用 _source 指定返回的字段,如下:

GET product/_search
{
  "_source": {
    "includes": ["owner.*", "name"],
    "excludes": ["name", "desc", "price"]
  },
  "query": {
    "match_all": {}
  }
}

Elasticsearch 的 _source 字段在查询时支持使用通配符(wildcards)来包含或排除特定字段。使得能够更灵活地操纵返回的数据。
关于规则,可以参考以下几点:

  • *:匹配任意字符序列,包括空序列。
  • ?:匹配任意单个字符。
  • [abc]: 匹配方括号内列出的任意单个字符。例如,[abc]将匹配"a", "b", 或 "c"。
    请注意,通配符表达式可能会导致查询性能下降,特别是在大型索引中,因此应谨慎使用。

Aggregations(聚合)

聚合框架有助于提供基于搜索查询的聚合数据。 它基于被称为聚合(aggregations)的简单构建块,可以组合这些块来构建复杂的数据摘要。
聚合可以被看作是在一组文档上构建分析信息的工作单元。 执行的上下文定义了这个文档集是什么(例如,顶级的聚合在搜索请求的已执行的 query/filter 的上下文中执行)。
有许多不同类型的聚合,每种都有自己的目的和输出。 为了更好地理解这些类型,通常更容易将它们分为四大类:

  • Bucketing
    构建桶(bucket)的一系列聚合,其中每个桶都与一个 key 和一个文档标准相关联。 执行聚合时,将在上下文中的每个文档上去评估所有的桶标准,当标准匹配时,该文档将被视为“落入”相应的桶。 在聚合过程的最后,我们将得到一个桶列表——每个桶都有一组“属于”它的文档。
  • Metric
    跟踪和计算一组文档 度量(metric) 的聚合。
  • Matrix
    对多个字段进行操作并根据从请求的文档字段中提取的值生成 矩阵(matrix) 结果的一系列聚合。 与 metric 和 bucket 聚合不同,此聚合系列尚不支持脚本。
  • Pipeline
    聚合其他聚合的输出及其相关度量的聚合
    接下来的部分才是有趣的。 由于每个桶都有效地定义了一个文档集(属于该桶的所有文档),因此可以在桶级别关联聚合,这些聚合将在该桶的上下文中执行。 这就是聚合的真正威力所在:聚合可以嵌套!

bucketing 聚合可以有子聚合(bucketing 或 metric)。 将为其父聚合生成的桶计算子聚合。 对嵌套聚合的级别/深度没有硬性限制(可以将一个聚合嵌套在一个“父”聚合下,而这个父聚合本身是另一个更高级聚合的子聚合)。
聚合在数据的 double 表示法上进行操作。 因此,在绝对值大于 2^53 的长整型数上运行时,结果可能是近似的。

REST API

Elasticsearch 暴露的 REST API,提供给 UI 组件使用,也可以直接被调用来配置及访问 Elasticsearch 特性。

常用API

  • 索引 index:test_index
  • 类型 type:test_type
  • 字段名 filed:test_filed

集群支持的选项

curl -XGET "http://172.0.0.52:9200/_cat"

查看节点信息

curl -XGET "http://172.0.0.52:9200/_cat/nodes?v"

查看 master 节点信息

curl -XGET "http://172.0.0.52:9200/_cat/master?v"

查看所有节点上的热点线程

curl -XGET "http://172.0.0.52:9200/_nodes/hot_threads"

查看有问题的分片或索引

curl -XGET "http://172.0.0.52:9200/_cluster/allocation/explain?pretty"

查看线程池设置

curl -XGET "http://172.0.0.52:9200/_nodes/thread_pool/"

统计全部信息

curl -XGET "http://172.0.0.52:9200/_cluster/stats?human&pretty"

查看集群状态

curl -XGET "http://172.0.0.52:9200/_cluster/health?pretty"

查看 ES 信息

curl -XGET "http://172.0.0.52:9200/"

获取所有索引的信息

curl -XGET "http://172.0.0.52:9200/_cat/indices?v&pretty"
curl -XGET "http://172.0.0.52:9200/_cat/nodes?v"
curl -XGET "http://172.0.0.52:9200/_cat/segments?v&h=shard,segment,size,size.memory"

获取所有文档数量

curl -XGET "http://172.0.0.52:9200/_count?pretty" -H 'Content-Type: application/json' -d'
{
    "query": {
        "match_all": {}
    }
}'

查看集群的健康状态

  • green:所有功能都是完好的;
  • yellow:所有数据是可用的,但是一些副本还没有被分配;
  • red代表一些数据由于某些原因已经不可用。
  • 注意,尽管一个集群是 red 状态,它仍然可以提供部分服务(比如,它会继续从可用的切片数据里搜索),但是在失去部分数据后,需要尽快去修复。
curl -XGET "http://172.0.0.52:9200/_cat/health?v"

创建索引

  • test_index 索引名
  • pretty 参数表示输出格式良好的 JSON 响应(如果存在)
curl -XPUT "http://172.0.0.52:9200/test_index?pretty"

查看索引列表

curl -XGET "http://172.0.0.52:9200/_cat/indices?v"
curl -XGET "http://172.0.0.52:9200/test_index"

删除索引

  • 根据索引名称删除
curl -XDELETE "http://172.0.0.52:9200/test_index?pretty"
  • 可以一次删除多个索引(以逗号间隔)删除所有索引 _all 或通配符 *

创建文档

  • 向 es 中插入文档的时候,必须要指定一个类型(type)

使用 PUT 来创建文档,需要指定 字段

  • 索引 index:test_index
  • 类型 type:test_type
  • 字段名 filed:test_filed
curl -XPUT "http://172.0.0.52:9200/test_index/test_type/test_filed?pretty" -H 'Content-Type: application/json' -d'
{"name": "ghl", "age": 24, "sex": "male"}'

使用 POST 来创建文档,可以不指定id(不指定时随机生成id)

curl -XPOST "http://172.0.0.52:9200/test_index/test_type?pretty" -H 'Content-Type: application/json' -d'
{"name": "Jack"}'

查看文档

curl -XGET "http://172.0.0.52:9200/test_index/test_type/test_filed?pretty"

替换文档

使用 PUT 并指定 id 时,es 会使用新的文档替换原文档

curl -XPUT "http://172.0.0.52:9200/test_index/test_type/test_filed?pretty" -H 'Content-Type: application/json' -d'
{"name": "Jack"}'

更新文档

curl -XPOST "http://172.0.0.52:9200/test_index/test_type/test_filed/_update?pretty" -H 'Content-Type: application/json' -d'
{"doc":{"name": "Lucy"}}'

删除文档

curl -XDELETE "http://172.0.0.52:9200/test_index/test_type/test_filed?pretty"

索引的增删改查有一个类似的格式下:

curl -XGET "http://172.0.0.52:9200/<Index>/<Type>/<ID>"
  • REST Verb:REST 风格的语法谓词;
  • Node:节点 ip;
  • port:节点端口号,默认 9200;
  • Index:索引名;
  • Type:索引类型;
  • ID:操作对象的 ID 号;

判断索引是否存在

curl -XHEAD "http://172.0.0.52:9200/test_index"

查看索引模板

curl -XGET "http://172.0.0.52:9200/_template/template_1"
curl -XGET "http://172.0.0.52:9200/_template/temp*"
curl -XGET "http://172.0.0.52:9200/_template/template_1,template_2"
curl -XGET "http://172.0.0.52:9200/_template"

删除模板

curl -XDELETE "http://172.0.0.52:9200/_template/template_1"

打开/关闭索引

curl -XPOST "http://172.0.0.52:9200/test_index/_close"
curl -XPOST "http://172.0.0.52:9200/test_index/_open"
curl -XGET "http://172.0.0.52:9200/_cat/indices?v"

查看索引状态信息

curl -XGET "http://172.0.0.52:9200/_stats"
curl -XGET "http://172.0.0.52:9200/logstash-nginx-access-2019.08.07,test_index/_stats"

查看索引段信息

curl -XGET "http://172.0.0.52:9200/test_index/_segments"
curl -XGET "http://172.0.0.52:9200/logstash-nginx-access-2019.08.07,test_index/_segments"
curl -XGET "http://172.0.0.52:9200/_segments"

标签:http,9200,笔记,查询,索引,文档,elasticsearch,Elasticsearch
From: https://www.cnblogs.com/TMesh/p/18679214

相关文章

  • 折腾笔记[6]-使用rust绘制三维画面
    摘要使用rust绘制界面;界面包含一个三维坐标轴,使用鼠标旋转坐标轴,左侧显示对应的旋转向量,四元数等信息.UseRusttodrawtheinterface;theinterfacecontainsathree-dimensionalcoordinateaxis,whichcanberotatedusingthemouse,andthecorrespondingrotati......
  • 运算放大器应用电路设计笔记(四)
    动态范围表示正常工作时最小振幅与最大振幅的范围。例如,最小振幅为-14v,最大振幅为+14v,则动态范围为±14v,也有用绝对值或有效值表示振幅,最大电压与最小电压之比为动态范围,也称为多少dB。这时,最大振幅由电源电压决定,最小振幅由噪声或失调电压决定。确保动态范围的最简单方法......
  • 数学笔记
    定义一个形如\(x=a+bi\)的数为复数。上式中的\(i\)为虚数单位,有\(i\cdoti=-1\)。两个复数\(x\)和\(y\)相等,当且仅当\(x_a=y_a\)且\(x_b=y_b\)。对于一个复数\(x\),我们称\(a\)为\(x\)的实部,\(b\)为\(x\)的虚部。当\(a=0\)时,称\(x\)为纯虚数。......
  • NixOS使用笔记
    官方源:https://channels.nixos.org/清华源:https://mirrors.tuna.tsinghua.edu.cn/nix-channels本文使用清华源。升级系统官方文档:https://nixos.org/manual/nixos/stable/#sec-upgrading比如升级到24.11,首先升级到#sudonix-channel--addhttps://channels.nixos.org/nixo......
  • [数据结构学习笔记16] 线性查找(Linear Search)
    查找算法是指从一个集合里比如数组,列表,树里查找我们想要的值。我们从最简单的线性查找开始。线性查找,就是遍历集合里的元素,查看是否有和我们想要查找的值相同的,有则查找成功,没有则查找失败。比如:5,8,6,9,1,7,3,2,4我们要找3,那从5开始依次往后,到了第7个(下标6),我们找到了3。如果我们要找......
  • 计数问题学习笔记
    基础差得死,整版讲课课件能看懂的就\(10\%\),所以过来补一补。数学那一块差不多,计划单开一个博客。分类整理以下吧。卡特兰数问题引入有一个大小为\(n\timesn\)的网格图,每次从\((x,y)\)只能走一步到\((x+1,y)\)或\((x,y+1)\),求不走到对角线即\(y=x\)下方,但可以触碰对......
  • base中TCP/IP基础学习笔记
    base中的网络模型的学习笔记一.关于TCP/IP网络模型引言对于同一台设备上的进程间通信,有很多种方式,有管道、消息队列、共享内存、信号等方式,对于不同设备上的进程间通信,就需要网络通信,设备是多样的,所以要兼容各种各样的设备,就协商出了一套通用的网络协议。网络协议是分层......
  • Pandas使用笔记
    个人学习笔记日期转换索引日期格式:2023-09-1215:00:00转换为:2023-09-12importpandasaspd#假设你的DataFrame名为df,索引是2023-09-1215:00:00#这里创建一个示例DataFrame用于演示data={'value':[1,2,3]}index=pd.to_datetime(['2023-09-1215:00:......
  • THREE.js学习笔记9——Materials
    这一小节主要学习材质材质用于为几何物理模型的每个可见像素添加颜色。Materialsareusedtoputacoloroneachvisiblepixelofthegeometries.决定每个像素颜色的算法是在程序中编写的,称为着色器。Three.js具有许多带有预制着色器的内置材料。Algorithmsthatdecid......
  • 黑马前端学习笔记(1)HTML5篇
    第一天目录第一天1、HTML定义2、标签语法3、HTML基本骨架4、标签的关系5、注释6、排版标签①标题标签②段落标签③换行和水平线标签④文本格式化标签7、图像标签①基本使用②属性8、路径①相对路径-从当前文件位置出发查找目标文件②绝对路径-从盘符出发查找......