ElasticSearch语法

ElasticSearch

基本语法

索引操作

所有索引
GET _cat/indices?v
  • 返回结果

表头含义
health当前服务器健康状态:green(集群完整) yellow(单点正常、集群不完整) red(单点不正常)
status索引打开、关闭状态
index索引名称
uuid索引唯一编号
pri主分片数量
rep副本数量
docs.count可用文档数量
docs.deleted文档删除状态(逻辑删除)
store.size主分片和副本占用空间大小
pri.store.siz主分片占用空间大小
创建索引
PUT /color(索引名称)
  • 返回结果

{
  "acknowledged" : true, // 操作成功
  "shards_acknowledged" : true, // 分片操作成功
  "index" : "color" // 索引名称
}

注意:7.0版本之前创建索引主分片数默认5片,7.0之后默认1片,相同名称的索引只能创建一次。

查询索引
GET /color(索引名称)

返回结果

{
  "color" : { // 索引名称
    "aliases" : { }, // 别名
    "mappings" : { },   // 映射
    "settings" : {  
      "index" : { // 索引设置
        "creation_date" : "1715220261652", // 创建时间
        "number_of_shards" : "1", // 主分片数
        "number_of_replicas" : "1", // 副本数
        "uuid" : "ZFHFeslwSiuFp7GF_PweWw", // 唯一标识
        "version" : {
          "created" : "7080099" // 版本
        },
        "provided_name" : "color" // 索引名称
      }
    }
  }
}
删除索引
DELETE /color(索引名称)

文档操作

创建文档

创建文档时如果索引不存在的话会先创建索引,再创建文档

  • 自动生成ID

POST /shopping(索引名称)/_doc
{
  "title": "小米手机",
  "category": "小米",
  "images": "http://www.gulixueyuan.com/xm.jpg",
  "price": 3999
}
  • 指定唯一ID

POST /shopping(索引名称)/_doc/1(指定ID)
{
  "title": "华为手机",
  "category": "华为",
  "images": "http://www.gulixueyuan.com/xm.jpg",
  "price": 4999
}

如果增加数据时指定了唯一ID,请求方式也可以为 PUT

  • 返回结果

