zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

【Elasticsearch】Rest风格API

elasticsearchAPI 风格 rest
2023-06-13 09:17:13 时间
  1. Rest风格API

Elasticsearch提供了Rest风格的API,即http请求接口

    1. 基本概念

Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。

索引(indices)

Databases 数据库

类型(type)

Table 数据表

文档(Document)

Row 行

字段(Field)

Columns 列

  1. 索引库(indices):indices是index的复数,代表许多的索引
  2. 类型(type):类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念
  3. 文档(document):存入索引库原始的数据。比如每一条商品信息,就是一个文档
  4. 字段(field):文档中的属性
  5. 映射配置(mappings):字段的数据类型、属性、是否索引、是否存储等特性
  6. 官网

Elasticsearch Guide [6.8] | Elastic

    1. 索引操作
      1. 创建索引:put请求
  1. 使用kibana创建索引
    1. 请求方式:PUT
    2. 请求路径:索引库名
    3. 请求参数:json格式

put book

{

  "settings":{

    "number_of_shards":1, /*分片数量*/

    "number_of_replicas":0 /*副本数量*/

  }

}

  1. number_of_shards 是指索引要做多少个分片,只能在创建索引时指定,后期无法修改。
  2. number_of_replicas 是指每个分片有多少个副本,后期可以动态修改
  3. 什么是分片?

ES中所存数据的文件块,也是数据的最小单元块。假如有2个分片,插入10条数据,默认,每个分片存5条。

      1. 查看索引:get请求

get 索引库名

  1. 我们可以使用*来查询所有索引库
      1. 删除索引:delete请求

delete 索引库名

    1. 映射配置

创建索引库,就相当于mysql创建“数据库”。接着我们来配置映射,相当于mysql创建“表结构”。

  1. 在ElasticSearch中,我们常配置:
    1. 字段的数据类型
    2. 是否要存储
    3. 是否要索引
    4. 是否分词
    5. 分词器是什么
      1. 创建映射关系

PUT /索引库名/_mapping/类型名称

{

  "properties": {

    "字段名": {

      "type": "类型",

      "index": true,

      "store": true,

      "analyzer": "分词器"

    }

  }

}

  1. 类型名称:基本概念中所说的type,类似于数据库中的表
    1. 字段名:类似于数据库中的列名。
      1. type:类型,可以是text、keyword、long、short、date、integer、object等
      2. index:是否索引,默认为true
      3. store:是否存储,默认为false
      4. analyzer:分词器,这里的`ik_max_word`即使用ik分词器
  2. 实例

/* 1.先创建索引 */

put czxy

/* 2.创建映射关系 */

put czxy/_mapping/book

{

  "properties": {

    "title": {

      "type": "text",

      "analyzer": "ik_max_word"

    },

    "images": {

      "type": "keyword",

      "index": "false"

    },

    "price": {

      "type": "float"

    }

  }

}

      1. 查看映射关系

GET /索引库名/_mapping

      1. 字段属性详解

1)type

  1. Elasticsearch中支持的数据类型非常丰富
    1. String类型,又分两种:
      1. text修饰字符串,默认进行分词,并生成索引。不能用来过滤、排序和聚合等操作。
      2. keyword修饰字符串,不会分词,不会建立索引。常常被用来过滤、排序和聚合。
    2. Numerical:数值类型,分两类
      1. 基本数据类型:long、interger、short、byte、double、float、half_float
      2. 浮点数的高精度类型:scaled_float
      3. 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
    3. Date:日期类型
      1. elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。

2)index

index影响字段的索引情况。

  1. true:字段会被索引,则可以用来进行搜索。默认值就是true
  2. false:字段不会被索引,不能用来搜索

index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。

但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false。

3)store

是否将数据进行额外存储。

Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做`_source`的属性中。而且我们可以通过过滤`_source`来选择哪些要显示,哪些不显示。

而如果设置store为true,就会在`_source`以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,**store的默认值就是false。**

    1. 数据操作
      1. 添加数据
  1. 语法:没有id

POST _index/_type/

{

  "属性": "值",

  ....

}

  1. 实例

POST czxy/book/

{

  "title": "标题",

  "price": 1234

}

      1. 添加或更新数据
  1. 语法:数据存在更新;如果不存在添加(指定id)

PUT _index/_type/_id

{

  "属性": "值",

  ....

}

  1. 实例

PUT czxy/book/b001

{

  "title": "标题123",

  "price": 1234

}

      1. 删除数据
  1. 语法:

DELETE _index/_type/_id

  1. 实例

DELETE czxy/book/b001

    1. 查询操作
      1. 简单查询
  1. 指定id查询

GET czxy/book/b001

  1. 指定id查询,检索指定内容

GET czxy/book/b001?_source=title,price

      1. 高级查询
  1. 准备数据

PUT czxy2

PUT czxy2/_mapping/user

{

  "properties": {

    "username": {

      "type": "text",

      "analyzer": "ik_max_word"

    },

    "city": {

      "type": "keyword"

    },

    "age": {

      "type": "float"

    }

  }

}

PUT czxy2/user/u001

{

  "username": "张三",

  "city": "山西",

  "age": 18

}

PUT czxy2/user/u002

{

  "username": "张四",

  "city": "山东",

  "age": 20

}

PUT czxy2/user/u003

{

  "username": "张三三",

  "city": "山东",

  "age": 22

}

  1. 查询所有
    1. match_all:检索所有的数据

GET _search

{

  "query": {

    "match_all": {}

  }

}

  1. 查询指定索引的所有

GET czxy2/_search

{

  "query": {

    "match_all": {}

  }

}

  1. 查询部分结果

GET czxy2/_search

{

  "query": {

    "match_all": {}

  },

  "_source": ["username","city"]

}

  1. 条件查询:匹配查询

GET czxy2/_search

{

  "query": {

    "match": {

      "username": "张三"

    }

  }

}

  1. 条件查询:复合查询(多条件查询)
    1. bool:多条件拼接
    2. must:必须
    3. must_not:不含
    4. should:可有可无

GET czxy2/_search

{

  "query": {

    "bool": {

      "must": [

        {

          "match": {

            "city": "山东"

          }

        }

      ],

      "must_not": [

        {

          "match": {

            "age": 22

          }

        }

      ]

    }

  }

}

  1. should并集查询
    1. 注意:must和should同时存在的时候,should将会变得不起作用

GET czxy2/_search

{

  "query": {

    "bool": {

      "should": [

        {

          "match": {

            "city": "山东"

          }

        },

        {

          "match": {

            "city": "山西"

          }

        }

      ]

    }

  }

}

  1. 精确匹配
    1. term 进行精确匹配(数据要求:数字、日期、布尔、not_analyzed的字符串(未分词))

GET czxy2/_search

{

  "query": {

    "term": {

      "age": 2

    }

  }

}

  1. 范围查询
    1. range 用于确定范围,gt 大于、lt 小于、gte大于等于、lte小于等于

GET czxy2/_search

{

  "query": {

    "range": {

      "age": {

        "gte": 19,

        "lte": 21

      }

    }

  }

}

  1. 排序

GET czxy2/_search

{

  "query": {

    "match_all": {}

  },

  "sort": [

    {

      "age": {

        "order": "desc"

      }

    }

  ]

}

  1. 分页查询
    1. from 设置索引号,从0开始
    2. size 设置每页个数

GET czxy2/_search

{

  "query": {

    "match_all": {}

  },

  "from": 0,

  "size": 1

}