前言
在正式开始讲ES的查询语句之前,想先说一些有用的参数。这些参数并不是查询的核心,但是可以让查询结果更加符合用户需要。
这里讲的参数打都既可以放到url中作为url参数,也可以在发送post请求的时候作为post请求的请求体的一部分。
通用选项
1.格式化输出
格式化输出指让es的返回结果更具有可读性。主要有两个pretty=true
和v
-
http://{{ _.es_url }}/_cat/indices?v
在url参数添加一个v字母可以让输出结果带有表头。比如上一节在讲es元信息查询的时候,可以看到一般都有带v字母参数,就是为了让返回结果有表头 -
http://{{ _.es_url }}/zhy-detect-2021*/_search?pretty=true
。pretty参数是为了让返回的json字符串能更加可读。
2. 展平配置信息
flat_settings=true
参数可以让配置信息展平,而不是一层套一层的json对象。这个参数也只有对配置信息有用,对普通返回结果没有用。
如,查询配置api:http://{{ _.es_url }}/test-20201127/_settings?flat_settings=true
返回结果如下:
{
"test-20201127": {
"settings": {
"index.codec": "best_compression",
"index.creation_date": "1606406411188",
"index.lifecycle.name": "test-dd",
"index.mapping.total_fields.limit": "10000",
"index.merge.policy.max_merged_segment": "128m",
"index.number_of_replicas": "1",
"index.number_of_shards": "2",
"index.priority": "0",
"index.provided_name": "test-20201127",
"index.refresh_interval": "1h",
"index.routing.allocation.total_shards_per_node": "2",
"index.translog.flush_threshold_size": "1g",
"index.uuid": "lgc28_OzT6qiJjDp9r5KNA",
"index.version.created": "7090399"
}
}
}
3.返回信息过滤
在进行es查询的时候会返回很多信息,如果用惯了SQL,会发现ES咋返回这么多无用的数据呢,如果觉得有些数据无用,可以将其过滤掉,使用filter_path
字段,如http://{{ _.es_url }}/test-20201220/_search?filter_path=-**.blob,-**.blob1
使用该字段过滤的时候需要注意以下细节:
- 他的过滤是可以有层级的。比如如果只要返回hits字段,可以写filter_path=hits,如果需要返回hits字段中的hits,可以写filter_path=hits.hits,即通过点(.)的方式指定返回层级。
- 如果hits返回的是一个数组,数组中每个元素还有_source字段,还可以指定filter_path=hits.hits._source。这样返回的数组的对象只包含_source字段。
- 如果指定的过滤字段不存在不会报错,而是返回一个空对象(这很容易理解)
- 如果需要指定过滤多个字段,多个字段直接用逗号(,)分割,就像:filter_path=hits.hits,took还可以通过通配符匹配字段,比如要匹配hits字段下任意字段下的_source字段,可以使用<filter_path=hits.*._source>来匹配
- 如果是两个*,即**,可以匹配任意深度的路径,比如还是要查询_source字段,但是这次不知道他的具体父路径,可以使用<filter_path=**._source>来匹配
- 上面说的所有情况都是过滤要留下的字段,而不是排除的字段。如果要排除字段,上面所有规则依然生效,只是在要排除的字段前面加一个减号(-),比如要排除任意深度下的_source子字段只需要写<filter_path=-**._source>即可,注意,前面是有减号的,没有减号表示只保留这个字段。