是什么
准确来说,ES中的查询操作分为2种: 查询(query)和过滤(filter)
查询即是之前提到的query查询,它 (查询)默认会计算每个返回文档的得分,然后根据得分排序。而过滤(filter)只会筛选出符合的文档,并不计算 得分,且它可以缓存文档 。所以,单从性能考虑,过滤比查询更快。
换句话说,过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时, 应先使用过滤操作过滤数据, 然后使用查询匹配数据。
过滤语法
NOTE:
- 在执行filter和query时,先执行filter在执行query
- Elasticsearch会自动缓存经常使用的过滤器,以加快性能
- 使用过滤查询必须使用bool查询
GET /ems/emp/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"name": {
"value": "小五"
}
}
}
],
"filter": {
"range": {
"age": {
"gte": 1,
"lte": 10
}
}
}
}
}
}
执行过程: 先从ES从执行过滤查询,找到符合年龄范围在[1,10]的文档,这个过程不会计算得分,然后再执行查询操作,从满足条件的这些文档中又去查找"name"属性的值为"小五"的文档,并将可能的文档计算的得分。
常见的过滤器类型
term Filter
term 用在过滤中查询,表示查询指定字段含有该词的文档
GET /ems/emp/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"name": {
"value": "小五"
}
}
}
],
"filter": {
"term": {
"content": "spring"
}
}
}
}
}
terms Filter
term只能匹配一个字段,要想过滤多个字段,使用terms
GET /ems/emp/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"name": {
"value": "小五"
}
}
}
],
"filter": {
"terms": {
"content": ["spring","java"]
}
}
}
}
}
range Filter
顾名思义:就是先查找满足某个指定范围的字段
GET /ems/emp/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"name": {
"value": "小五"
}
}
}
],
"filter": {
"range": {
"age": {
"gte": 1,
"lte": 10
}
}
}
}
}
}
exists Filter
先过滤掉不存在指定字段的文档
GET /ems/emp/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": {
"exists": {
"field": "age"
}
}
}
}
}
ids Filter
查找含有指定字段的索引记录
GET /ems/emp/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": {
"ids": {
"values": [
"1","OY0TqnYB5vZ1Et4zupDf"
]
}
}
}
}
}