es相关查询API

Query和Filter
ES为用户提供两类查询API,一类是在查询阶段就进行条件过滤的query查询,另一类是在query查询出来的数据基础上再进行过滤的filter查询。这两类查询的区别是:

Query查询
下面的情况下适合使用query查询:

需要进行全文搜索。
查询结果依赖于相关性,即需要计算查询串和数据的相关性。
(1)Match All Query   匹配所有,默认返回10条

查询所有的数据,相当于不带条件查询。下面的代码是一个典型的match_all查询的调用方式。

POST请求 "127.0.0.1:9200/index_name/type_name/_search

{
  "query": {
    "match_all": {}
  }
}

查询结果如下。其他所有的查询都是返回这种格式的数据。

{
  "took": 156,                  // 查询耗时(毫秒)
  "timed_out": false,           // 是否超时
  "_shards": {
    "total": 5,                 // 总共查询的分片数
    "successful": 5,            // 查询成功的分片数
    "failed": 0                 // 查询失败的分片数
  },
  "hits": {
    "total": 8,                 // 本次查询的记录数
    "max_score": 1,             // 查询所有数据中的最大score
    "hits": [                   // 数据列表
      {
        "_index": "student",    // 数据所属的索引名
        "_type": "student",     // 数据所属的type
        "_id": "4",             // 数据的id值
        "_score": 1,            // 该记录的score
        "_source": {            // ES将原始数据保存到_source字段中
          "id": "4",
          "name": "张飞",
          "male": "男",
          "age": "20",
          "birthday": "1999-05-11"
        }
      },
      {
         ……                     // 其他的数据格式相同,就不列出来了
      }
    ]
  }
}

查询时,你会发现无论数据量有多大,每次最多只能查到10条数据。这是因为ES服务端默认对查询结果做了分页处理,每页默认的大小为10。如果想自己指定查询的数据,可使用from和size字段,并且按指定的字段排序。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "query": {
    "match_all": {}
  },
  "from": 2,        // 从2条记录开始取
  "size": 4,        // 取4条数据
  "sort": {
    "id": {  // 按id字段升序
      "order": "asc"// 降序为desc
    }
  } 
}

注意:不要把from设得过大(超过10000),否则会导致ES服务端因频繁GC而无法正常提供服务。其实实际项目中也没有谁会翻那么多页,但是为了ES的可用性,务必要对分页查询的页码做一定的限制。

(2)term query   单字段条件完全匹配

词语查询,如果是对未分词的字段进行查询,则表示精确查询。查找id为10的数据

POST请求 "127.0.0.1:9200/index_name/type_name/_search

{
  "query": {
    "term": {
      "id": "10"
    }
  }
}

(3)Bool Query  多字段组合条件匹配

Bool(布尔)查询是一种复合型查询,它可以结合多个其他的查询条件。主要有3类逻辑查询:

must:查询结果必须符合该查询条件(列表)。
should:类似于in的查询条件。如果bool查询中不包含must查询,那么should默认表示必须符合查询列表中的一个或多个查询条件。
must_not:查询结果必须不符合查询条件(列表)。
查询学号为5,name为张飞的数据。

POST请求 "127.0.0.1:9200/index_name/type_name/_search 
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "name": "张飞"
          }
        },
        {
          "term": {
            "id": "5"
          }
        }
      ]
    }
  }
}

(4)Ids Query    id查询

id字段查询。查询数据id值为1和2的数据。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "query": {
    "ids": {
      "type": "Integer",
      "values": [
        "1",
        "2"
      ]
    }
  }
}

(5)Prefix Query  前缀匹配

前缀查询。查找姓【刘】的数据。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "query": {
    "prefix": {
      "name": "刘"
    }
  }
}

(6)Range Query  范围查询

范围查询,针对date和number类型的数据。查找年龄到10~15岁的记录。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "query": {
    "range": {
      "age": {
        "gte": "10",     // 表示>=
        "lte": "15"      // 表示<=
      }
    }
  }
}

