ELK查詢指令-類似where的搜索條件-文字搜索-前處理
前言
ELK對文字的處理方式分成兩種
可藉由改變欄位的類型讓ELK跳過文字分析的動作,這會改變搜索的方法
而預設中文分析後,全部沒有空白的中文字會是一個 token
第一種,使用分析器分析
ELK對文字(Text類型)會進行底下的動作,做完後塞到elasticsearch資料庫內
會進行這些動作是為了全文搜索,這也是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、地址、主機名稱、序號等,整串文字放在一起才有意義
也可以把數字變成 keyword,但就不能用 range 方式搜索
Keyword類別在搜索上,比Text還要快
以上面的輸入當作例子
設定欄位類別
PUT myindex
{
"mappings": {
"properties": {
"message": {
"type": "keyword"
}
}
}
}
匯入資料
POST myindex/_doc
{
"message": "He is your friend, trust me."
}
elasticsearch會原封不動的把這串字塞到資料庫
要搜索時,必須要打出完整的字,大小寫、空白和符號要一模一樣才能匹配到
GET myindex/_search
{
"query": {
"match": {
"message": "He is your friend, trust me."
}
}
}
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、地址、主機名稱、序號等,整串文字放在一起才有意義
也可以把數字變成 keyword,但就不能用 range 方式搜索
Keyword類別在搜索上,比Text還要快
以上面的輸入當作例子
設定欄位類別
PUT myindex
{
"mappings": {
"properties": {
"message": {
"type": "keyword"
}
}
}
}
匯入資料
POST myindex/_doc
{
"message": "He is your friend, trust me."
}
elasticsearch會原封不動的把這串字塞到資料庫
要搜索時,必須要打出完整的字,大小寫、空白和符號要一模一樣才能匹配到
GET myindex/_search
{
"query": {
"match": {
"message": "He is your friend, trust me."
}
}
}
留言
發佈留言