filter和query示例

PUT /employee/_doc/1{  "address": {    "country": "china",    "province": "jiangsu",    "city": "nanjing"  },  "name": "tom",  "age": 30,  "join_date": "2016-01-01"}PUT /employee/_doc/2{  "address": {    "country": "china",    "province": "shanxi",    "city": "xian"  },  "name": "marry",  "age": 35,  "join_date": "2015-01-01"}

搜索请求:年龄必须大于等于30,同时join_date必须是2016-01-01

GET /employee/_search{  "query": {    "bool": {      "must": [        {          "match": {            "join_date": "2016-01-01"          }        }      ],      "filter": {        "range": {          "age": {            "gte": 30          }        }      }    }  }}{  "took" : 141,  "timed_out" : false,  "_shards" : {    "total" : 1,    "successful" : 1,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : {      "value" : 1,      "relation" : "eq"    },    "max_score" : 1.0,    "hits" : [      {        "_index" : "employee",        "_type" : "_doc",        "_id" : "1",        "_score" : 1.0,        "_source" : {          "address" : {            "country" : "china",            "province" : "jiangsu",            "city" : "nanjing"          },          "name" : "tom",          "age" : 30,          "join_date" : "2016-01-01"        }      }    ]  }}

filter与query对比大揭秘

filter:仅仅只是按照搜索条件过滤出需要的数据而已,比计算任何相关度分数,对相关度没有任何影响

query: 会计算每个document相对于搜索条件的相关度,并按照相关度进行排序

一般来说,如果是在进行搜索,需要将最匹配搜索条件的数据先返回,那么用query。如果只是要根据一些条件筛选出一部分数据,不关注其排序,那么用filter。

filter与query性能对比

filter: 不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的自动缓存cache,会缓存住最常使用的filter数据

query: 需要计算相关度分数,并按照相关度分数进行排序,无法缓存结果