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、地址、主機名稱、序號等,整串文字放在一起才有意義
也可以把數字變成 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."
    }
  }
}




留言

此網誌的熱門文章

WPA_supplicant的設定方式

DOS指令 -- SET和變數

Nginx server 和 location 優先順序