目录

前言

ElasticSearch概述

安装elasticsearch

上传至服务器并解压

elasticsearch目录结构

目录名词解释

修改核心配置文件 elasticearch.yml

修改 jvm 参数

添加用户

系统性能优化

启动es

验证访问

安装elasticsearch-head

官网下载head安装

git安装方法如下

安装node

 添加环境变量

安装nmp

访问测试head

head界面操作

安装kibana

简介

下载kibana

上传服务器并解压

启动kibana

访问验证kibana

es的核心概念

概述

集群(cluster)

分片(Shard)

副本(Replica)

索引(index)

倒排索引

类型(Type)

文档(Document)

映射(Mapping)

IK分词器安装

进入github下载:

上传至服务器并解压

测试ik分词器

ik_smart(最少切分)

ik_max_word(最细力度划分)

新建词库

新增词库修改配置

测试截图

索引的基本操作

新建索引(PUT)

查看索引(GET)

查看集群信息

查看集群健康状况

修改索引(POST)

删除索引(DELETE)

ES字段类型

字符串类型

日期类型

布尔值类型

二进制类型

文档的基本操作

简单查询

GET命令查询

条件查询

复杂查询

排序查询

分页查询

布尔值查询

must

should (只要符合其中一个条件就返回)

must_not

filter

匹配多个条件查询

精准查询(trem)

高亮查询

自己设置高亮标签

es分片

分片介绍

分片设置

es服务器选择

磁盘选择:

内存选择:

角色分离:

前言

最近一直想分享一篇 elasticsearch 的保姆级教程,于是,趁着同事都在摸鱼,我偷偷产出了自认为算是非常详细的,基于目前版本elasticsearch7.13.0教程。不管是新手上路,还是驰骋疆场的老司机,都建议收藏一下,希望看完对您有所帮助!如果可以,记得收藏学习。

ElasticSearch概述

ES是一个基于RESTful web接口并且构建在Apache Lucene之上的开源分布式搜索引擎。同时ES还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,能够横向扩展至数以百计的服务器存储以及处理PB级的数据。可以在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。ES就是为高可用和可扩展而生的。

一方面可以通过升级硬件来完成系统扩展,称为垂直或向上扩展(Vertical Scale/Scaling Up)。
另一方面,增加更多的服务器来完成系统扩展,称为水平扩展或者向外扩展(Horizontal Scale/Scaling Out)。
尽管ES能够利用更强劲的硬件,但是垂直扩展毕竟还是有它的极限。真正的可扩展性来自于水平扩展,通过向集群中添加更多的节点来分担负载,增加可靠性。
ES天生就是分布式的,它知道如何管理多个节点来完成扩展和实现高可用性。意味应用不需要做任何的改动。

安装elasticsearch

我们首先来到 es 的官网,根据自己操作系统,点击即可下载es即可,本次使用的是es7.13.0

elasticsearch官网地址如下:

Elasticsearch 7.13.0 | Elastic

elasticsearch官网详细下载步骤

第一步进入elasticearch官网

Elasticsearch 平台 — 大规模查找实时答案 | Elastic

第二步把鼠标放在Platform上选中elasticsearch点击进入

第三步点击下载elasticsearch

