ElasticSearch
引言: 初学者可以把ES当作一个数据库!!(可以建立索引(数据库表, 文档(库中的数据!))
ElasticSearch-head可以当做数据展示工具!我们查询命令使用Kibana去写
ES核心概念
- 索引
- 字段类型(mapping)
- 文档 (documents)
- 分片(倒排索引!)
概述
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 | # 最少切分 |
运行结果
ik_max_word为最细粒度化分! 穷尽词库的可能!!
我们输入”超级喜欢狂神说Java”
发现问题: 狂神说被拆开了!!!
这种自己需要的词,需要自己加到我们的分词器的字典中!
ik分词器增加自己的配置!
重启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
等等….
指定字段类型(创建索引规则)
查看规则
1 | GET test2 |
查看默认的信息
如果自己的文档字段没有指定,那么ES就会给我们默认配置字段类型!
扩展:通过命令ES索引情况! 通过get _cat可以获得当前ES的很多信息
1 | get _cat/ |
关于索引的操作
创建一个索引
1 | PUT/索引名/类型名/文档id |
完成了自动增加索引!! 数据也成功的添加了.
修改 提交
修改和提交还是使用PUT即可! 然后覆盖!
曾经的方法:
现在的方法:
删除索引
通过DELETE命令实现删除、根据你的请求判断是删除索引还是删除文档记录!
使用Restful是ES支持的
关于文档的基本操作(重点)
基本操作
添加数据
1 | PUT /kuangshen/user/1 |
查询数据
1 | # 查询单个数据 |
修改数据
1 |
|
**PUT如果不穿值得话,就会被覆盖 **
修改数据(推荐方式)
1 | POST /kuangshen/user/3/_update |
简单的搜索
1 | get kuangshen/user/_search?q=name:狂神说 |
复杂操作搜索
select(排序、分页、高亮、模糊查询、精准查询!)
结果过滤
输出结果不想要全部属性,可以对结果进行过滤
我们之后使用Java操作ES时,所有的方法和对象就是这里面的Key。。
排序
1 | GET kuangshen/user/_search |
分页查询
1 | GET kuangshen/user/_search |
数据索引下标还是从0开始的,和学的所有数据结构是一样的
布尔值查询
must(and), 所有条件都要符合
should(or),条件满足一个就符合
must_no, 不符合条件的
1 | GET kuangshen/user/_search |
过滤器
1 | GET kuangshen/user/_search |
- gt >
- gte >=
- lt <
- lte <=
匹配多个条件
1 | GET kuangshen/user/_search |
多个条件使用空格隔开
只要满足其中一个结果既可以被查出
这个时候可以通过分值基本的判断
精确查询
term查询是直接通过倒排索引指定的词条进程精确的查找的!
关于分词:
term,直接查询精确的
match,会使用分词器解析!(先分析文档,然后再通过分析的文档进行查询!)
两个类型 text 和 keyword
text可以被分词器解析
keyword类型不会被分词器解析
多个值匹配精确查询
高亮查询
[
这些其实MYSQL 也可以做,只是Mysql效率比较低
- 匹配
- 按照条件匹配
- 精确匹配
- 区间范围匹配
- 匹配字段过滤
- 多条件查询
- 高亮查询