关于 Elasticsearch json dsl 查询结构的困惑
Confusions about the Elasticsearch json dsl query structure
在 elasticsearch dsl 查询语法文档的许多地方,包装 json 查询在解释中被跳过可能是为了减少文档大小。但是当我一直在浏览文档时,它一直很混乱。 在 json 查询中可以或应该去哪里的正式规则是什么? 换句话说,我正在尝试找到标准或模式在所有弹性查询中都很常见,因为我需要构建一个内部 api 来查询弹性。 是否有一个模板包含 "bool":{}
内的所有语法组件 "query': {}
或a filter
等,我可以在其中填写相关部分并且它仍然运行?
我也发现 Elastic 的 DSL 结构令人困惑,但是在 运行查询了数百次之后你就习惯了。
这里有几个(完整的)不同类型查询的示例,希望这能帮助您解决一些问题,欢迎在评论中添加场景,我会添加更多示例。
这是标准查询的样子:
{
"query": {
"bool": {
"must": {
"match": {
"message": "abcd"
}
}
}
}
}
但是,这是过滤查询的样子,您会注意到在过滤 elasticsearch 时结构发生了变化:
{
"query": {
"filtered": {
"filter": {
"term": {
"message": "abcd"
}
}
}
}
}
(Read more about the difference between Filters and Queries)
下面是同时具有过滤器和查询的查询的样子:
{
"query": {
"filtered": {
"filter": {
"term": {
"message": "abcd"
}
},
"query": {
"bool": {
"must": {
"match": {
"message2": "bbbb"
}
}
}
}
}
}
}
这是 运行 具有多个条件的过滤器的方法:
{
"query": {
"filtered": {
"filter": {
"and": [
{
"term": {
"message": "abcd"
}
},
{
"term": {
"message2": "abcdd"
}
}
]
}
}
}
}
还有一个更复杂的过滤器:
{
"query": {
"filtered": {
"filter": {
"and": [
{
"term": {
"message": "abcd"
}
},
{
"term": {
"message2": "abcdd"
}
},
{
"or": [
{
"term": {
"message3": "abcddx"
}
},
{
"term": {
"message4": "abcdd2"
}
}
]
}
]
}
}
}
}
带聚合的简单查询:
{
"query": {
"filtered": {
"filter": {
"term": {
"message": "abcd"
}
}
}
},
"aggs": {
"any_name_will_work_here": {
"max": {
"field": "metric1"
}
}
}
}
一个query_string
查询:
{
"query": {
"query_string": {
"default_field": "message",
"query": "this AND that"
}
}
}
使用 DSL 时需要考虑的一些其他事项:
- 您可以在顶层(查询上方)添加一个
size
参数,这将决定 return 的结果数量。如果你想要的只是文档计数,你可以使用 "size": 0
这不会得到任何结果,只有元数据。
- 然而,当使用
aggs
时,大小参数有一个扭曲,在 aggs
字段内设置 "size": 0
将告诉 ES 获得 ALL聚合桶
- DSL 结构有例外,在我的例子中我通常使用
terms
,但是 range
例如有一点不同的结构。
在 elasticsearch dsl 查询语法文档的许多地方,包装 json 查询在解释中被跳过可能是为了减少文档大小。但是当我一直在浏览文档时,它一直很混乱。 在 json 查询中可以或应该去哪里的正式规则是什么? 换句话说,我正在尝试找到标准或模式在所有弹性查询中都很常见,因为我需要构建一个内部 api 来查询弹性。 是否有一个模板包含 "bool":{}
内的所有语法组件 "query': {}
或a filter
等,我可以在其中填写相关部分并且它仍然运行?
我也发现 Elastic 的 DSL 结构令人困惑,但是在 运行查询了数百次之后你就习惯了。
这里有几个(完整的)不同类型查询的示例,希望这能帮助您解决一些问题,欢迎在评论中添加场景,我会添加更多示例。
这是标准查询的样子:
{
"query": {
"bool": {
"must": {
"match": {
"message": "abcd"
}
}
}
}
}
但是,这是过滤查询的样子,您会注意到在过滤 elasticsearch 时结构发生了变化:
{
"query": {
"filtered": {
"filter": {
"term": {
"message": "abcd"
}
}
}
}
}
(Read more about the difference between Filters and Queries)
下面是同时具有过滤器和查询的查询的样子:
{
"query": {
"filtered": {
"filter": {
"term": {
"message": "abcd"
}
},
"query": {
"bool": {
"must": {
"match": {
"message2": "bbbb"
}
}
}
}
}
}
}
这是 运行 具有多个条件的过滤器的方法:
{
"query": {
"filtered": {
"filter": {
"and": [
{
"term": {
"message": "abcd"
}
},
{
"term": {
"message2": "abcdd"
}
}
]
}
}
}
}
还有一个更复杂的过滤器:
{
"query": {
"filtered": {
"filter": {
"and": [
{
"term": {
"message": "abcd"
}
},
{
"term": {
"message2": "abcdd"
}
},
{
"or": [
{
"term": {
"message3": "abcddx"
}
},
{
"term": {
"message4": "abcdd2"
}
}
]
}
]
}
}
}
}
带聚合的简单查询:
{
"query": {
"filtered": {
"filter": {
"term": {
"message": "abcd"
}
}
}
},
"aggs": {
"any_name_will_work_here": {
"max": {
"field": "metric1"
}
}
}
}
一个query_string
查询:
{
"query": {
"query_string": {
"default_field": "message",
"query": "this AND that"
}
}
}
使用 DSL 时需要考虑的一些其他事项:
- 您可以在顶层(查询上方)添加一个
size
参数,这将决定 return 的结果数量。如果你想要的只是文档计数,你可以使用"size": 0
这不会得到任何结果,只有元数据。 - 然而,当使用
aggs
时,大小参数有一个扭曲,在aggs
字段内设置"size": 0
将告诉 ES 获得 ALL聚合桶 - DSL 结构有例外,在我的例子中我通常使用
terms
,但是range
例如有一点不同的结构。