wordpress必裝的插件焦作網(wǎng)站seo
先簡單介紹一下這個sql查詢,因?yàn)樯鐓^(qū)一直反饋這個Query DSL 實(shí)在是太難用了。大家可以感受一下下面這個es的查詢。
GET /my_index/_search
{
“query”: {
“bool”: {
“must”: [
{ “match”: { “title”: “search” } },
{
“bool”: {
“should”: [
{ “term”: { “category”: “books” } },
{ “term”: { “category”: “music” } }
]
}
}
],
“filter”: {
“range”: {
“price”: { “gte”: 20, “l(fā)te”: 100 }
}
}
}
},
“aggs”: {
“avg_price_per_category”: {
“terms”: {
“field”: “category”,
“size”: 10
},
“aggs”: {
“avg_price”: {
“avg”: {
“field”: “price”
}
}
}
}
}
}
這個查詢使用了bool查詢來組合多個條件,包括must、should和filter。同時也包含了聚合(aggs)來計(jì)算不同類別的平均價格。對于業(yè)務(wù)查詢來講,這個查詢很普通。但是還是很難理解,特別是對于新手來講,更難記了,很容易出錯。
如果是mysql的查詢,就是這么寫
SELECT title, category, price
FROM my_index
WHERE (title = ‘search’ AND (category = ‘books’ OR category = ‘music’))
AND price >= 20 AND price <= 100
GROUP BY category
ORDER BY AVG(price) DESC
LIMIT 10
mysql 的查詢就很簡潔明了,看起來更舒服,后續(xù)維護(hù)也更方便。
既然都是查詢,為啥不兼容一下mysql的語法呢,像很多工具現(xiàn)在都是兼容mysql的語法,比如說hive,starrocks,flink等 等,原因就是因?yàn)閙ysql的用戶多,社區(qū)活躍。還有一個原因就是因?yàn)閙ysql的語法比較簡單,容易理解。所以ElasticSearch 官方ElasticSearch 從 6.3.0 版本也開始支持 SQL 查詢了,這就是一個喜大奔普的事情了,哈哈。
下面是官方的文檔和介紹,大家可以看看 www.elastic.co/guide/en/el…
2.準(zhǔn)備環(huán)境
大家在ES官網(wǎng)下載一下ES 啟動就可以了,注意的是ES 需要JDK環(huán)境,然后就是需要在6.3.0以上的版本。 www.elastic.co/cn/download…
建議也下載一下kibana
我這邊下載的是7.15.2版本
3.搞起
創(chuàng)建一個索引 my_index
PUT /my_index
{
“mappings”: {
“properties”: {
“title”: { “type”: “text” },
“category”: { “type”: “keyword” },
“price”: { “type”: “float” }
}
}
}
插入一些數(shù)據(jù)
POST /my_index/_doc/1
{
“title”: “ES學(xué)習(xí)手冊”,
“category”: “books”,
“price”: 29.99
}
POST /my_index/_doc/2
{
“title”: “on my way”,
“category”: “music”,
“price”: 13.57
}
POST /my_index/_doc/3
{
“title”: “Kibana中文筆記”,
“category”: “books”,
“price”: 21.54
}
傳統(tǒng)的查詢所有
GET /my_index/_search
{
}
返回的是文檔的格式
如果用sql 查詢
POST /_sql?format=txt
{
“query”: “SELECT * FROM my_index”
}
返回的是類似數(shù)據(jù)庫的表格形式,是不是寫起來更舒服呢。
分頁limit
POST /_sql?format=txt
{
“query”: “SELECT * FROM my_index limit 1”
}
和mysql 一樣沒啥,很簡單。
order by 排序
POST /_sql?format=txt
{
“query”: “SELECT * FROM my_index order by price desc”
}
group by 分組
POST /_sql?format=txt
{
“query”: “SELECT category,count(1) FROM my_index group by category”
}
SUM 求和
POST /_sql?format=txt
{
“query”: “SELECT sum(price) FROM my_index”
}
where
POST /_sql?format=txt
{
“query”: “SELECT * FROM my_index where price = ‘13.57’”
}
看看是不是支持時間的轉(zhuǎn)換的處理,插入一些數(shù)據(jù)
POST /my_index/_doc/4
{
“title”: “JAVA編程思想”,
“category”: “books”,
“price”: 21.54,
“create_date”:“2023-11-18T12:00:00.123”
}
POST /my_index/_doc/5
{
“title”: “Mysql操作手冊”,
“category”: “books”,
“price”: 21.54,
“create_date”:“2023-11-17T07:00:00.123”
}
時間轉(zhuǎn)換為 yyyy-mm-dd 格式
POST /_sql?format=txt
{“query”: “SELECT title, DATETIME_FORMAT(create_date, ‘YYYY-MM-dd’) date from my_index where category= ‘books’” }
時間加減
POST /_sql?format=txt
{“query”: “SELECT date_add(‘hour’, 8,create_date) date from my_index where category= ‘books’” }
字符串拆分
POST /_sql?format=txt
{
“query”: “SELECT SUBSTRING(category, 1, 3) AS SubstringValue FROM my_index”
}
基本上mysql 能查的 es sql 也能查,以后查詢ES 數(shù)據(jù)就很方便的,特別是對于做各種報表的查詢。像這樣。
一般對于這種報表,返回的數(shù)據(jù)都是差不多json數(shù)組的格式。而對于es sql,查詢起來很方便
[
{
“data”: “5”,
“axis”: “總數(shù)”
},
{
“data”: “0”,
“axis”: “待出庫”
},
{
“data”: “0”,
“axis”: “配送中”
},
{
“data”: “5”,
“axis”: “已簽收”
},
{
“data”: “0”,
“axis”: “交易完成”
},
{
“data”: “0”,
“axis”: “已取消”
},
{
“data”: “5”,
“axis”: “銷售”
}
4.總結(jié)
ES SQL查詢的優(yōu)點(diǎn)還是很多的,值得學(xué)習(xí)。使用場景也很多
簡單易學(xué):ES SQL查詢使用SQL語法,對于那些熟悉SQL語法的開發(fā)人員來說,學(xué)習(xí)ES SQL查詢非常容易。
易于使用:ES SQL查詢的語法簡單,易于使用,尤其是對于那些不熟悉Query DSL語法的開發(fā)人員來說。
可讀性強(qiáng):ES SQL查詢的語法結(jié)構(gòu)清晰,易于閱讀和理解。
5.最后附上相關(guān)鏈接
ES 官方下載
www.elastic.co/cn/download…
ES sql文檔 www.elastic.co/guide/en/el…