第四步:选在适合自己的系统版本(默认这里为最新版本

如果要下载之前的版本可以点击View past release选择过去版本

我这里选在的是7.13.0版本 点击download下载

选择自己的系统下载

等待安装包下载完成即可

上传至服务器并解压

解压命令如下:

tar -xf   elasticsearch-7.13.0-linux-x86_64.tar.gz

这样解压默认是解压在当前目录下  可以这样理解:

就是说如果你当前目录是在/root/目录下那么es解压就解压到了/root/目录下

如果你想要把他解压到指定目录下可以加-C选项  如下:

tar -xf   elasticsearch-7.13.0-linux-x86_64.tar.gz  -C  /data/  

这表示我把elasticsearch解压到了/data/目录下

elasticsearch目录结构


[www@node3 elasticsearch]$ ll
总用量 6336
drwxr-xr-x  2 www www    4096 5月  20 2021 bin
drwxr-xr-x  3 www www     199 11月  2 08:42 config
drwxr-xr-x  9 www www     107 5月  20 2021 jdk
drwxr-xr-x  3 www www    4096 5月  20 2021 lib
-rw-r--r--  1 www www    3860 5月  20 2021 LICENSE.txt
drwxr-xr-x  2 www www     282 11月  3 08:54 logs
drwxr-xr-x 59 www www    4096 5月  20 2021 modules
-rw-r--r--  1 www www  594096 5月  20 2021 NOTICE.txt
drwxr-xr-x  3 www www      16 11月  1 21:17 plugins
-rw-r--r--  1 www www    2710 5月  20 2021 README.asciidoc

目录名词解释

  • bin:可执行文件在里面,运行es的命令就在这个里面,启动es也是在bin目录下启动
  • config:配置文件目录
  • JDK:java环境
  • lib:依赖的jar,类库
  • logs:日志文件
  • modules:es相关的模块
  • plugins:可以自己开发的插件 我们下载的插件也是放在里面

修改核心配置文件 elasticearch.yml

[www@node3 config]$ grep -v "^$" elasticsearch.yml |grep -v "^#"

#修改集群名称
cluster.name: my-elasticsearch

#修改节点名称
node.name: node3

#数据储存节点
path.data: /data01/es/data

#集群日志存储
path.logs: /data01/es/logs

#网络绑定
network.host: 0.0.0.0

#可以成为master节点
cluster.initial_master_nodes: ["node3"]

#跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"

 

修改 jvm 参数

[www@node3 config]$ grep -v "^$"  jvm.options |grep -v "^#"
-Xms512m
-Xmx512m

 

vim /jvm.options

这里默认为1G 但是我是自己的虚拟机给的内存不大  所以我就修改成为了512m,

如果你的内存够大你可以设置大一点  但一般不超过32G

添加用户

因为es不能使用root用户来启动,所以我们需要新建普通用户来启动es

1. 创建www用户组及www用户:

groupadd www
useradd www -g www
passwd www# 接下来会输入两次密码
# new password
# retype passwd

# 2. 切换到www用户再启动
su www

系统性能优化

这里要使用root用户才能修改

cat /etc/security/limits.conf
* soft nofile 655360
* hard nofile 655360
 
cat /etc/sysctl.conf
vm.max_map_count = 655360

#保存退出后使用下面命令使其生效

sysctl -p

启动es

我们这里直接使用后台启动的方式:

启动es时记得使用普通用户启动

进入es/bin目录下

[www@node3 bin]$ pwd
/data01/elasticsearch/bin

执行下面的命令

[www@node3 bin]$./elasticsearch -d   #后台启动命令

新手建议第一次使用前台启动的方式
www@node3 bin]$./elasticsearch      #不加-d就是前台启动   前台启动方便看日志

