首页 > 技术文章 > ES:elasticsearch基本用法

wish-yang 2021-02-01 14:19 原文

官方文档:https://www.elastic.co/cn/elasticsearch/

一:名词介绍

  一个elasticsearch可以理解为一个集群。里面可以包含多个索引,一个索引可以有多个类型,一个类型可以包含多个文档,一个文档也可以包含多个字段。

  elasticsearch会把每个索引分成不同的分片,每个分片可以在一个集群里互相迁移。

  结构:此处用DB对比理解。

DB ES
数据库(DataBase) 索引(Indices)
表(Tables) 类型(Types)
行(Rows) 文档(Documents)
字段(Columns) 字段(fields)

  字段类型:

text 字符串 ⽤于全⽂索引,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合
keyword 字符串 如果字段需要进行过滤、排序、聚合。keyword类型的字段只能通过精确值搜索到
 byte 整数 取值范围:-128~127
short 整数 取值范围:-32768~32767
integer 整数 取值范围:-2^31~2^31-1
long 整数 取值范围:-2^63~2^63-1
double 浮点型 64位双精度
float 浮点型 32位双精度
half_float 浮点型 16位半精度
scaled_float 浮点型 缩放类型的浮点数
date 日期类型 可以指定format:  "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
boolean 布尔类型 true,false
binary 二进制数据 存储二进制数据,例如图像等,默认情况下该字段不索引
integer_range 范围类型 一系列带符号的32位整数,最小值为-2^31,最大值为2^31-1
float_range 范围类型 一系列单精度32位浮点型
long_range 范围类型 一系列单精度64位整数,-2^63~2^63-1
date_range 范围类型 一系列日期值表示为无符号的64位整数毫秒。
ip_range 范围类型 支持IPv4或IPv6(或混合)地址的一系列ip值
object 对象类型  
arrary 数组  
ip ip地址  

 

二:基本操作

# 创建索引
PUT mydb
# 删除索引
DELETE mydb
# 创建索引规则
PUT /mydb/_mappings?pretty
{
    "properties":{
      "name":{
        "type":"keyword"
      },
      "age":{
        "type":"byte"
      },
      "address":{
        "type":"text",
        "analyzer": "ik_smart"
      },
      "birthday":{
        "type":"date",
        "format":"yyyy-MM-dd"
      }
    }
  
}

# 查看索引规则
GET mydb/_mapping

# 插入(文档相同则会覆盖)一条数据
PUT /mydb/_doc/3
{
  "name":"王五",
  "age":20,
  "address":"上海市徐汇区",
  "birthday":"2020-01-10"
}

# 查询索引下所有数据
POST /mydb/_search

# 查询一条数据
GET /mydb/_doc/1

# 修改一条数据
POST /mydb/_doc/2/_update
{
  "doc":{
    "birthday":"2020-02-02"
  }
}

# 删除一条数据
DELETE /mydb/_doc/3

 

三:花式查询

  

# 查询索引下所有数据
POST /mydb/_search

# 查询姓名为”张三“的用户
POST /mydb/_doc/_search
{
  "query":{
    "match":{
      "name":"张三"
    }
  }
}
# 查询年龄=20的用户 term同上面的match比较,match会使用分词器解析,计算分数score,而term是直接精确查询。
POST /mydb/_doc/_search
{
  "query":{
      "term":{
        "age":"20"
      }
    }
}



# 查询姓名为”张三“的用户,用 _source 过滤查询结果
POST /mydb/_doc/_search
{
  "query":{
    "match":{
      "name":"张三"
    }
  },
  "_source":["name","age"]
}

# 查询所有用户,用 age 排序
POST /mydb/_doc/_search
{
  "sort":[
    {
      "age":{
        "order":"asc"
      }
    }
  ]
}

# 分页查询 from 开始页数,size 返回条数
POST /mydb/_doc/_search
{
  "sort":[
    {
      "age":{
        "order":"asc"
      }
    }
  ],
  "from":0,
  "size":1
}

# 多条件查询  must (and)
POST /mydb/_doc/_search
{
  "query":{
    "bool":{
      "must":[
        {
          "match":{
            "name":"张三"
          }
        },
        {
          "match":{
            "age":"30"
          }
        }
      ]
    }
  }
}

# 多条件查询 should (or)
POST /mydb/_doc/_search
{
  "query":{
    "bool":{
      "should":[
        {
          "match":{
            "name":"张三"
          }
        },
        {
          "match":{
            "age":"30"
          }
        }
      ]
    }
  }
}

# 多条件查询 must_not (not)
POST /mydb/_doc/_search
{
  "query":{
    "bool":{
      "must_not":[
        {
          "match":{
            "name":"张三"
          }
        }
      ]
    }
  }
}

# 过滤器 gt(>) gte(>=) lt(<) lte(<=)
POST /mydb/_doc/_search
{
  "query":{
    "bool":{
      "filter":[
        {
          "range":{
            "age":{
              "gt":"25"
            }
          }
        }
      ]
    }
  }
}

# 多次查询 可以查出 浦东 徐汇的 这里会根据关键字计算score,匹配高的排前面
POST /mydb/_doc/_search
{
  "query":{
    "match":{
      "address":"浦东 徐汇"
    }
  }
}

# 高亮查询
POST /mydb/_doc/_search
{
  "query":{
    "match":{
      "address":"上海"
    }
  },
    "highlight":{
      "fields":{
        "address":{}
      }
    }
}

 

  

推荐阅读