Elasticsearch

概念

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参数还是很常用的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值