一:名词介绍

  一个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":{}
      }
    }
}