实际上,对于date类型的数据,ES中以其时间戳(长整形)的形式存放的。

(7)Terms Query  单字段多条件选择匹配

多词语查询,查找符合词语列表的数据。如果要查询的字段索引为not_analyzed类型,则terms查询非常类似于关系型数据库中的in查询。下面查找id为5,8的数据。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "query": {
    "terms": {
      "id": [
        "5",
        "8"
      ]
    }
  }
}

(8)Wildcard Query   通配符查询

通配符查询,是简化的正则表达式查询,包括下面两类通配符:

* 代表任意(包括0个)多个字符
? 代表任意一个字符
查找名字的最后一个字是“亮”的同学,查询结果是学号为5的诸葛亮。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "query": {
    "wildcard": {
      "name": "*亮"
    }
  }
}

(9)Regexp Query同学  正则表达式查询

正则表达式查询,这是最灵活的字符串类型字段查询方式。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "query": {
    "regexp": {
      "name": ".*丰.*"  // 这里的.号表示任意一个字符
    }
  }
}

Filter查询(过滤查询)
下面的情况下适合使用filter查询:

yes/no的二元查询,针对精确值进行查询,filter和query的查询方式有不少是重叠的。

(1)Term Filter  单字段过滤条件

词语查询,如果是对未分词的字段进行查询,则表示精确查询。查找名为“丰亮”的数据。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "filter": {               
    "term": {
      "name": "丰亮",
      "_cache" : true // 与query主要是这里的区别,可以设置数据缓存
    }
  }
}

filter查询方式都可以通过设置_cache为true来缓存数据。如果下一次恰好以相同的查询条件进行查询并且该缓存没有过期,就可以直接从缓存中读取数据,这样就大大加快的查询速度。

(2)Bool Filter 组合字段过滤条件

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "filter": {
    "bool": {
      "must": [
        {
          "term": {
            "age": 20
          }
        },
        {
          "term": {
            "male": "男"
          }
        }
      ]
    }
  }
}

(3)And Filter  &&过滤条件关系

And逻辑连接查询,连接1个或1个以上查询条件。它与bool查询中的must查询非常相似。实际上,and查询可以转化为对应的bool查询。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "filter": {
      "and": [
        {
          "term": {
            "male": "女"
          }
        },
        {
          "term": {
            "age": 16
          }
        }
      ]
  }
}

(4)Or Filter  ||过滤条件关系

Or连接查询,表示逻辑或。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "filter": {
      "or": [
        {
          "term": {
            "male": "女"
          }
        },
        {
          "term": {
            "age": 16
          }
        }
      ]
  }
}

(5)Exists Filter  字段存在过滤校验

存在查询,查询指定字段至少包含一个非null值的数据。如果字段索引为not_analyzed类型,则查询sql中的is not null查询方式。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "filter": {
    "exists": {
      "field": "male"
    }
  }
}

(6)Missing Filter  字段内容缺失过滤校验

缺失值查询,与Exists查询正好相反。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "filter": {
    "missing": {
      "field": "male"
    }
  }
}

(7)Prefix Filter  前缀过滤

前缀查询。查找姓【赵】的同学。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "filter": {
    "prefix": {
      "name": "赵"
    }
  }
}

(8)Range Filter  范围匹配过滤

范围查询,针对date和number类型的数据。查找年龄到18~20岁的同学。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "filter": {
    "range": {
      "age": {
        "gte": "18",
        "lte": "20"
      }
    }
  }
}

(9)Terms Filter  某字段in过滤

多词语查询,查找符合词语列表的数据。如果要查询的字段索引为not_analyzed类型,则terms查询非常类似于关系型数据库中的in查询。

POST请求 "127.0.0.1:9200/index_name/type_name/_search
{
  "filter": {
    "terms": {
      "id": [
        "1",
        "3"
      ]
    }
  }
}


汇总:
本文介绍了ES中的部分查询API,这些API是一些常用的简单API,如果需要使用更加复杂一点的API,请查阅官网文档。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值