参考
sql-rest-filtering
sql-rest-columnar
sql-rest-params
使用SQL+DSL 进行过滤
通过在过滤器参数中指定查询,可以使用标准Elasticsearch查询 DSL 过滤 SQL 将在其上运行的结果。
POST /_sql?format=txt
{
"query": "SELECT * FROM library ORDER BY page_count DESC",
"filter": {
"range": {
"page_count": {
"gte" : 500,
"lte" : 600
}
}
},
"fetch_size": 5
}
返回
author | name | page_count | release_date
----------------+---------------+---------------+------------------------
James S.A. Corey|Leviathan Wakes|561 |2011-06-02T00:00:00.000Z
列式结果
通常,显示 SQL 查询结果结果的最广为人知的方式是每个单独的记录/文档表示一行/行。对于某些格式,弹性搜索 SQL 可以按列方式返回结果:一行表示当前结果页面中某个列的所有值。
可以按列方向返回以下格式:
- json
- yaml
- cbor
- smile
返回POST /_sql?format=json
{
"query": "SELECT * FROM library ORDER BY page_count DESC",
"fetch_size": 5,
"columnar": true
}
{
"columns": [
{
"name": "author",
"type": "text"
},
{
"name": "name",
"type": "text"
},
{
"name": "page_count",
"type": "long"
},
{
"name": "release_date",
"type": "datetime"
}
],
"values": [
[
"Frank Herbert",
"James S.A. Corey",
"Dan Simmons"
],
[
"Dune",
"Leviathan Wakes",
"Hyperion"
],
[
604,
561,
482
],
[
"1965-06-01T00:00:00.000Z",
"2011-06-02T00:00:00.000Z",
"1989-05-26T00:00:00.000Z"
]
]
}
将参数传递给查询
例如,通过在查询字符串本身中集成值,可以在查询条件或语句中使用值来“内联”完成:HAVING
或者可以通过提取单独的参数列表中的值并在查询字符串中使用问号占位符()来完成:?POST /_sql?format=json
{
"query": "SELECT YEAR(release_date) AS year FROM library WHERE page_count > 100 GROUP BY year HAVING COUNT(*) > 0"
}
```json yearPOST /_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]
}
1965
```
将值传递给查询的推荐方法是使用问号占位符,以避免任何黑客攻击或 SQL 注入的尝试。