{
  "_index" : "shopping",
  "_type" : "_doc", // 类型-文档
  "_id" : "m9UmW48BLvwB6AtB3H4u", // 文档ID
  "_version" : 1, // 文档版本
  "result" : "created",
  "_shards" : {
    "total" : 2, // 分片总数
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0, // 序列号,用于并发控制
  "_primary_term" : 1 // 主要项,用于并发控制
}
所有文档
GET /shopping(索引名称)/_search
{
  "query": {
    "match_all": {}
  }
}
  • 返回结果

{
  "took" : 935, // 费时,毫秒
  "timed_out" : false, // 是否超时
  "_shards" : { // 查询操作涉及到的分片信息
    "total" : 1,  // 总数
    "successful" : 1, // 成功
    "skipped" : 0, // 跳过
    "failed" : 0 // 失败
  },
  "hits" : { // 命中的文档信息
    "total" : {
      "value" : 3, // 命中的文档总数
      "relation" : "eq"
    },
    "max_score" : 1.0, // 命中文档的最高得分
    "hits" : [] // 具体命中的文档信息
  }
}

查询文档
GET /shopping(索引名称)/_doc/1(文档ID)
  • 返回结果

{
  "_index" : "shopping",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 1,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {} // 文档内容
}
修改文档

和创建文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的文档内容覆盖,修改后,文档版本加一。

当然,也可以只修改文档中的某些字段的内容

POST /shopping(索引名称)/_update/1(文档ID)
{
  "doc": {
    "price": 3000.00,
    "title": "苹果"
  }
}
删除文档
DELETE /shopping(索引名称)/_doc/1(文档ID)

在 Elasticsearch 中,删除文档是逻辑删除,只是不再参与搜索。Elasticsearch 会周期性地执行 "段合并",这个过程会将逻辑删除的文档物理删除。

条件删除文档
POST /shopping(索引名称)/_delete_by_query
{
  "query": {
    "match": {
      "price": 4000.00
    }
  }
}

映射操作

映射属性

Elasticsearch中的映射类似于关系型数据库中的表结构,映射主要就是约束索引中的字段的,比如字段的数据类型、是否索引、是否分词等等。

Elasticsearch中可以添加新字段,但不能为已有字段修改,也不能删除映射

  • type:数据类型

    • String(文本类型)

      • text:可以分词

      • keyword:不可分词,匹配完整的字段

    • Numerical(数值类型)

      • 基本数据类型:long、integer、short、byte、double、float、half_float

        • half_float半精度浮点数使用 16 位(2 字节)来存储一个浮点数,相比于单精度浮点数(float 32 位)和双精度浮点数(double 64 位)更加节省空间。然而,由于其范围和精度较小,不适用于需要高精度计算或者需要表示较大或较小数值的场景。

        • 例如在一些嵌入式系统或者物联网设备中,传感器通常会产生浮点数类型的数据,例如温度、湿度、压力等。对于需要节省存储空间的场景,可以使用半精度浮点数来存储这些传感器数据。

        • 例如在地理信息系统(GIS)中,经度和纬度等地理位置数据通常使用浮点数来表示,对于一些移动应用或者需要大量存储地理位置数据的场景,可以使用半精度浮点数来存储这些数据。

      • 高精度浮点类型:scaled_float

        • 带有缩放因子的浮点数,用于存储具有较高精度要求的浮点数。它存储两个值:一个整数和一个缩放因子,然后将整数除以缩放因子。

        • 例如,如果有一个精度要求为两位小数的浮点数,可以将其乘以 100 并存储为整数,然后将缩放因子设置为 100,这样就可以保留两位小数了。

    • Date:日期类型

    • Array:数组类型

      • 数组类型允许你在一个字段中存储一个有序的、由同一类型的值组成的集合。

      • 在 Elasticsearch 中,数组可以包含基本数据类型(例如整数、浮点数、字符串等)、复杂数据类型(例如对象类型)、甚至是嵌套的数组。

    • Object:对象

      • 对象类型允许你在一个字段中存储一个包含多个子字段(或者属性)的复杂结构。

      • 在 Elasticsearch 中,对象可以嵌套在其他对象中,从而构建出更加复杂的数据结构。

  • index:是否索引,默认为true,设置为false的话,字段就不会被索引,也就不能被搜索。

  • store:是否将数据独立存储,默认为false

在 Elasticsearch 中,文档的原始数据通常会存储在 _source 字段中,默认情况下,其他字段的值是从 _source 字段中提取出来的,而不会独立存储。这 样做可以节省存储空间,并且允许 Elasticsearch 在需要时动态解析文档的字段。

但是,有时候你可能希望某个字段的值能够被独立存储,而不是每次都需要从 _source 字段中解析。这种情况下,你可以通过设置字段的 store 属性为 true 来实现。这样设置后,该字段的值会被独立存储,而不是每次都从 _source 中解析。

使用独立存储字段的优点是可以提高获取字段值的速度,因为不需要每次都去解析 _source 字段。但是,独立存储字段会占用更多的存储空间,因此在设 置时需要根据实际业务需求进行权衡。

  • analyzer:分词器,ik 分词器(ik_max_word)是常用的分词器

创建映射
  • 为索引单独创建映射

PUT /student(索引名称)/_mapping
{
  "properties": {
    "name": {
      "type": "text",
      "index": true
    },
    "sex": {
      "type": "text",
      "index": false
    },
    "age": {
      "type": "integer",
      "index": false
    }
  }
}
  • 索引映射一起创建

PUT /student1(索引名称)
{
  "settings": {},
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "index": true
      },
      "sex": {
        "type": "text",
        "index": false
      },
      "age": {
        "type": "integer",
        "index": false
      }
    }
  }
}
查看映射
GET /student(索引名称)/_mapping

高级查询

所有的查询只能对index=true的字段生效

匹配查询

match 匹配类型查询,会把查询条件进行分词,然后再进行查询,多个词条之间是 or 的关系

GET /student(索引名称)/_search
{
  "query": {
    "match": {
      "name": "zhangsan,lisi"
    }
  }
}
字段匹配查询

multi_match 与 match 类似,只是它可以在多个字段中查询

GET /student(索引名称)/_search
{
  "query": {
    "multi_match": {
      "query": "zhangsan",
      "fields": ["name", "nickname"]
    }
  }
}
关键字精准查询

term 查询,精确的关键词匹配查询,不对查询条件进行分词,不能拼接多个词条

GET /student(索引名称)/_search
{
  "query": {
    "term": {
      "name": {
        "value": "zhangsan"
      }
    }
  }
}
多关键字精确查询

terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in 操作

GET /student(索引名称)/_search
{
  "query": {
    "terms": {
      "name": [
        "zhangsan",
        "lisi"
      ]
    }
  }
}
指定查询字段

默认情况下,Elasticsearch 在搜索的结果中,会把文档中保存在_source 的所有字段都返回。

如果只想获取其中的部分字段,可以添加 _source 的过滤。

GET /student(索引名称)/_search
{
  "_source": ["name", "nickname"],
  "query": {
    "terms": {
      "nickname": [
        "zhangsan",
        "lisi"
      ]
    }
  }
}

还可以通过 includes来指定想要显示的字段,excludes来指定不想要显示的字段

GET /student(索引名称)/_search
{
  "_source": {
    "includes": ["name", "nickname"]
  },
  "query": {
    "terms": {
      "nickname": [
        "zhangsan"
      ]
    }
  }
}
组合查询

bool把其它各种查询通过must(必须 )、must_not(必须不)、should(应该)的方式进行组合

