一、核心概念
-
索引
存储数据得地方,可理解为关系数据库中得数据库概念
-
映射
mapping定义了每个字段得类型,字段所使用得分词器等。相当于关系型数据库中得表结构
-
文档
ES中得最小数据单元,常以 json 格式显示。一个文档相当于关系数据库中得一行数据
-
倒排索引
一个倒排索引由文档中所有不重复得列表构成,对于其中每个词,对应一个包含它得文档id列表
数据如下表:
文档id 数据 1 北京 2 上海 3 广州 4 上海 5 北京 倒排索引:
数据 文档id 北京 1,5 上海 2,4 广州 3
二、安装
1、ES 安装
2、ES-head插件安装
3、Kibana 安装
4、ik 中文分词器安装
-
下载地址
https://github.com/medcl/elasticsearch-analysis-ik/releases
选择版本与 ES 一致的 ik 分词器
-
安装
在ES安装目录/plugins 下创建文件夹 ik ,上传安装包解压
mkdir ik #创建ik文件夹
unzip elasticsearch-analysis-ik-7.4.0.zip #解压压缩包,没有unzip命令的自行百度
-
上传自定义的词到字典中
在$ES/plugins/config目录下创建 dic 文件,输入自定义字典
然后 vim IKAnalyzer.config.xml (打开此文件),下图红框位置输入自定义字典名称。
-
分类
-
ik
-
三、使用 kibana,ES-head操作 ES
1、操作kibinna
打开 Kibana 之前需要打开 ES,ES打开方式,进入$ES/bin 目录,输入 ./elasticsearch 命令,以下就表示ES 打开成功,此窗口不能关闭,否则ES程序会被关闭,如需操作,打开一个窗口即可
进入$kibana/bin 目录,输入 ./kibana 命令,窗口不关闭保留
进入 web 页面,选择 扳手 图标进入 kibana
2、操作 ES-head 插件
打开谷歌浏览器,选择扩展程序插件
输入本地 ES 地址(端口常为 9200), head 插件常用于索引概览查询,以及数据浏览,至于数据查询常在 kibana 上完成
四、Rest 命令
1、字段类型
字符串类型
-
keyword:不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。
-
text:会分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储
数值类型
-
long、Integer、short、byte、double、float、half float、scaled float
日期类型
-
date
布尔类型
-
boolean
二进制类型
-
binary
2、创建索引
类似于建库(建立索引和字段对应类型),也可看做规则的建立
PUT test
{
"mappings": {
"properties": {
"name":{
"type": "text",
"analyzer": "ik_smart"
},
"age":{
"type": "integer"
},
"address":{
"type":"keyword"
}
}
}
}
3、获取索引信息
GET test
4、删除索引
DELETE test
5、插入数据
插入数据可指定文档id,也可不指定,自动生成文档 id。若不指定 :PUT test/_doc {}
PUT test/_doc/1
{
"name":"刘青屿",
"age":24,
"address":"中国北京*"
}
6、更新数据
覆盖数据
如若更新文档某一字段的数据,若不想其他字段数据丢失,则需将其他字段的数据保留
PUT test/_doc/1
{
"name":"liuqingyu",
"age":24,
"address":"中国北京*"
}
更新数据
若只需要更新某一字段的数据,对其操作即可,建议使用此种方法
POST test/_doc/1/_update
{
"doc":{
"name":"刘青屿"
}
}
7、查询
数据样例:
7.1、查询匹配
-
match:全文查询时会分析查询条件,先将查询条件进行分词,然后查询,求并集
-
_source:过滤字段
-
sort:排序
-
from,size 分页
GET test/_search
{
"query": {
"match": {
"name": "宝贝"
}
},
"_source":["name","age"],
"sort": [
{
"age": {
"order": "desc"
}
}
],
"from": 0,
"size": 2
}
此处思考查询为什么数据样例中的 “大宝贝”数据为什么未被检索出来,按理说 match 对查询词条 “宝贝” 先进行分词查询,还会是 “宝贝”,因为在创建 mapping 时指定了字段类型的分词器是 ik 分词器,数据 “大宝贝” 应该会被分成 “大”,“宝贝”,此处查询未被查询出来分析得出 “大宝贝” 未被分词。具体原因是在前期将 “大宝贝” 配置到自己的字典中了。
7.2、多条件查询(bool)
-
must:相当于 and
-
should:相当于 or
-
must not:相当于 not (..... and ......)
-
filter:过滤
GET test/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "宝贝"
}
}
],
"filter": {
"range": {
"age": {
"gte": 22,
"lte": 25
}
}
}
}
}
}
7.3、匹配数组
-
貌似不能与其它字段一起使用
-
可以多关键字查(空格隔开)— 匹配字段也是符合的
-
match
会使用分词器解析(先分析文档,然后进行查询) -
搜词
// 匹配数组 貌似不能与其它字段一起使用
// 可以多关键字查(空格隔开)
// match 会使用分词器解析(先分析文档,然后进行查询)
GET test/_search
{
"query": {
"match": {
"shuzu": "热爱 追" //会被分成 热 爱 追 查询
}
}
}
7.4、精确匹配
-
term
直接通过 倒排索引 指定词条查询 -
适合查询 number、date、keyword ,不适合text
GET test/_search
{
"query": {
"term": {
"address": {
"value": "大" //查询条件应该是完成词条 "大千世界"
}
}
}
}
match 和 term 的区别:
https://www.jianshu.com/p/d5583dff4157
7.5 高亮查询
GET test/_search
{
"query": {
"match": {
"name":"宝贝"
}
}
,
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}
五、集群
5.1、相关观念
-
集群:多个人做一样的事,分担请求
-
分布式:多个人做不一样的事,分担存储和计算
-
索引:可理解为关系数据库中的database概念
-
分片(shard):索引呗拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引可以拆分到不同的节点上
-
副本分片:每个主分片有一个或多个副本,数据和主分片一样
5.2、搭建集群
5.3、分片配置
-
在创建索引时,如果不指定分片配置,则默认主分片是1,副本分片也为1
-
分片与自平衡:当节点挂掉后,挂掉的节点分片会自平衡到其他节点中
-
分片数量一旦确定好,不能修改
-
索引分片推荐配置方案:
-
每个分片推荐大小10-30G
-
分片数量推荐=节点数量*1~3倍
-
例如有1000GB数据(包含副本),建议分配,1000/25=40个分片,40/2=20个节点
-
5.4、路由原理
-
文档存入对应的分片,ES计算分片编号的过程,称为路由。
-
有路由算法可知文档存在哪个分片中去哪查询 shard_index=hash(id)%主分片数量
5.5、脑裂