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": "/"}}
      ]
    }
  }
}

 

你可能感兴趣的:(ES)