文章

顯示從 3月, 2020 起發佈的文章

ELK查詢指令-類似where的搜索條件-文字搜索-前處理

前言 ELK對文字的處理方式分成兩種 使用分析器分析 不進行分析 可藉由改變欄位的類型讓ELK跳過文字分析的動作,這會改變搜索的方法 而預設中文分析後,全部沒有空白的中文字會是一個 token 第一種,使用分析器分析 ELK對文字(Text類型)會進行底下的動作,做完後塞到elasticsearch資料庫內 移除大部分的符號 把剩餘的文字切割成一個一個的字,這些字有個特殊的名字叫做 token 把 token 變成小寫 會進行這些動作是為了全文搜索,這也是elasticsearch的優點之一 通常透由 logstash 輸入的文字欄位都是 text,除非有特別寫一份template指定欄位類型 例如輸入的文字是 POST myindex/_doc {   "message": "He is your friend, trust me." } 會先把符號拿掉 He friend trust me 分割成字 [He, your, friend, trust, me] 變成小寫 [he, your, friend, trust, me] 上面五個字就是 token,在進行文字搜索時,只要比對到一個token就算比對成功 is 這類型的字會被分析器過濾掉,因為它們是 stop token 筆者不是文字分析師,對此表達不懂,大概就是介係詞會被移除掉 這邊有被移除的英文字清單 如果想要保留 is 這類的英文字,這邊 官方文章 有說明 現在elasticsearch有中文分析器 _cjk_,筆者還沒用過 要搜索到上面的文字只要找到其中一個token就好 GET myindex/_search {   "query": {     "match": {       "message": "me"     }   } } 第二種,不進行分析 (Keyword) 將資料型態變為 keyword,可以停止elasticsearch對特定欄位進行分析 常用在 email、地址、主機名稱、序號等,整串文字放在一起才有意義 也可以把數字變成 k

ELK查詢指令-類似where的搜索條件-數字和日期搜索

前言 在用MySQL時,常常會用到類似底下的語法 SELECT 'name', 'id' FROM 'mytable' WHERE name = 'myname' SELECT 'name', 'id' FROM 'mytable' WHERE id BETWEEN 10 AND 20 這邊牽涉到文字的比對和數字的比對 ELK在數字的比對,與SQL的思維很像,只是語法不同 但ELK在文字的比對有一些眉角在,需要先知道ELK怎麼處理文字,才能知道怎麼下條件 先從簡單的數字和日期比對開始 PS : 從這篇開始不會提到URL的部分,如想了解URL格式可 參考此文章 數字的比對 GET myindex/_search {   "query": {     "range": {       "欄位": {         "gte": "12",         "lt": "15"       }     }   } } 時間的比對 如果目標欄位的類型是 date,可以直接進行時間的搜索 GET myindex/_search {   "query": {     "range": {       "timestamp": {         "gt": "2020-03-02",         "le": "now-2h"       }     }   } } range 搜索一個範圍內的東西,包括數字、時間和文字 不建議使用range的方式搜索文字,elasticsearch實際上還是會對個別的可能性進行term搜索 gt 大於,不等於 gte 大於,等於 lt 小於,不等於 lte 小於,等於 日期運算方法有兩種 日期的加減 日期 + 時間 或 日期 - 時間 2

ELK查詢指令-index過濾

前言 ELK使用HTTP的POST方法送出查詢指令,使用URL位置作為查詢範圍,JSON格式內容作為過濾指令 測試的方法可以用Kibana的工具或postman,也可自己用程式撰寫或用curl 例如: http://127.0.0.1:9200/myindex/_search {   query: {     match_all: {}   } } curl指令為: curl -X POST http://127.0.0.1:9200/myindex/_search -d '{ query: { match_all: {} } }' 上面的範例會把myindex的全部資料搜索出來 這篇先簡單較介紹使用URL過濾index的方法 搜索的URL格式 URL的格式如下 http:// IP : Port / index名稱 / type /_search?額外的參數 IP 在elasticsearch的設定檔中 network.host 所設定的IP,也就是elasticsearch的服務IP Port elasticsearch設定檔的 http.port ,預設是9200 index名稱 就是index名稱,可以忽略不寫,代表全部index type 筆者沒用過type進行搜索,ELK 7 以後取消了type這個東西,可以省略不寫,代表全部的type 額外的參數: 有很多參數可以用,像是可以搜索已經close的index 詳細的參數可以看官方說明: 官方說明 PS : 底下的範例都沒有使用type,也就是全部的type都在搜索範圍 index過濾法 搜索單個index 如: http://127.0.0.1:9200/myindex/_search 指定多個index搜索 使用 , 符號分隔多個index 如: http://127.0.0.1:9200/myindex,goodindex,badindex/_search 搜索相同前綴的index 可以在URL的地方使用 * 符號(又稱為wildcard) 如: myindex-*,可以代表 myindex-20200203, myindex-20200204..... http