如何使用 Kibana Console DSL 查詢語言 - 操作 Elasticsearc 資料結構(下)

如何使用 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"
      }
    }
  }
}