文章目录
一、前言
- es是面向文档型数据库,一条数据就是一个文档,可以通过下面这张表与关系型数据库进行类比:
ES | Mysql |
---|---|
Index(索引) | Database(数据库) |
Type(类型:es7+已删除) | Table(表) |
Documents(文档) | Row(行) |
Field(字段) | Column(列) |
- 正排索引: 用 id 建立索引,通过 id 查询数据。
倒排索引: 用数据中的 关键词 建立索引,通过 关键词 查询id
二、查询语句
1.综合
<1>帮助
GET /_cat/health?help
<2>查询所有
GET /_search
{
"query": {
"match_all": {}
}
}
<3>查看集群健康信息
GET /_cat/health?v
<4>查看集群中节点信息
GET /_cat/nodes?v
<5>查看集群中的索引信息
# 第一种
GET /_cat/indices?v
# 第二种(简化)
GET /_cat/indices?v&h=health,status,index
2.索引
<1>新增
PUT /book
<2>删除
DELETE /book
<3>查询
列出全部索引信息
GET /_cat/indices?v
3.文档
<1>声明索引下的文档字段类型
先创建索引
PUT /book
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"dynamic": "strict", # 插入数据时,如果遇到不存在的字段,不新增字段,直接报错
"properties": {
"title": {
"type": "text",
"index": true
},
"publisher": {
"type": "keyword",
"index": true
},
"page": {
"type": "text",
"index": false
},
"my_vector": {
"type": "dense_vector",
"dims": 2
}
}
}
}
ps:
- “type”: “text”
文本类型【使用 match 检索时自动进行分词】 - “type”: “keyword”
键值类型【使用 match 检索时不会进行分词】 - “index”: true
建立索引【参与检索】 - “index”: false
不建立索引【不参与检索】
<2>新增
- 新增时指定id
POST /book/_doc/1
{
"title":"历史上的今天",
"created":"2018-12-25"
}
- 新增时不指定id【随机生成id】
POST /book/_doc
{
"title":"历史上的今天",
"created":"2018-12-25"
}
<3>删除
根据id删除
DELETE /book/_doc/1
<4>修改
- 根据id修改【全部字段】
# title 和 created 全部更新
PUT /book/_doc/1
{
"title":"历史上的今天2",
"created":"2021-01-01"
}
- 根据id修改【单个字段】
# 仅更新 created
POST /book/_update/1
{
"doc": {
"created":"2021-01-01"
}
}
<5>查询
- 根据id查询
查询 book 索引下 _id 为 1 的文档
# 写法1
GET /book/_doc/1
# 写法2
GET /book/_search
{
"query": {
"match": {
"_id": 1
}
}
}
- 查询全部
查询 book 索引下的全部文档【默认返回前10000条】
# 写法1
GET /book/_search
# 写法2
GET /book/_search
{
"query": {
"match_all": {
}
}
}
# 写法3
GET /book/_doc/_search
- 查询总数
查询 book 索引下的文档总数
GET /book/_count
- 分词查询
GET /book/_search
{
"query": {
"match": {
"title": "历史上的今天"
}
}
}
ps:
- match
分词查询【检索 book 索引中 title 包含 历史、历史上、今天、历史上的今天 的数据】 - match_phrase
不分词查询【检索 book 索引中 title 只包含 历史上的今天 的数据】
- 单条件查询
查询 book 索引下满足 title 包含 历史上的今天 的数据
# 推荐写法
GET /book/_search
{
"query": {
"match_phrase": {
"title": "历史上的今天"
}
}
}
# 不推荐写法
GET /book/_search?q=title:历史上的今天
- 多条件查询【and】
查询 book 索引下满足 title 包含 历史上的今天 and created=2018-12-20 的数据
GET /book/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"title": "历史上的今天"
}
},
{
"match_phrase": {
"created": "2018-12-20"
}
}
]
}
}
}
- 多条件查询【or】
查询 book 索引下满足 title 包含 历史上的今天 or title 包含 历史上的今天2 的数据
GET /book/_search
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"title": "历史上的今天"
}
},
{
"match_phrase": {
"title": "历史上的今天2"
}
}
]
}
}
}
- 查询结果高亮显示
查询 book 索引中满足 title 包含 “历史” 的数据,并将检索结果中的历史俩字用<em>标签包裹
GET /book/_search
{
"query": {
"match_phrase": {
"title": "历史"
}
},
"highlight": {
"fields": {
"title": {}
}
}
}
ps:
- 范围查询
查询 book 索引下满足 price > 100 的数据
GET /book/_search
{
"query": {
"bool": {
"filter": {
"range": {
"price": {
"gt": 100.00
}
}
}
}
}
}
ps:
- gt 大于
- gte 大于等于
- it 小于
- ite 小于等于
- 分页查询
分页查询 book 索引下的全部数据,查询第1页,每页2条数据
GET /book/_search
{
"from": 0,
"size": 2
}
- 指定查询结果的返回字段
查询 book 索引下的全部数据,仅返回 title 字段
GET /book/_search
{
"_source": ["title"]
}
- 对查询结果排序
查询 book 索引下的全部数据,以创建时间降序排序
GET /book/_search
{
"sort": {
"created": {
"order": "desc"
}
}
}
ps:
- 升序 asc
- 降序 desc
- 聚合查询
对 book 索引下的 title 字段进行聚合查询
GET /book/_search
{
"aggs": {
"title_group": {
"terms": {
"field": "title.keyword",
"size": 10
}
}
},
"size": 0
}
ps:
- “title_group”: {
操作名称【这名随便起】 - “terms”: {
聚合操作 - “field”: “title.keyword”,
对哪个字段聚合【字符串类型需要加.keyword】 - “size”: 10
最大返回数 - “size”: 0
不返回命中数据
- 查询平均值
对 book 索引下的 price 字段求平均值
GET /book/_search
{
"aggs": {
"price_avg": {
"avg": {
"field": "price"
}
}
},
"size": 0
}
ps:
- “price_avg”: {
操作名称【这名随便起】 - “avg”: {
求平均操作 - “field”: “price”
对哪个字段求平均值 - “size”: 0
不返回命中数据