后台启动查看日志方式 (在上面的es配置文件中我们定义了日志的输出位置所以我们只需要进入到日志目录查看日志即可

使用命令tail  -f my-elasticsearch.log  查看是否启动成功 (这里强烈推荐大家去看日志,因为我们不管部署任何软件程序,看日志都能直观的告诉我们这个程序或者应用是否启动成功,如果没有启动成功原因是什么?养成一个爱看报错看日志的好习惯是一个非常不错的选择

看到[node3] started  表示es启动成功

也可以查看es端口是否成功启动命令如下:

ss -ntl

验证访问

地址如下:

http://192.168.12.13:9200/

这里的ip地址替换为你自己部署的ip地址即可

安装elasticsearch-head

为什么要安转head了?

因为elasticsearch-head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。elasticsearch-head是一款开源软件,被托管在github上面,所以如果我们要使用它,必须去github官网拉取下载他。

官网下载head安装

下载地址:https://codeload.github.com/mobz/elasticsearch-head/zip/refs/heads/master

也可以es主机安装git  使用git命令克隆到本地

git安装方法如下

#克隆到es主机 

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

 open http://localhost:9100/

我使用的是下载直接去官网下载安装包上传至es主机解压

安装node

安装依赖gcc

yum install gcc gcc-c++

下载node国内镜像(推荐)

wget https://npm.taobao.org/mirrors/node/v10.14.1/node-v10.14.1-linux-x64.tar.gz

解压重命名

tar -xvf  node-v10.14.1-linux-x64.tar.gz
mv node-v10.14.1-linux-x64    node

 添加环境变量

这里要使用root用户添加

vim /etc/profile

export NODE_HOME=/data01/node
export PATH=$NODE_HOME/bin:$PATH

#使配置生效

source  /etc/porfile

验证npm和node

这里说明node已经安装成功

安装nmp

[root@node3 ~]# npm -g install npm@6.9.0
/data01/node/bin/npm -> /data01/node/lib/node_modules/npm/bin/npm-cli.js
/data01/node/bin/npx -> /data01/node/lib/node_modules/npm/bin/npx-cli.js
+ npm@6.9.0
added 54 packages from 9 contributors, removed 15 packages and updated 47 packages in 13.542s

我这里安装npm和是加了版本号才安装成功的

我们上面谈到的 npm 命令是 node.js 的 npm 插件管理器,也就是下载插件安装插件的管理器。但我们在使用的时候,下载的都是国外服务器很慢会掉线,所以这一步,我们需要安装淘的 npm 镜像cnpm

安装命令如下:

npm install -g cnpm --registry=https://registry.npm.taobao.org

如果你安装效果如上图的话说明cnpm安装成功

我们进入到elasticsearch-head的目录下,执行命令,下载相关的依赖

[www@node3 elasticsearch-head-master]$ cnpm install   #下载相关依赖

这里如果不安装cnpm  直接使用npm  install  进行安装的话会很慢

预计要好几个小时(本人亲测)

当cnpm  install  安装完成会生成一个node_modules目录如下图

现在npm依赖和node都已经安装完毕  我们进入到head目录下启动head

启动命令如下:

www@node3 elasticsearch-head-master]$ nohup npm run start &   #我这是使用后台启动
[1] 1660
[www@node3 elasticsearch-head-master]$ nohup: 忽略输入并把输出追加到"nohup.out"

可以去查看nohup.out输出日志如下图:

如果你的head启动后日志如上图说明你的head安装成功

访问测试head

然后我们就可以在浏览器上通过 ip:9100 访问到如下页面,但是当我们点击连接,在控制台又会出现 Error 信息,这又是为什么呢?

原来是因为从另外一个域的浏览器访问ES服务器数据,会出现跨域的问题。,所以我们要在ES的配置文件中添加如下配置下:

其是这个配置在上面我们修改主配置文件的时候就已经添加了  正常添加了是不会报错的 ,我是为了这个错能更好理解跨域,所以才把这个错放到这里,如果严格按照我的笔记来是不会出现这个错误的

es跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
 

现在我们可以清楚的看到head页面正常了

上面那些索引是我自己新建的 如果你们的head界面能正常看到自己的节点就是没有问题的

head界面操作

查看索引

查看索引内的数据

基本查询方法

查询方法我们这里不重点介绍我们会在后面的kibana中重点建索引的曾、删、改、查

到这里可能有人就要问了 为什么集群状态会是黄色的了?

这个问题问得非常好:

其实是因为我们现在搭建的是单节点es ,然而es一个节点也自成一个集群,但是这样会出现一个问题?

就是es数据没有办法备份,因为es的副本 都是存在不同的节点上的,

试想一下如果副本存在同一个节点上,当这个节点挂掉之后,是不是这个节点存储的数据就访问不到了,

而如果数据备份到其他的节点 我这个节点挂掉之后不会影响我的数据查询,我的数据还是在的

而es集群有三种颜色

集群状态表
gree绿色代表集群状态正常
yellow黄色代表集群大部分分片可用
red红色

代表集群不可用

安装kibana

简介

Kibana 是为 Elasticsearch设计的开源分析和可视化平台。你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图标的形式展现出来。

下载kibana

官网地址:https://www.elastic.co/cn/kibana

点击上面官网地址下载步骤如下:

第一步点击下载kibana

第二步:选择和自己es一样的版本下载

这里是选择以前的版本

第三步:选择对应版本点击下载

上传服务器并解压

修改核心配置文件

[www@node1 config]$ vim kibana.yml

#监听端口

server.port: 15601         

#允许所有的ip访问
server.host: "0.0.0.0"

#es集群节点
elasticsearch.hosts: ["http://192.168.12.13:9200"]

#es 用户
elasticsearch.username: "www"

#es密码
elasticsearch.password: "密码"

#将kibana 设置为中文
i18n.locale: "zh-CN"

如果这里不设置为中文进入kibana界面会是英文的界面  当然如果你的英文好就不用设置

启动kibana

进入到bin目录下启动kibana

启动命令为:

nohup  ./kibana  &   #后台启动

#个人比较喜欢后台启动的方式

查看kibana的端口

说明我的kibana已经成功启动了

访问验证kibana

访问地址如下:

http://ip:端口

http://192.168.12.15:15601

这就代表我们已经成功进入kbiana界面了

es的核心概念

概述

在前面的学习中,我们已经掌握了 es 是什么,同时也把 es 的服务已经安装启动,那么 es 是如何去存储数据,数据结构是什么,又是如何实现搜索的呢?接下来让我们一起走进es的世界,

节点(Node)

运行了单个实例的ES主机称为节点,它是集群的一个成员,可以存储数据、参与集群索引及搜索操作。节点通过为其配置的ES集群名称确定其所要加入的集群。

这里单个节点也是一个集群只是这个集群并不具备真正意义上集群所包含的功能

集群(cluster)

ES可以作为一个独立的单个搜索服务器。不过,一般为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。

简单的来理解集群就是:

集群是由对台服务器节点组成的

分片(Shard)

ES的“分片(shard)”机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。

这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。降低单服务器的压力,构成分布式搜索,提高整体检索的效率(分片数的最优值与硬件参数和数据量大小有关)。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

副本(Replica)

副本是一个分片的精确复制,每个分片可以有零个或多个副本。副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

索引(index)

ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库。

一个ES集群中可以按需创建任意数目的索引,但根据不同的硬件配置,索引数有一个建议范围

倒排索引

elasticsearch 使用的是一种称为倒排索引的结构,采用Lucene倒排索引作为底层。这种结构适用于快速的全文搜索, 一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。 例如,现在有两个文档, 每个文档包含如下内容:
 

举个例子:

文章id标签标签文章id
1pythonpython1,2,3
2pythonshell3,4
3shell,python
4shell

如果要搜索含有 python 标签的文章,那相对于查找所有原始数据而言,而使用倒排索引后的数据将会快的多。只需要 查看标签这一栏,然后获取相关的文章ID即可。完全过滤掉无关的所有数据,提高效率!

类型(Type)

类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。类比传统的关系型数据库领域来说,类型相当于“表”

特别注意的是,根据官网信息:在Elasticsearch 6.0.0或更高版本中创建的索引只能包含一个映射类型。在5.x中创建的具有多种映射类型的索引将继续像在Elasticsearch 6.x中一样工作。类型将在Elasticsearch 7.0.0中的API中弃用,并在8.0.0中完全删除

文档(Document)

文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。相当于mysql表中的row

映射(Mapping)

映射是定义文档及其包含的字段如何存储和索引的过程。

例如,使用映射来定义

     哪些字符串字段应该被视为全文字段。
     哪些字段包含数字、日期或地理位置。
     文档中所有字段的值是否应该被索引到catch-all _all字段中。
     日期值的格式。
     用于控制动态添加字段的映射的自定义规则。
每个索引都有一个映射类型,它决定了文档的索引方式。
 

IK分词器安装

什么是ik分词器?

举个例子:

  有一个词语:“”太帅了啊“”    如果安照正es解析的话可能会把这个“”太帅了啊“”词分为太帅了和啊 两个词组   但是我想要的效果就是“”太帅了啊“”是一个词组,于是乎ik分词器应运而生。

进入github下载:

https://github.com/medcl/elasticsearch-analysis-ik/

因为github下载前面也有讲过,不懂的可以看下head的安装

下面这个是我自己的版本的下载地址,如果慢的话可以复制链接使用迅雷下载

https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.13.0/elasticsearch-analysis-ik-7.13.0.zip

上传至服务器并解压

记得要解压到es的pugins目录下并改名为ik

给ik文件夹授权

chmod 777 ik

最后重启es进入kibana测试

进入kibana选在开发者工具

测试ik分词器

ik_smart(最少切分)

代码演示

GET _analyze
{
  "analyzer": "ik_smart",
  "text": ["美好生活"]
}

效果如下

{
  "tokens" : [
    {
      "token" : "美好生活",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 0
    }
  ]
}

ik_max_word(最细力度划分)

代码演示

{
  "tokens" : [
    {
      "token" : "美好生活",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "美好",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "好生",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "生活",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 3
    }
  ]
}

从上面的试验中我们得出:

建议:一般情况下,为了提高搜索的效果,需要这两种分词器配合使用。
既建索引时用 ik_max_word 尽可能多的分词,而搜索时用 ik_smart 尽可能提高匹配准度,让用户的搜索尽可能的准确。

从上面的分词中我们不难能看出一个问题?

那就是一个词组“”美好生活“” 我想要的结果是通过最细力度切分后还能打印“”美好生活“”这个词组,而不是被切分成多个词组,这是我不想看到,那么有没有办法了?

当然是有办法实现的,什么办法了? 

办法就是新建一个属于自己的词库,因为我们之前都是使用的默认的词库,使用默认的词库可能达不到我们所预期的目标或者想法,所以我们可以通过新建词库来实现自己想要的词组

新建词库

新增词库修改配置

步骤如下:

进入/data01/elasticsearch/plugins/ik/config 目录下

新建一个以.dic结尾的词库

我新建的词库如下:

[www@node3 config]$ vim xihuanni.dic
[www@node3 config]$
[www@node3 config]$
[www@node3 config]$ cat xihuanni.dic
喜欢你啊
[www@node3 config]$
 

现在我们就去测试看一下是不是真的会打印出现我们想要的“”喜欢你啊“”

修改vim   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">xihuanni.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
 

在配置文件中加入我们刚才新增的词库然后重启es让配置生效

测试截图

未新增词库之前测试“”喜欢你啊“”截图

新增词库之后测试“”喜欢你啊“”截图

我们可以清楚的看到未新增词库之前“”喜欢你啊“”这个词组不是一个完整的 而在新增词组之后发现““喜欢你啊””成为了一个词组,达到了我们预期想要实现的样子

索引的基本操作

新建索引(PUT)

PUT /索引名/类型名(未来没有)/文档id
{请求体}

PUT /testa/type1/1
{
  "name": "小草",
  "age": 21
}

我们可以清楚的看到testa这个索引已经创建成功了

查看索引(GET)

查看方法:

GET  /索引名/类型/id/

通过GET 索引名的方式可以查看索引的信息

查询的时候加上文档类型和id可以看到文档的详细信息

查看集群信息

 GET _cat/indices?v

查看集群健康状况

命令如下:

GET _cat/health

黄色表示集群的大部分分片可以使用

修改索引(POST)

修改方法:

POST  /索引名/类型/id/_updete

{
  "doc":{
    "name": "小草"     #需要修改的字段名
  }
}
 

其实修改索引里的值也可以使用GET方法 但是gei方法修改的话会改变原有的值所以一般使用POST方法

比如说我们现在testa这个索引文档里面的字段name名字为“”小花“”我现在通过POST方法把“”小花“”改为“”小草“”

未改前截图

修改后截图

修改后的状态为update版本为2

进行查看修改后的testa索引下name字段是否修改为“”小草“”

我们可以清楚的看到name字段已经发生了变化  由之前的“”小花“”改为现在的“”小草“”

删除索引(DELETE)

删除索引命令:

DELETE   索引名

通过head插件查看es现在的索引情况

我们可以清楚的看到es里有7个索引  我们尝试删除test索引

在kibana控制台我已经通过命令把test索引库删掉

现在我们去head插件查看删除情况

如上图所示test索引库已经被删除了

ES字段类型

字符串类型

text 

当一个字段需要用于全文搜索(会被分词),比如产品名称、产品描述信息, 就应该使用text类型。该类型字段会通过分析器转成terms list,然后存入索引。该类型字段不用于排序、聚合操作。

 keyword

当一个字段需要按照精确值进行过滤、排序、聚合等操作时, 就应该使用keyword类型。该类型的字段值不会被分析器处理(分词)

日期类型

date

布尔值类型

boolean

二进制类型

binary

二进制类型是Base64编码字符串的二进制值,不以默认的方式存储,且不能被搜索

文档的基本操作

简单查询

我们先新建一个db索引

PUT /test/user/6
{
  "name": "小明",
  "age": 3,
  "color": "pink",
  "desc": "好读书",
  "tags": ["吃货","直男","小说"]
}

效果如下:

GET命令查询

通过GET /索引名/类型/文档id的方式查询

语法:

GET /db/user/6    #查询出了db索引库下6号的所有信息

条件查询

语法:

GET /索引名/类型/_search?q=字段:值

效果如下:

我们看一下结果 返回并不是 数据本身,是给我们了一个 hits ,还有 _score得分,就是根据算法算出和查询条件匹配度高的分就越高

其实就相当于我们日常生活中 在网站上面买东西一样  你搜索一个你喜欢的东西就会涉及权重分值计算

复杂查询

排序查询

现在我们的db索引库里有四条数据准备跟据年龄字段来排序

排序语法如下:

GET /索引名/数据类型/_search
{
  "query": {
    "match": {
      "name": "王五"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
    ]
}

query      匹配所有文档

match     单字段匹配

_search  搜索文档api

查询返回的结果

同理,如果我们想要生序查询,只需要将desc换成了asc即可

如下图:

分页查询

学到这里,我们也可以看到,我们的查询条件越来越多,开始仅是简单查询,慢慢增加条件查询,增加排序,对返回结果进行限制。所以,我们可以说,对 于 elasticsearch 来说,所有的查询条件都是可插拔的。比如说,我们在查询中,仅对返回结果进行限制: 我想看那一页我就看那一页的数据,这样的查询我们称之为分页查询

语法如下:

GET /db/user/_search

  "query":
  {"match_all": {}
  },
  "from":0,  # 从第n条开始
  "size":4   # 返回n条数据
  }

效果如下:

分页查询类似于我们SQL中的 limit 语句。在 es 中我们想要实现这样的效果只需要用 from 指定 从第几条数据开始,size指定返回多少条数据即可。如果有四条数据就可以写成from:0  size:4这样四条数据都能查看

布尔值查询
must

must字段对应的是个列表,也就是说可以有多个并列的查询条件,一个文档满足各个子条件后才最终返回

我现在的db索引库name=小明的有两条数据但是我只是想要年龄等于20岁的

语法:

GET /db/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "小明"
          }
        },
        {
          "match": {
            "age": "20"
          }
        }
      ]
    }
  }
}

