最近開始想把 LOG 儲存在 Elasticsearch 裡,但這樣做需要有個方便查詢的 UI 介面,對我而言 Kibana 功能過於複雜,Postman 查詢又比較麻煩。後來發現了 Elasticvue 這個工具,選擇它的原因是它支援多種瀏覽器擴充套件及桌面應用程式版本。
Elasticvue 的查詢介面主要基於 query_string 語法,這是 Elasticsearch 中基於 Lucene 查詢語法的擴展版本。對熟悉 SQL 的使用者來說,query_string
比其他 DSL 語法更容易上手,因此我整理了一些常用的語法方便查閱。
可從 Elasticvue 官網 查看各個瀏覽器擴充套件,或是桌面應用程式的安裝檔案或連結。
未指定欄位時,QueryString 會在所有可搜尋欄位中進行搜尋。
簡單關鍵字搜尋:
多個詞彙(預設使用 OR 連接):
精確片語搜尋(使用雙引號):
AND 運算符(兩個詞都必須存在):
OR 運算符(至少有一個詞必須存在):
NOT 運算符(排除包含某詞的文件):
加號(必須包含此詞):
減號(必須排除此詞):
針對特定欄位搜尋:
針對多個欄位的查詢:
多值查詢(OR 條件):
欄位存在性查詢:
欄位指定優先順序:查詢字串中明確指定欄位 > fields 參數 > default_field 參數。
範圍查詢:
比較運算符:
這兩種寫法在功能上通常等價,可依情境選擇使用。
萬用字元搜尋:
default_field vs fields:
default_field
: 指定預設搜尋的單一欄位。fields
: 指定多個搜尋欄位及其權重。控制是否對萬用字元表達式進行分析處理:
analyze_wildcard: false
(預設):萬用字元表達式不經過分析器處理。analyze_wildcard: true
:萬用字元表達式先經過分析器處理,可實現大小寫不敏感搜尋。指定如何處理和分析查詢字串:
analyzer 在 text 與 keyword 類型欄位上的差異:
控制同義詞處理方式:
true
(預設):自動為同義詞生成片語查詢,保持詞序和相鄰性。false
:只生成普通同義詞查詢,不考慮詞序。例如,若設定 "ny" 與 "new york" 為同義詞:
Elasticsearch 提供兩種方式來控制搜尋權重:
1. boost 參數:調整整個查詢的權重。
2. 欄位加權:使用 ^
語法調整特定欄位的權重。
兩者結合使用的例子:
在這個例子中:
差異:
boost
:控制整個查詢的權重。^
:控制查詢內不同欄位間的相對權重。波浪號 ~
在 QueryString 中有兩種不同用途,取決於它的位置:
1. 模糊搜尋(單詞後的波浪號):
fuzziness
2. 近似搜尋(片語後的波浪號):
phrase_slop
在 API 中設定這些參數:
fuzziness 設定差異:
"fuzziness": "AUTO"
:根據詞長自動調整(1-2字元:0錯誤,3-5字元:1錯誤,>5字元:2錯誤)。"fuzziness": 2
:固定允許最多2個字元編輯距離。範例說明:
apple~1
可匹配 "aple", "appla" 等拼寫錯誤的詞。"quick fox"~3
可匹配 "quick brown fox"(中間有詞)或 "fox is quick"(順序變化)。優先順序:
~
設定的值會覆蓋 API 參數中的全域設定。基本日期範圍搜尋:
相對時間搜尋:
常用相對時間表達式:
now-1h
:一小時前。now-1w
:一週前。now/d
:今天開始。now/w
:本週開始。now/M
:本月開始。範圍語法vs比較運算符:
日期時間格式:
yyyy-MM-ddTHH:mm:ss.SSSZ
。yyyy-MM-dd
。在查詢中加入分頁參數:
QueryString 中有許多特殊字元具有特定含義,若要作為普通字元使用,需要使用反斜線 \
轉義:
例如:
title:\+1
content:\(sample\)
description:\"quoted text\"
ELK
Elasticsearch