ES 5.x中在精準搜尋時的過濾方式
阿新 • • 發佈:2019-01-07
之前一直有個問題沒解決,比如希望通過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": "/"}} ] } } }