must  相当于我有多个条件多个条件都要满足

效果如下:

should (只要符合其中一个条件就返回)

GET /db/user/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "白"
          }
        },
        {
          "match": {
            "age": "3"
          }
        }
      ]
    }
  }
}

should  只要满足一个条件就会返回

现在我分别是name包含白和年龄等于3

现在我满足一个条件  就是名字中包含白  年龄为100岁 这个的话正确答案应该只会返回一条数据

果然和我们所预期的一样   should 只需要满足一个条件即可

must_not

表示如果我查询年龄等于3岁的,但是满足条件等于三岁的不会返回不等于三岁的才返回

语法

GET /db/user/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "age": "3"
          }
        }
      ]
    }
  }
}

效果如下:

filter

名词解释:

gt:大于,相当于关系型数据库中的 >。
gte:大于等于,相当于关系型数据库中的 >=。
lt:小于,相当于关系型数据库中的 <。
lte:小于等于,相当于关系型数据库中的 <=

语法如下:

GET /db/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "小明"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "age": {
              "lte": 3
            }
          }
        }
      ]
    }
  }
}

效果如下:

匹配多个条件查询

语法如下:

GET /db/user/_search
{
  "query": {
    "match": {
       "tags": "直 艾"
    }
  }
}

表示我的tags字段中只要包含有这两个字都给我列出来  字和字之间用空格隔开

