1. 程式人生 > >ES 5.x中在精準搜尋時的過濾方式

ES 5.x中在精準搜尋時的過濾方式

之前一直有個問題沒解決,比如希望通過kibana的Discover裡的filter去過濾某個域名,request為"/"的請求,需求是精確匹配:

那麼在Dev Tools裡對應的查詢應該和下面類似:

GET index-example/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"http_host": "test.xxx.com"}},
        {"match": {"request": "/"}}
      ]
    }
  }
}

搜尋出來的日誌中是不符合需求的,所有request裡包含"/"這個字元的請求都被檢索到了。

後來瞭解到2.x版本中的string型別在5.x分為text(預設型別)和keyword。text類似2.x中的analyzed,是要被分詞的,整個字串根據一定規則分解成一個個小寫的term,而keyword類似2.x中not_analyzed的情況。

如果你希望檢索"good"的時候,可以檢索到"this is a good idea",那麼使用預設方式即可。

如果你希望檢索"good"的時候,只檢索到"good",那麼應該使用keyword的方式。

例如上述查詢語句,我們可以如此修改

GET index-example/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"http_host.keyword": "test.xxx.com"}},
        {"match": {"request.keyword": "/"}}
      ]
    }
  }
}