Elasticsearch(6):文档查询

为方便后续查询演示,我们先创建一个索引。创建索引请求如下:

插入一下数据:

可以按照如下方式插入数据:

1 基础查询

ES中提供以下四种最基本的方式进行文档检索操作:

GET <index>/_doc/<_id>

HEAD <index>/_doc/<_id>

GET <index>/_source/<_id>

HEAD <index>/_source/<_id>

其中GET请求方式获取所有详细信息,包括我们存储在ES中的字段数据和文档的元数据;HEAD方式用于查询文档是否存在。路由中_doc表示默认返回所有信息,_source表示只返回字段数据。

通过GET方法获取文档所有数据信息:

如果不想查询_source部分内容,那么,可以传递参数_source=false

只查询_source中的内容:

可以通过_source_includes来设置查询显示哪些字段,如下所示只显示user.name和user.age两个字段:

也可以通过_source_exclude来设置不显示哪些字段,如下所示,将user.id字段过滤排除:

通过HEAD查看文档是否存在:

当返回状态码为200时,表示文档存在,返回状态码为404时,表示文档不存在。当使用HEAD /poet/_source/1时表示查询_id为1的文档是否存在_source

2 进阶查询

在基础查询中,使用的是_id这个唯一标识进行数据筛选,但这远远满足不了实际应用需要,所以,ES中提供了search API进行更丰富功能的文档检索操作。search API的释放方式如下:

GET /索引库名/_search
{
  "query": {
    "查询类型": {
      "查询条件": "查询条件值"
    }
  }
}

查询类型包括match_all,match,term,range,fuzzy,bool 等等,而查询条件会根据类型的不同,写法也有差异。

2.1 查询所有(match_all)

如下所示,查询出索引poet中所有的文档(截图并未显示全部):

通过_source字段可以设置只显示部分字段(本篇后续所有查询都可以通过这一方式设置显示哪些字段):

可以进一步传递fromsize参数设置显示哪一步分数据,实现类似于分页的功能,日中from表示从第几个文档开始显示(注意,下标开始于0,from为0时表示从第一个文档开始显示),size表示共显示多少个文档。

2.2 匹配查询(match)

使用match关键字进行匹配查询,如果所匹配的字段是text类型,那么,那么,ES会对查询字符串进行分成多个词条,如果查询时设置operator值为or表示多个词条是“或”的关系,如果operator值为and,那么多个词条间就必须是“且”的关系。

如果所匹配的字段是keyword类型,那么,operator关键字将失去意义,无论是否设置,或者设置成or或者and都将进行精确匹配。当然,一般来说,不建议使用match来对keyword类型字段进行查询,match是针对text类型字段而设计的。下面要说的词条查询才是对keyword等类型字段查询设计的。

2.3 词条查询(term、terms)

词条查询是专用于精确匹配的一种查询,一般用于keyword等字符串型或者数值型字段的精确匹配,注意,官方提醒,不要将词条匹配用于text类型的字段查询中。

(1) 单词条查询:term

(2) 多词条查询:terms

2.3 范围查询(range)

范围查询是指对数值型、日期等类型字段是否在或不在某个范围内进行查询,用于范围判断的标识包含以下几个:

  • gt: 大于

  • gte: 大于等于

  • lt:小于

  • lte:小于等于

举例来说,查询字段“die_age”大于等于60小于等于70的所有文档:

3 布尔查询(多条件符合查询)

上述介绍的查询方法只能进行一条语句(一个条件)情况下的查询,ES中提供而布尔查询机制,可进行多条件下过滤查询。布尔查询需要结合以下几个条件子句类使用:

  • must:必须满足的条件(类似于SQL中的and)

  • should:可以满足也可以不满足的条件(类似于SQL中的or)

  • must_not:不需要满足的条件(类似于SQL中的not)

进一步的,可以在上述三个查询子句的基础上,配合filter子句对结果进一步过滤。filter子句的有点在于不对结果相关度进行评分,提高查询性能。

例1:名字里有李或者杜,不能是浪漫主义诗人

例2:名字里有李或者杜,不能是浪漫主义诗人,且性别是女,享年大于60

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值