效果如下:

精准查询(trem)

trem直接使用倒排索引指定的词条进程进行精确查询

名词解释:

trem    直接查询精确的
match   会使用分词器解析(先分析文档然后在通过分析的文档进行查询)

语法如下:

GET /db/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
              "age": "15"
            }
          },
          {
            "term": {
             "age": "3"
            }
          }
      ]
    }
  }
}

表示年龄等于3和15岁的数据打印出来

效果如下:

高亮查询

我们可以通过highlight属性,来对我们查询的结果的指定字段做高亮显示!

语法如下:

GET /db/user/_search
{
  "query": {
    "match": {
      "name": "白"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

表示把白字给高亮打印

效果如下:

自己设置高亮标签

就相当于系统给的高亮颜色我不喜欢  我就是要自己去设置自己喜欢的颜色  比如我喜欢粉色

pre_tag:指定前缀标签,如 <font color="red">
post_tags:指定后缀标签,如 </font>
field:指定那个字段为高亮字段

语法如下:

GET /db/user/_search
{
  "query": {
    "match": {
      "name": "白"
    }
  },
  "highlight": {
    "pre_tags": "<font color=pink>",
    "post_tags": "</font>",
    "fields": {
      "name": {}
    }
  }
}
 

效果如下:

es分片

分片介绍

1.集群由节点组成,节点由分片、副本组成,一个索引分为多个分片,一个分片有索引,类型组成,类型有文档组成。这是他们之间的关系。

2.分片:每一个分片就是一个完整的索引。分片里面包含索引,type。

因为 ES 是个分布式的搜索引擎, 所以索引通常都会分解成不同部分, 而这些分布在不同节点的数据就是分片. ES自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配, 所以用户基本上不用担心分片的处理细节。

3.副本:ES 默认为一个索引创建 5 个主分片, 并分别为其创建一个副本分片. 也就是说每个索引都由 5 个主分片成本, 而每个主分片都相应的有一个 copy。对于分布式搜索引擎来说, 分片及副本的分配将是高可用及快速搜索响应的设计核心.主分片与副本都能处理查询请求,它们的唯一区别在于只有主分片才能处理索引请求.副本对搜索性能非常重要,同时用户也可在任何时候添加或删除副本。额外的副本能给带来更大的容量, 更高的呑吐能力及更强的故障恢复能力。
 

分片设置

新增分片

#   新增索引的同时添加分片,不使用默认分片,分片的数量
#   一般以(节点数*1.5或3倍)来计算,比如有4个节点,分片数量一般是6个到12个,每个分片一般分配一个副本
PUT /test12/
{
   "settings" : {
      "number_of_shards" : 12,
      "number_of_replicas" : 1
   }
}

代码如下:

 PUT /test12/type/1
 {
      "settings" : {
      "number_of_shards" : 12,
      "number_of_replicas" : 1
   },

   "mappings": {
     "properties": {
       "name": {
         "type": "text"
       },
       "age": {
         "type": "text"
       },
       "times": {
         "type": "date"
       }
     }
   }
 }
 }

效果如下:

查看索引分片数

使用head查看

集群查看方法:

 curl -XGET -uwww -p http://192.168.12.13:9200/_cat/shards/test*?v

修改副本:

#  修改分片的副本数量
PUT /test12/_settings
{
   "number_of_replicas" : 2
}

es服务器选择

磁盘选择:

使用ssd固态硬盘

使用raid0 条带化raid会提高磁盘i/o

可以使用多块硬盘 把数据存储到其他磁盘上

不要使用远程挂在存储 这个会影响es的性能

内存选择:

当机器内存小于 64G 时,遵循通用的原则,50% 给 ES,50% 留给 lucene。
当机器内存大于 64G 时,遵循以下原则:
如果主要的使用场景是全文检索,那么建议给 ES Heap 分配 4~32G 的内存即可;其它内存留给操作系统,供 lucene 使用(segments cache),以提供更快的查询性能。
如果主要的使用场景是聚合或排序,并且大多数是 numerics,dates,geo_points 以及 not_analyzed 的字符类型,建议分配给 ES Heap 分配 4~32G 的内存即可,其它内存留给操作系统,供 lucene 使用,提供快速的基于文档的聚类、排序性能。
如果使用场景是聚合或排序,并且都是基于 analyzed 字符数据,这时需要更多的 heap size,建议机器上运行多 ES 实例,每个实例保持不超过 50% 的 ES heap 设置(但不超过 32 G,堆内存设置 32 G 以下时,JVM 使用对象指标压缩技巧节省空间),50% 以上留给 lucene。

角色分离:

为什么要使用角色分离了?

因为es   master主节点要担任管理和维护集群的作用,如果此时master节点在存储数据的话,master节点压力变大,容易导致节点挂掉

配置角色分离

候选主节点:

node.master=true
node.data=false

数据节点:

node.master=false
node.data=true

就相当于主节点值做管理和维护集群,数据节点值存储数据。

到这里es的学习单节点基本就已经结束了,如果需要学习es集群搭建的可以点下下面地址学习

elk+kafka日志分析系统搭建-CSDN博客

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