GET /student(索引名称)/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "zhangsan"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "age": "40"
          }
        }
      ],
      "should": [
        {
          "match": {
            "sex": "男"
          }
        }
      ]
    }
  }
}
范围查询

range 查询找出那些落在指定区间内的数字或者时间

操作符说明
gt大于
gte大于等于
lt小于
lte小于等于
GET /student(索引名称)/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
模糊查询

返回包含与搜索字词相似的字词的文档。

编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。包括更改字符、删除字符、插入字符,以及转置两个相邻字符。

为了找到相似的属于,fuzzy 查询会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展。然后查询返回每个扩展的完全匹配。

通过 fuzziness 修改编辑距离。一般使用默认值 AUTO,根据术语的长度生成编辑距离。

GET /student/_search
{
  "query": {
    "fuzzy": {
      "name": {
        "value": "zhangsa",
        "fuzziness": 2 // 编辑距离
      }
    }
  }
}
字段排序

sort 可以让我们按照不同的字段进行排序,并且通过 order 指定排序的方式。desc 降序,asc 升序。

  • 单字段

GET /student/_search
{
  "query": {
    "fuzzy": {
      "name": "zhangsan"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}
  • 多字段

假定我们想要结合使用 age 和 _score 进行查询,并且匹配的结果首先按照年龄排序,然后按照相关性得分排序。

GET /student/_search
{
  "query": {
    "fuzzy": {
      "name": "zhangsan"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      },
      "_score": {
        "order": "desc"
      }
    }
  ]
}
高亮查询

Elasticsearch可以对查询内容的关键字部分进行高亮,需要加上 highlight 属性。

  • pre_tags:前置标签

  • post_tags:后置标签

  • fields:需要高亮的字段

GET /student/_search
{
  "query": {
    "fuzzy": {
      "name": "zhangsan"
    }
  },
  "highlight": {
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fields": {
      "name": {}
    }
  }, 
  "sort": [
    {
      "age": {
        "order": "desc"
      },
      "_score": {
        "order": "desc"
      }
    }
  ]
}
分页查询

from:当前页,默认从0开始,查询数据条目的计算公式是:from = (pageNum - 1) * size

size:每页显示的记录数

GET /student/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "height": {
        "order": "desc"
      }
    }
  ],
  "from": 1,
  "size": 2
}
聚合查询
  • 对某个字段取最大值

GET /student/_search
{
  "aggs": {
    "max_age": {
      "max": {
        "field": "age"
      }
    }
  },
  "size": 0
}
  • 对某个字段取最小值

GET /student/_search
{
  "aggs": {
    "min_height": {
      "min": {
        "field": "height"
      }
    }
  },
  "size": 0
}
  • 对某个字段求和

GET /student/_search
{
  "aggs": {
    "sum_height": {
      "sum": {
        "field": "height"
      }
    }
  },
  "size": 0
}
  • 对某个字段求平均值

GET /student/_search
{
  "aggs": {
    "avg_height": {
      "avg": {
        "field": "height"
      }
    }
  },
  "size": 0
}
  • 对某个字段的值进行去重之后再取总数

GET /student/_search
{
  "aggs": {
    "distinct_age": {
      "cardinality": {
        "field": "age"
      }
    }
  },
  "size": 0
}
  • 对某个字段一次性返回 count,max,min,avg 和 sum 五个指标

GET /student/_search
{
  "aggs": {
    "stats_age": {
      "stats": {
        "field": "age"
      }
    }
  },
  "size": 0
}
桶聚合查询
  • terms 聚合,分组统计

GET /student/_search
{
  "aggs": {
    "age_group_by": {
      "terms": {
        "field": "age"
      }
    }
  },
  "size": 0
}

terms聚合会将去重后的字段做为key统计文档数量

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "age_group_by" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 30,
          "doc_count" : 2
        },
        {
          "key" : 20,
          "doc_count" : 1
        },
        {
          "key" : 40,
          "doc_count" : 1
        },
        {
          "key" : 50,
          "doc_count" : 1
        }
      ]
    }
  }
}
  • terms分组后再向下聚合

terms分组后再向下聚合,将去重后的字段做为key来统计文档的数量的同时,将指定字段再聚合,可以求和、平均数等等

GET /student/_search
{
  "aggs": {
    "age_group_by": {
      "terms": {
        "field": "age"
      },
      "aggs": {
        "avg_age": {
          "avg": {
            "field": "height"
          }
        }
      }
    }
  },
  "size": 0
}

查询结果

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "age_group_by" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 30,
          "doc_count" : 2,
          "avg_age" : {
            "value" : 168.625
          }
        },
        {
          "key" : 20,
          "doc_count" : 1,
          "avg_age" : {
            "value" : 168.5
          }
        },
        {
          "key" : 40,
          "doc_count" : 1,
          "avg_age" : {
            "value" : 170.0
          }
        },
        {
          "key" : 50,
          "doc_count" : 1,
          "avg_age" : {
            "value" : 159.75
          }
        }
      ]
    }
  }
}
  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值