如何使用 Kibana Console DSL 查詢語言 - 操作 Elasticsearc 資料結構(下)
在前一篇 如何使用 Kibana Console DSL 查詢語言 - 操作 Elasticsearc 資料結構(上) 主要介紹在 Kibana console DSL 如何對 Elasticsearch 數據的 CRUD 操作,在本篇則針對查詢語法做進一步的探討。在 Kibana Console 可以用來直接執行查詢檢索及操作數據功能,再輸入 Elasticsearch 查詢語言 DSL
後面的部分我們會在提到 Elasticsearch Analyzer 分詞器是什麼?實際範例演練
以下直接以實際案例來做語法說明,可以在Elasticsearch 相對的各種情境查詢作為參考:
(在這裡的 index 都以 poc-trylog 來做範例說明)
搜尋文檔包含指定的內容
CVT2HUGO: 命令後,可以透過 ```Ctrl/Cmd
GET poc-trylog/_search?q=hello
CVT2HUGO: + Enter``` 送出查詢結果。
df=欄位名稱 指定查詢欄位
GET poc-trylog/_search/?q=adam&df=user
同時查詢多關鍵字,只要其中一個符合即可
GET poc-trylog/_search?q=user:adam keyword2
GET poc-trylog/_search?q=user:(keyword1 keyword2)
Elasticsearch 同時查詢多關鍵字,且都需要包含,順序排列沒有影響
GET poc-trylog/_search?q=user:(keyword1 AND keyword2)
同時查詢多關鍵字,且都要完全符合,這裡雙引號是一個整體查詢結果
GET poc-trylog/_search?q=user:"keyword1 keyword2"
查詢關鍵字以及不包含的關鍵字
GET poc-trylog/_search?q=user:(adam -keyword2)
查詢符合時間的內容
GET poc-trylog/_search/?q=post_date:>=2020-12-08
查詢符合時間區間的內容
GET poc-trylog/_search/?q=post_date:(>=2020-12-01 AND <=2020-12-26)
時間區間也可用 TO
GET poc-trylog/_search/?q=post_date:[2020-12-07 TO 2020-12-26]
查詢符合時間區間的內容+複合查詢
GET poc-trylog/_search/?q=post_date:(>=2020-12-01 AND <=2020-12-26) AND user:adam
Elasticsearch 模糊查詢-針對單一字元
?表示有一個字元需要模糊查詢
GET poc-trylog/_search/?q=user:ada?
模糊查詢,針對多字元模糊查詢
*表示後面都是模糊查詢
GET poc-trylog/_search/?q=user:ad*
Elasticsearch Request body 複雜查詢&分頁
複雜查詢可以針對分頁及時間區間來執行查詢,當我們資料要做 pagination 時,就可以使用這方式處理
這裡可以看到 range 裡面的日期起始可以透過 gte
分頁可以透過 from
CVT2HUGO: 與 lte
CVT2HUGO: 表示起始點(由0表示為第一筆), size
CVT2HUGO: 表示要取得幾筆
GET poc-trylog/_search
{
"query": {
"range": {
"post_date":{
"gte": "2020-12-01",
"lte": "2020-12-26"
}
}
},
"from": 0,
"size": 4
}
Term 單詞查詢
Term 查詢,在查詢過程不會做分詞處理,因此大小寫必須明確,在查詢時會原封不動的把 term 直接進行匹配。 在倒排索引以準確的詞來進行搜尋。
GET poc-trylog/_search
{
"query": {
"term": {
"user":{
"value":"adam"
}
}
},
"from": 0,
"size": 4
}
Terms 多關鍵字查詢
同樣在 terms 也不會進行分詞處理,因此大小寫必須明確,在查詢時會原封不動的把 term 直接進行匹配。 在倒排索引以準確的詞來進行搜尋。
GET poc-trylog/_search
{
"query": {
"terms": {
"user":[
"adam",
"d"
]
}
},
"from": 0,
"size": 4
}
Elasticsearch 搜尋結果排序
可以透過 sort
CVT2HUGO: 以及 ```order```
GET poc-trylog/_search
{
"query": {
"terms": {
"user":[
"adam",
"d"
]
}
},
"sort": [
{
"post_date": {
"order":"desc"
}
}
],
"from": 0,
"size": 4
}
CVT2HUGO: 指定遞減 desc
constant_score 查詢
不會對查詢數據進行score算分,並且會針對查詢內容進行緩存,提升查詢效率
CVT2HUGO: 或遞增 ```asc```
GET poc-trylog/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"user": "adam"
}
}
}
}
}
CVT2HUGO: 排序
Elasticsearch Fuzzy 模糊查詢
在 Elasticsearch 可以透過 fuzzy 來進行模糊查詢
例如,這裡要查詢的是 adam,但我們關鍵字改為 adan,在 fuzzy 查詢仍可以匹配到結果
GET poc-trylog/_search
{
"query": {
"fuzzy": {
"user": {
"value":"adan"
}
}
}
}