文章目录
概念
1.Cluster: 集群,由一或多个节点组成,有一个主节点是相对于集群内部来说的,外部看Elasticsearch集群是去中心化的.
2.Index: 索引,相当于关系型数据库中的表,可以存储任意结构的数据
3.Primary Shard: 索引的主分片,一个完整的索引分成多个primary shard,数量只能在索引创建时指定,之后不能更改
4.Replica Shard: 索引主分片的副本,可以设置多个,当某个节点某个primary shard损坏或丢失时可以从副本中恢复
5.Type : 每个索引中都必须有唯一的一个Type,是Index中的一个逻辑分类,Elasticsearch中的数据Document是存储在索引下的Type中的(类似于表中套表)在7.x版本之后,删除Type定义,每个index只有唯一固定命名为_doc的Type。
6.Document: 文档: Elasticsearch中的最小数据单元,一个就是一条数据,一般使用JSON数据结构表示,里面可定义多个field(数据字段)
7.MetaData: 元数据: 所有以下划线开头的属性都是元数据,有着特定的含义,类似于Java中的关键字
8.Inverted Index: 倒排索引: 对数据分析,抽取数据中的词条,以词条作为key,对应数据的存储位置作为value,实现索引的存储
kibana: dev_tools(图形化界面的查询)
Get /
这里的 / 表示http://localhost:9200/,不写 / 系统会自动加上,但建议写上
例如: Get /_cat
表示: http://localhost:9200/_cat
查看es健康状态
GET /_cat/health
结果包含标题头
GET /_cat/health?v
返回结果:
编号 时间戳 集群名称 健康状态 节点总数 数据节点数 总分片数 主分片数量 备份分片数量 正在初始化的分片 未分配的分片 正在等待执行的任务 挂起任务的等待时间 活动的分片的占有百分比
1681905156 11:52:36 docker-cluster green 1 1 3 3 0 0 0 0 - 100.0%
查看所有节点状态: 这里是单节点集群
GET /_cat/nodes?v
返回结果:
ES主机地址 堆占用率 内存占用率 CPU占用率 每分钟平均运行命令 每5分钟平均运行命令 每15分钟平均运行命令 ES节点权限 是否是主节点 ES节点名称
172.17.0.2 15 62 0 0.00 0.00 0.02 dilm * 5f33d858c8af
索引操作
1.1查看全部索引
GET /_cat/indices?v
返回结果:
健康状态 索引是否可用 索引名称 索引唯一键 主分片数量 副本分片数量 索引中文档总数(硬盘中) 索引中已删除文档数 索引总计占用空间 索引主分片占用空间
green open .kibana_task_manager_1 JetqKxj7TLat0XQ9hO3kng 1 0 2 0 6.6kb 6.6kb
green open .apm-agent-configuration BtrgnOzbTn6-5EqwGsSErA 1 0 0 0 283b 283b
green open .kibana_1 t5xOSgMWQS6gn2rm_QTv2A 1 0 8 0 36.9kb 36.9kb
1.2查看单个索引详情
GET /索引名称
GET /index_test
2.创建索引
index名称必须是小写的,且不能以下划线’_‘,’-‘,’+'开头
PUT /索引名
PUT /one_index # 默认创建一个主分片和一个副本分片
//创建索引时,指定主分片和每个主分片的副本分片数量
PUT /index_test_1
{
"settings":{
"number_of_shards" : 2, #主分片数
"number_of_replicas" : 0 #每个主分片的副本分片数量
}
}
3.修改索引
PUT /索引名/_settings
索引一旦创建,Primary Shard数量不可变化,可以改变Replica Shard数量
修改Replica Shard数量
PUT /index_test_2/_settings
{
"number_of_replicas" : 2
}
4.删除索引
DELETE /索引名1,索引名2,… 可以同时删除多个索引,多个索引名称使用逗号’,'分隔。
DELETE /index1,index2
分片操作
查看Elasticsearch中所有索引的分片信息。
GET /_cat/shards?v
返回值:
索引名称 分片编号(从0开始自然数递增) 主分片(p)或副本分片(r) 分片状态 分片中文档数 分片占用存储空间 分片所在ES服务器IP 分片所在ES服务器名称
three_index 1 p STARTED 0 0b 172.17.0.2 5f33d858c8af
three_index 1 r UNASSIGNED
three_index 1 r UNASSIGNED
three_index 0 p STARTED 0 230b 172.17.0.2 5f33d858c8af
three_index 0 r UNASSIGNED
three_index 0 r UNASSIGNED
文档操作
1.新增文档
注意: 向索引中添加字段时,建议字段个数一致.
PUT:
PUT:
PUT 索引名/_doc/唯一ID{字段名:字段值}
如果主键_id不存在,则新增数据;存在则覆盖旧数据。
例:
PUT /index_test/_doc/1
{
"name":"张三",
"address":"北京亦庄"
}
PUT 索引名/_create/唯一ID{字段名:字段值}
仅新增文档: 如果主键_id不存在,则新增数据;存在则抛出异常。
例:
PUT /index_test_1/_create/2
{
"name":"李四",
"address":"北京亦庄"
}
POST
POST:
POST 索引名/_doc/唯一ID]{字段名:字段值}
如果主键_id不存在,则新增数据;存在则覆盖旧数据。
例:
POST /index_test_1/_doc/3
{
"name":"王五",
"address":"北京亦庄"
}
可以自动生成主键,可以保证唯一
POST 索引名/_doc
例:
POST /index_test_1/_doc
{
"name":"王五",
"address":"北京亦庄"
}
仅新增
如果主键_id不存在,则新增数据;存在则抛出异常,且强制新增时,必须指定主键,如果主键未指定,则抛出异常。
例:
POST /index_test_1/_create/4
{
"name":"赵六",
"address":"北京亦庄"
}
2.查询文档
2.1根据主键查询唯一文档
GET /索引名/_doc/唯一ID
GET /index_test_1/_doc/1
2.2根据主键批量查询文档
GET /index_test_1/_mget
{
"docs":[{"_id":1},{"_id":2}]
}
2.3查询全部
GET /索引名称/_search
3.修改文档
3.1全量替换
将该id对应文档直接替换为修改的文档
全量替换的过程中,Elasticsearch不会真的修改Document中的数据,而是标记Elasticsearch中原有的Document为deleted状态,再创建一个新的Document来存储数据,Elasticsearch会在后台周期整理deleted状态的文档并物理删除。
PUT|POST /index_test_1/_doc/1
{
"name":"张三",
"address":"北京亦庄"
}
3.2部分更新文档
只更新某Document中的部分字段。这种更新方式也是标记原有数据为deleted状态,创建一个新的Document数据,将新的字段和未更新的原有字段组成这个新的Document,并创建。
POST /索引名/_update/唯一ID
例:
POST /index_test_1/_update/1
{
"doc":{
"address":"赛帝工业园",
"age":22
}
}
3.删除文档
Elasticsearch中执行删除操作时,Elasticsearch先标记Document为deleted状态,而不是直接物理删除,过一会去磁盘删除
DELETE /索引名/_doc/唯一ID
DELETE /index_test/_doc/1
bulk批量增删改
1.批量仅新增数据,存在id,则报错
POST /_bulk
{ "create" : { "_index" : "索引名" , "_id" : "指定的id1" } }
{ "属性1" : "属性值1" }
{ "create" : { "_index" : "索引名" , "_id" : "指定的id2" } }
{ "属性2" : "属性值2" }
......
......
2.批量新增或全量替换
POST /_bulk
{ "index" : { "_index" : "索引名" , "_id" : "指定的id1" } }
{ "属性1" : "属性值1" }
{ "index" : { "_index" : "索引名" , "_id" : "指定的id2" } }
{ "属性2" : "属性值2" }
3.批量更新
修改部分数据
POST /_bulk
{ "update" : { "_index" : "索引名" , "_id" : "指定的id1" } }
{ "属性1" : "属性值1" }
{ "update" : { "_index" : "索引名" , "_id" : "指定的id2" } }
{ "属性2" : "属性值2" }
4.批量删除
POST /_bulk
{ "delete" : { "_index" : "索引名" , "_id" : "指定的id1" } }
{ "delete" : { "_index" : "索引名" , "_id" : "指定的id2" } }
5.批量复合操作
POST /_bulk
{ "create" : { "_index" : "index_test_1" , "_id" : "1" } }
{ "name" : "测试create" }
{ "index" : { "_index" : "index_test_1" , "_id" : "1" } }
{ "name" : "批量新增name1" , "address" : "批量新增address1" }
{ "update" : { "_index" : "index_test_1" , "_id" : "2" } }
{ "doc" : { "address" : "批量更新address3" } }
{ "delete" : { "_index" : "index_test_1" , "_id" : "1" } }
1.bulk语法中要求一个完整的json串不能有换行。不同的json串必须使用换行分隔。多个操作中,如果有错误情况,不会影响到其他的操作,只会在批量操作返回结果中标记失败。
2.生产环境中,bulk api常用。都是使用java代码实现循环操作。一般一次bulk请求,执行一种操作。如:批量新增10000条数据等
分词器
Elasticsearch常见的内置的分词器
1.standard: 默认分词器。标准分词器
2.simple: 简单分词器
3.whitespace: 空白符分词器
4.language: 语言分词器
中文分词器 - IK
IK分词器提供了两种analyzer,分别是ik_max_word和ik_smart
ik_max_word: 会将文本做最细粒度的拆分
ik_smart: 会做粗粒度的拆分.
GET _analyze
{
"text" : "中华人民共和国国歌",
"analyzer": "ik_max_word"
}
GET _analyze
{
"text" : "中华人民共和国国歌",
"analyzer": "ik_smart"
}
Elasticsearch中的Mapping
决定了一个index中的field使用什么数据格式存储,使用什么分词器解析,是否有子字段等。
如果没有Mapping,那么index中的field数据格式等信息就只能使用默认规则,
如:整数都是long,浮点数都是float,文本都是text且一定是standard分词器等。如果希望使用IK中文分词,就必须配置自定义Mapping。
1.Elasticsearch中的数据类型
文本(字符串): text: "hello world"
整数: byte、short、integer、long(默认):123
浮点型: float(默认):123.123、double
布尔类型: boolean:true or false
日期类型: date: "2018-01-01" 或 "2018-01-01T00:00:00.000"
数组类型: array {a:[]} : []
对象类型: object {a:{}} : {}
不分词的字符串(关键字): keyword
2.查看索引中的Mapping
GET /index_test_1/_mapping
3.自定义映射
可以通过命令,在创建index的时候来定制mapping映射,也就是指定字段的类型和字段数据使用的分词器,手工定制mapping时,只能新增mapping设置,不能对已有的mapping进行修改。
3.1创建索引时定义Mapping
PUT /索引名称
{
"mappings":{
"properties":{
"字段名":{
"type":类型,
["analyzer":字段的分词器(默认standard),]
["index":是否创建索引树(默认true,创建索引),]
["fields":{
"子字段名称":{
"type":类型,
"ignore_above":长度限制
}
}]
}
}
}
}
例:
put /index_mapping_1
{
"mappings":{
"properties":{
"id":{
"type":"long",
"index":false
},
"name":{
"type":"text",
"index":true,
"analyzer":"ik_max_word"
},
"remark":{
"type":"text",
"analyzer":"ik_smart",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 16
}
}
},
"gender":{
"type":"keyword"
}
}
}
}
3.2: 为已有的索引增加新的字段Mapping
PUT /索引名/_mapping
{
"properties":{
"新字段名":{
"type":类型,
["analyer":字段的分词器,]
["index":是否创建索引树(默认true,创建索引),]
["fields":{
"子字段名":{
"type":类型,
"ignore_above":长度
}
}]
}
}
}
例:
PUT /index_mapping_1/_mapping
{
"properties":{
"address":{
"type":"text",
"analyzer":"ik_max_word"
}
}
}
其他字段的查询操作
query string search
语法
GET /index_name/_search?parameter_name=parameter_value&...
1.搜索全部
禁止全数据搜索
魔鬼搜索
GET /_search
2.执行指定毫秒数,搜索出多少数据,直接返回
GET /_search?timeout=10ms
3.multi index 搜索: 从多个index中搜索数据
无条件搜索,在搜索应用中称为“魔鬼搜索”,代表的是,搜索引擎会执行全数据检索,效率极低,且对资源有非常高的压力。
GET /_search
GET /_all/_search
3.1在指定的若干索引中搜索全部数据
GET /index_test_1,test_search/_search
3.2基于前缀或后缀的搜索
GET /index_*/_search
GET /test_*/_search
4.条件搜索
只能但条件查询
4.1在test_search索引的所有字段的值中(拆完词后)搜索包含sales的数据
GET /test_search/_search?q=sales
4.2在指定字段(dname)的值中(拆完词后)搜索包含sales的数据
GET /test_search/_search?q=dname:sales
4.2在指定字段(dname)的值中(拆完词后)搜索不包含sales的数据
GET /test_search/_search?q=-dname:sales
5.分页搜索
默认情况下,Elasticsearch搜索返回结果是10条数据。从第0条开始查询,返回前10条数据。
从第0条开始查询,返回前2条数据
GET /test_search/_search?from=0&size=2
6.搜索结果排序
asc(升序,默认) | desc(降序)
text类型字段不可排序,因为倒排索引无法排序。
GET /索引名/_search?sort=字段名:排序规则
GET /test_search/_search?sort=eage:asc
GET /test_search/_search?sort=eage:desc
DSL search
DSL - Domain Specified Language , 特殊领域的语言。就是请求参数使用JSON格式字符串传递的方式。
GET /索引名/_search
{
"command":{ "parameter_name" : "parameter_value"}
}
1.搜索所有
GET /test_search/_search
{
"query" : { "match_all" : {} }
}
2.全文匹配搜索
全文检索。要求查询条件拆分后的任意词条与具体数据匹配就算搜索结果。
GET /test_search/_search
{
"query": {
"match": {
"dname": "sales department"
}
}
}
3.短语搜索
要求查询条件必须和具体数据完全匹配才算搜索结果
GET /test_search/_search
{
"query": {
"match_phrase": {
"dname": "sales department"
}
}
}
4.范围搜索
range:范围比较搜索。字段具体数据在范围内即可。
gt:大于,gte:大于等于
lt:小于l,te:小于等于
GET /test_search/_search
{
"query" : {
"range" : {
"eage" : {
"gt" : 20,
"lte" : 30
}
}
}
}
5.多条件符合搜索
GET /索引名/_search
{
"query": {
"bool": {
"must": [ #数组中的多个条件必须同时满足
{
"range": {
"字段名": {
"lt": 条件
}
}
}
],
"must_not":[ #数组中的多个条件必须都不满足
{
"match": {
"字段名": "条件"
}
},
{
"range": {
"字段名": {
"gte": "搜索条件"
}
}
}
],
"should": [# 数组中的多个条件有任意一个满足即可。
{
"match": {
"字段名": "条件"
}
},
{
"range": {
"字段名": {
"gte": "搜索条件"
}
}
}
]
}
}
}
6.排序
如果使用text类型的字段作为排序依据,会有异常
默认情况下不允许使用text类型的字段做排序
GET 索引名/类型名/_search
{
"query" : { "match_all" : {} },
"sort": [
{
"gender": {
"order": "asc"
}
},
{
"eage": {
"order": "desc"
}
}
]
}
7.分页
GET 索引名称/_search
{
"query":{
"match_all":{}
},
"from": 0,
"size": 2
}
8.高亮
highlight高亮处理:在搜索中,经常需要对搜索关键字做高亮显示,这个时候就可以使用highlight语法。
GET /索引名/_search
{
"query": {
"match": {
"字段名": "条件"
}
},
"highlight": {
"fields": {
"要高亮显示的字段名": {
"fragment_size": 5, #每个分段长度,默认20
"number_of_fragments": 1 #返回多少个分段,默认3
}
},
"pre_tags": ["前缀"],
"post_tags": ["后缀"]
}
}
例:
GET /test_search/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"dname": "Development department"
}
},
{
"match": {
"gender": "男性"
}
}
]
}
},
"highlight": {
"fields": {
"dname": {
"fragment_size": 20,
"number_of_fragments": 1
},
"gender": {
"fragment_size": 20,
"number_of_fragments": 1
}
},
"pre_tags":["<span style='color:red'>"],
"post_tags":["</span>"]
},
"from": 2,
"size": 2
}
参数名 | 参数含义 |
---|---|
fragment_size | 代表字段数据如果过长,则分段,每个片段数据长度为多少。长度不是字符数量,是Elasticsearch内部的数据长度计算方式。默认不对字段做分段。 |
number_of_fragments | 代表搜索返回的高亮片段数量,默认情况下会将拆分后的所有片段都返回。 |
pre_tags | 高亮前缀。 |
post_tags | 高亮后缀。 |
很多搜索结果显示页面中都不会显示完整的数据,这样在数据过长的时候会导致页面效果不佳,都会按照某一个固定长度来显示搜索结果,所以fragment_size和number_of_fragments参数还是很常用的。