基本概念

Node 与 Cluster

  • Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
  • 单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。

Index

  • Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
  • 所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
  • 下面的命令可以查看当前节点的所有 Index:$ curl -X GET 'http://localhost:9200/_cat/indices?v'

Document

  • Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
  • Document 使用 JSON 格式表示,下面是一个例子。
    1
    2
    3
    4
    5
    {
    "user": "张三",
    "title": "工程师",
    "desc": "数据库管理"
    }
  • 同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。

Type

  • Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
  • type 指定只能是_doc值,同时也是不支持多 type 的

索引 Index、类型 Type 和文档 Document

对比我们比较熟悉的 MySQL 数据库:

1
2
3
index → db
type → table
document → row

ES SQL(6.3版本后支持)

玩转 Elasticsearch 的 SQL 功能

示例:

1
2
3
4
5
6
7
8
# format类型有:json,yaml,smile,cbor,txt,csv,tsv,默认为json格式
# fetch_size 每页返回多少个结果
# /_sql、_sql两种都可以
POST _sql?format=txt
{
"query":"select id,name,pwd,sex from \"index-user-2020.09.08\" where sex=1",
"fetch_size":20
}

匹配索引名称

1
2
3
4
5
POST _sql?format=txt
{
"query":"select id,name,pwd,sex from \"<index-user-{now/d}>\" where sex=1",
"fetch_size":20
}

多索引查询

1
2
3
4
GET _sql?format=txt
{
"query":"select id,name,pwd,sex from \"index-user-2020.09.08,index-user-2020.09.09,index-user-*,\" where sex=1"
}

将SQL转化为DSL

1
2
3
4
5
POST _sql/translate
{
"query":"select id,name,pwd,sex from \"index-user-2020.09.08\" where sex=1",
"fetch_size":20
}

SQL和DSL混合使用

1
2
3
4
5
6
7
8
9
10
POST _sql?format=txt
{
"query":"select id,name,pwd,sex from \"index-user-2020.09.08\" where sex=1",
"filter": {
"match": {
"id": 1065706171
}
},
"fetch_size":20
}

fetch_size游标的使用

1
2
3
4
5
GET _sql
{
"query":"select * from weather",
"fetch_size":2
}

执行结果:

1
{"columns":[{"name":"name","type":"text"}],"rows":[["John Doe1"],["John Doe2"]],"cursor":"w7ysAwFzQERYRjFaWEo1UVc1a1JtVjBZMmdCQUFBQUFBSHp2bVVXU2pkdFRtMXpkMGRSTVcxaE1IRlljV3BLT0haMmR3PT3/////DwEBZgRuYW1lAQR0ZXh0AVoAAAABAQ=="}

将获取到的cursor用于下次查询

1
2
3
4
5
GET _sql
{
"cursor":"w7ysAwFzQERYRjFaWEo1UVc1a1JtVjBZMmdCQUFBQUFBSHp3OTRXU2pkdFRtMXpkMGRSTVcxaE1IRlljV3BLT0haMmR3PT3/////DwEBZgRuYW1lAQR0ZXh0AVoAAAABAQ==",
"fetch_size":2
}

占位符的使用

1
2
3
4
5
POST /_sql?format=txt
{
"query": "SELECT YEAR(release_date) AS year FROM library WHERE page_count > ? AND author = ? GROUP BY year HAVING COUNT(*) > ?",
"params": [300, "Frank Herbert", 0]
}

使用DESCRIBE语句查看表(ES中为索引)中有哪些字段

1
2
3
4
POST /_sql?format=txt
{
"query": "DESCRIBE \"index-user-2020.09.08\""
}

使用SHOW TABLES查看所有的表(ES中为索引)

1
2
3
4
POST /_sql?format=txt
{
"query": "SHOW TABLES"
}

查询支持的函数

1
2
3
4
5
6
7
8
POST /_sql?format=txt
{
"query": "SHOW FUNCTIONS"
}
POST /_sql?format=txt
{
"query": "SHOW FUNCTIONS LIKE '%DATE%'"
}

全文搜索函数Match()(全文搜索函数是ES中特有的)

1
2
3
4
5
# 使用MATCH函数查询tag中包含spxm-mas的记录
POST /_sql?format=txt
{
"query":"select id,name,pwd,sex from \"index-user-2020.09.08\" where MATCH(name,'admin') limit 10"
}

全文搜索函数QUERY()

1
2
3
4
5
# 使用QUERY函数查询tag中包含spxm-mas的记录
POST /_sql?format=txt
{
"query":"select id,name,pwd,sex from \"index-user-2020.09.08\" where QUERY('name:admin') limit 10"
}

使用SQL CLI

输入以下命令启动(该命令位于ES的bin目录下)

1
2
3
4
# 没有密码
./elasticsearch-sql-cli http://<ip>:9200
# 有密码
./elasticsearch-sql-cli http://elastic:elastic@<ip>:9200

HTTP方式查询

1
http://<ip>:9200/apigw-*/_search