和我一起打造个简单搜索之ElasticSearch入门

本文最后更新于:2021年6月15日 晚上

本文简单介绍了使用 Rest 接口,对 es 进行操作,更深入的学习,可以参考文末部分。

环境

本文以及后续 es 系列文章都基于 5.5.3 这个版本的 elasticsearch ,这个版本比较稳定,可以用于生产环境。

系列文章

基础概念

索引–相当于数据库
类型–相当于表
文档–相当于一条记录
分片–对索引进行分片,分布于集群各个节点上,降低单个节点的压力
备份–拷贝分片就完成了备份


基本语法

索引

索引类型

  • 结构化索引
    • 特点:通过接口创建,可以指定 mappings
    • url:port/索引名/类型名/_mappings
  • 非结构化索引
    • 特点:通过 elasticsearch head 创建 mapping 为空

使用 RestClient/PostMan 创建结构化索引

创建一个 people 的索引,包含一个类型 man

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
},
"mappings":{
"man":{
"properties":{
"name":{
"type":"text"
},
"country":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"date":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}

keyword 与 text 的区别

type 类型为 keyword 的时候,ES 不会对其进行分词,而 text 会被分词

es 通过 rest 接口对数据操作

插入数据

  1. 指定文档 id 插入
    1. PUT 请求: ip:port/索引/类型/id
  2. 自动产生文档 id 插入
    1. POST 请求: ip:port/索引/类型

修改数据

  1. 直接修改
    1. POST 请求: ip:port/索引/类型/id/_update

删除数据/删除索引

  1. 删除文档
    1. DELETE 请求 ip:端口/索引/类型/id
  2. 删除索引
    1. DELETE 请求 ip:端口/索引

查询数据

  1. 简单查询

    1. GET 请求: ip:端口/索引/类型/id
  2. 条件查询

    1. POST请求: ip:端口/索引/_search
    2. 指定条件查询,分页与排序
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      {
      "query":{
      "match":{
      "name":"WeJan"
      }
      },
      "sort":[
      {
      "age":{
      "order":"asc"
      }
      }
      ],
      "from" : 0,
      "size" : 10
      }
  3. 聚合查询

    1. POST请求: ip:端口/索引/_search
    2. 分组,可以多个分组
      1
      2
      3
      4
      5
      6
      7
      8
      9
      {
      "aggs":{
      "group_by_age":{
      "terms":{
      "field":"age"
      }
      }
      }
      }
    3. 聚合计算
      1
      2
      3
      4
      5
      6
      7
      8
      9
      {
      "aggs":{
      "age_count":{
      "stats":{
      "field":"age"
      }
      }
      }
      }
      • sum
      • avg
      • max
      • min
      • count

高级查询

  1. 习语匹配(全词匹配)
    1
    2
    3
    4
    5
    6
    7
    {
    "query":{
    "match_phrase":{
    "name":"WeJan"
    }
    }
    }
  2. 多字段匹配,多个字段包含query
    1
    2
    3
    4
    5
    6
    7
    8
    {
    "query":{
    "multi_match":{
    "query":"WeJan",
    "fields":["author", "title"]
    }
    }
    }
  3. query_string 文本查询
    1
    2
    3
    4
    5
    6
    7
    {
    "query":{
    "query_string":{
    "name":"(WeJan AND Jan) OR 哈哈"
    }
    }
    }
  4. 针对多个字段的文本查询
    1
    2
    3
    4
    5
    6
    7
    8
    {
    "query":{
    "query_string":{
    "name":"WeJan OR 哈哈",
    "fields":["author", "title"]
    }
    }
    }
  5. 字段查询,比如年龄,分类
    1
    2
    3
    4
    5
    6
    7
    {
    "query":{
    "term":{
    "age":25
    }
    }
    }
  6. 范围查询,可以对时间字段进行查询,现在使用 “now”替代
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
    "query":{
    "range":{
    "age":{
    "gte":26,
    "lte":36
    }
    }
    }
    }

    参考