loading...
ElasticSearch
Published in:2022-01-31 | category: ElasticSearch
Words: 2.1k | Reading time: 8min | reading:

ElasticSearch

引言: 初学者可以把ES当作一个数据库!!(可以建立索引(数据库表, 文档(库中的数据!))

ElasticSearch-head可以当做数据展示工具!我们查询命令使用Kibana去写

ES核心概念

  1. 索引
  2. 字段类型(mapping)
  3. 文档 (documents)
  4. 分片(倒排索引!)

概述

elasticsearch是面向文档 关系行数据库 和 elasticsearch 客观的对比!! 一切都是JSON!!

Relational DB Elasticsearch
数据库(database) 索引(indexs)
表(tables) types (慢慢会被弃用)
行(rows) documents 文档
字段(columns) fields

elasticsearch(集群)中包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档(行),每个文档下又包含多个字段(列).

物理设计:

elastic search在后台把每个索引划分成多个分片,每个分片可以在集群中的不同服务器间迁移.

逻辑设计:

一个索引类型中,包含多个文档. 当我们索引一篇文档时,可以通过这样的一个顺序找到它 : 索引 -> 类型 -> 文档ID,通过这个组合我们就能索引到某个具体的文档. 注意: ID不必是整数,实际上它是一个字符串.

文档

之前说ES是面向文档的,那么久意味着索引和搜索数据的最小单位是文档,ES中,文档有几个重要属性:

  • 自我包含,一篇文档同时包含字段和对应的值,也就是同时包含key : value !
  • 可以是层次型的,一个文档中包含子文档, 复杂的逻辑实体就是这么来的
  • 灵活的结构, 文档不依赖预先定义的模式.我们知道关系型数据库中,要提前定义字段才能使用,在ES中,对于字段是非常灵活的,有时候,可以忽略该字段或者动态的添加一个新的字段.

类型

类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器.类型中对于字段的定义称为映射.

索引(就是数据库)

索引是映射类型的容器,ES中的索引是一个非常大的文档集合.索引存储了映射类型的字段和其他设置.然后他们被存储到了多个分片上了.

IK分词器插件

什么是IK分词器?

分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词.但是默认分词器有些点是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题.

IK提供了两个分词算法: ik_smart 和 ik_max_word 其中 ik_smart 为最少切分, ik_max_word为最细粒度划分!!

使用kibana测试

1
2
3
4
5
6
7
8
9
10
11
12
13
# 最少切分
GET _analyze
{
"analyzer": "ik_smart",
"text": "中国共产党"
}

# 最细粒度划分
GET _analyze
{
"analyzer": "ik_max_word",
"text": "中国共产党"
}

运行结果

hn7FMV.png

ik_max_word为最细粒度化分! 穷尽词库的可能!!

我们输入”超级喜欢狂神说Java”

发现问题: 狂神说被拆开了!!!

这种自己需要的词,需要自己加到我们的分词器的字典中!

ik分词器增加自己的配置!

hnHElt.png

重启ES

Restful命令

基本Rest命令说明:

method url地址 描述
PUT localhost:9200/索引名称/类型名称/文档id 创建文档(指定文档id)
POST localhost:9200/索引名称/类型名称 创建文档(随机文档id)
POST localhost:9200/索引名称/类型名称/文档id/_update 修改文档
DELETE localhost:9200/索引名称/类型名称/文档id 删除文档
GET localhost:9200/索引名称/类型名称/文档id 查询文档通过文档id
POST localhost:9200/索引名称/类型名称/_search 查询所有数据

基础测试

数据类型

ES中的数据类型有以下几种:

  • 字符串类型

    text、keyword

  • 数值类型

    long、interger、short、byte、double、float、half float、scaled float

  • 日期类型

    date

  • 布尔值类型

    boolean

  • 二进制类型

    binary

  • 等等….

指定字段类型(创建索引规则)

huSyPf.png

查看规则

1
GET test2

查看默认的信息

hu9Pkq.png

如果自己的文档字段没有指定,那么ES就会给我们默认配置字段类型!

扩展:通过命令ES索引情况! 通过get _cat可以获得当前ES的很多信息

1
get _cat/

关于索引的操作

创建一个索引

1
2
3
4
PUT/索引名/类型名/文档id
{
请求体
}

hnvfq1.png

完成了自动增加索引!! 数据也成功的添加了.

hnxeoV.png

修改 提交

修改和提交还是使用PUT即可! 然后覆盖!

曾经的方法:

huilhq.png

现在的方法:

huifUA.png

删除索引

通过DELETE命令实现删除、根据你的请求判断是删除索引还是删除文档记录!

使用Restful是ES支持的

huiz80.png

关于文档的基本操作(重点)

基本操作

添加数据
1
2
3
4
5
6
7
PUT /kuangshen/user/1
{
"name": "狂神说",
"age": 23,
"desc": "一顿操作猛如虎,一看工资2500",
"tags": ["技术宅","温暖","直男"]
}

hMAeBT.png

查询数据
1
2
3
4
5
# 查询单个数据 
GET /kuangshen/user/1

# 查询全部数据
GET /kuangshen/user/_search
修改数据
1
2
3
4
5
6
7
8
9

PUT /kuangshen/user/3
{
"name": "李四233",
"age": 30,
"desc": "不知道如何形容",
"tags": ["靓女","旅游","唱歌"]
}

hMVO39.png

**PUT如果不穿值得话,就会被覆盖 **

修改数据(推荐方式)
1
2
3
4
5
6
POST /kuangshen/user/3/_update
{
"doc": {
"name": "狂神说Java"
}
}

image-20210827115148125

简单的搜索
1
get kuangshen/user/_search?q=name:狂神说

复杂操作搜索

select(排序、分页、高亮、模糊查询、精准查询!)

hMrhFK.png

hMs2cQ.png

结果过滤

输出结果不想要全部属性,可以对结果进行过滤

image-20210827141703336

我们之后使用Java操作ES时,所有的方法和对象就是这里面的Key。。

排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET kuangshen/user/_search
{
"query": {
"match": {
"name": "狂神"
}
}
, "sort": [
{
"age": {
"order": "asc"
}
}
]
}
分页查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
GET kuangshen/user/_search
{
"query": {
"match": {
"name": "狂神"
}
}
, "sort": [
{
"age": {
"order": "asc"
}
}
],
"form": 0, //从第几个数据开始
"size": 1 //返回多少条数据(单页面的数据)
}


数据索引下标还是从0开始的,和学的所有数据结构是一样的

布尔值查询

must(and), 所有条件都要符合

should(or),条件满足一个就符合

must_no, 不符合条件的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GET kuangshen/user/_search
{
"query": {
"bool": {
// 多条件查询
"must": [
{
"match": {
"name": "狂神说"
}
},
{
"match": {
"age": 23
}
}
]
}
}
}
过滤器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
GET kuangshen/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "狂神说"
}
}
],
"filter": {
"range": {
"age": {
"lt": 25
}
}
}
}
}
}
  1. gt >
  2. gte >=
  3. lt <
  4. lte <=
匹配多个条件
1
2
3
4
5
6
7
8
GET kuangshen/user/_search
{
"query": {
"match": {
"tags": "男 技术"
}
}
}

多个条件使用空格隔开

只要满足其中一个结果既可以被查出

这个时候可以通过分值基本的判断

精确查询

term查询是直接通过倒排索引指定的词条进程精确的查找的!

关于分词:

term,直接查询精确的

match,会使用分词器解析!(先分析文档,然后再通过分析的文档进行查询!)

两个类型 text 和 keyword

text可以被分词器解析

keyword类型不会被分词器解析

多个值匹配精确查询

hMXy5V.png

高亮查询

[hMjMGT.png

这些其实MYSQL 也可以做,只是Mysql效率比较低

  • 匹配
  • 按照条件匹配
  • 精确匹配
  • 区间范围匹配
  • 匹配字段过滤
  • 多条件查询
  • 高亮查询
Prev:
ElasticSearch集成Springboot
Next:
catalog
catalog