Elasticsearch(6):文档查询
- 2020 年 11 月 16 日
- 筆記
- elasticsearch
为方便后续查询演示,我们先创建一个索引。创建索引请求如下:
插入一下数据:
可以按照如下方式插入数据:
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
字段可以设置只显示部分字段(本篇后续所有查询都可以通过这一方式设置显示哪些字段):
可以进一步传递from
和size
参数设置显示哪一步分数据,实现类似于分页的功能,日中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
Related Posts
- 2019 年 10 月 29 日
Zynq-7000 ARM端MIO的使用
Zynq-7000 ARM端MIO的使用 作者:OpenSLee 1 背景知识 Xilinx Zynq-7000 芯片的 &helli ..
- 2019 年 10 月 6 日
HTTP 502: Whoops, GitLab is taking too much time to respond.
HTTP 502: Whoops, GitLab is taking too much time to respond. … ..