工作中遇到ES的查询问题,由于业务方给的条件不清晰,有些查询无法实现,需要用到DSL语法查询实现,很久没用生疏了,借此机会复习下。
Elasticsearch(简称为ES),一个开源的分布式搜索和分析引擎,主要用于处理大量数据并提供快速、实时的搜索功能。
DSL(Domain Specific Language),一种特定领域的查询语言,用于构建复杂的查询和聚合操作。
在Elasticsearch中,可用DSL语法来定义查询和过滤条件,以及执行聚合操作。
DSL语法具有JSON格式****(敲重点,要考),因此它非常易于阅读和编写。
用于指定搜索条件,并返回与之匹配的文档结果集。以下是一些常见的查询类型:
用于筛选满足指定条件的文档结果集。过滤器通常用于在查询结果上应用额外的限制。以下是一些常见的过滤器类型:
用于对文档结果集进行分组和统计操作,从而生成各种汇总数据。聚合可以计算平均值、总和、最大值、最小值等。以下是一些常见的聚合类型:
我用的ES版本为7.1.0,以下所有示例均基于这个版本,不同版本在写法上略有差异,使用时要注意喔。
GET /index/_search
{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}
GET /index/_search
{
"query": {
"multi_match": {
"query": "Elasticsearch",
"fields": ["title", "content"]
}
}
}
GET /index/_search
{
"query": {
"range": {
"price": {
"gte": 50,
"lte": 100
}
}
}
}
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } },
{ "range": { "price": { "gte": 50 } } }
]
}
}
}
GET /index/_search
{
"aggs": {
"total_sales": {
"sum": { "field": "sales" }
}
}
}
GET /index/_search
{
"sort": [
{ "timestamp": { "order": "desc" } }
]
}
GET /index/_search
{
"from": 0,
"size": 10,
"query": {
"match_all": {}
}
}
因为大部分日常使用,都是组合查询,所以在此也罗列一些组合查询的示例。
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } },
{ "match": { "content": "数据分析" } }
]
}
}
}
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"should": [
{ "range": { "price": { "gte": 50 } } },
{ "range": { "rating": { "gt": 4 } } }
]
}
}
}
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"must_not": [
{ "match": { "title": "教程" } }
]
}
}
}
GET /index/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Elasticsearch" } },
{ "match": { "content": "数据分析" } },
{ "match": { "author": "John" } }
]
}
}
}
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"should": [
{ "range": { "price": { "gte": 50 } } },
{ "range": { "rating": { "gt": 4 } } }
],
"minimum_should_match": 1,
"filter": [
{ "match": { "content": "搜索引擎" } },
{ "terms": { "tags": ["技术"] } }
]
}
}
}
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } },
{
"bool": {
"should": [
{ "range": { "price": { "gte": 50 } } },
{ "range": { "rating": { "gt": 4 } } }
]
}
}
]
}
}
}
对技术的态度还是那句话:只有不断学习才能不断进步,在此也推荐一些关于ES+DSL的主题文章,可以参考学习:
- “Getting Started with Elasticsearch: A Complete Guide” by Elastic:这篇文章是Elastic官方提供的入门指南,涵盖了Elasticsearch的基本概念、安装和配置,以及常见的用例和查询示例。
- “Introduction to Domain-Specific Languages” by Martin Fowler:这是Martin Fowler撰写的一篇关于领域特定语言的介绍性文章。它解释了什么是DSL,为什么使用DSL以及如何设计和实现DSL。
- “Creating Domain-Specific Languages with Xtext” by Lars Vogel:这篇文章介绍了使用Xtext开发领域特定语言的方法。它探讨了Xtext的基本概念、工作流程和示例,帮助您开始构建自己的DSL。
- “Building Domain-Specific Languages in Python” by Andrew Dalke:这篇文章介绍了在Python中构建领域特定语言的方法。它包含了一些库和工具的示例,可以帮助您在Python项目中实现自定义DSL。
以上是梳理总结的一些关于ES+DSL 查询语法学习的内容,希望能帮到大家, 如有错误,欢迎指正。
原创不易,转载请注意出处:
https://blog.csdn.net/weixin_41613094/article/details/131578855