巧记Elasticsearch常用DSL语法

简介: 记知识先记轮廓,关于DSL语法的轮廓,记住以下3句话即可:1.索引、文档和查询。2.Match、Term和Bool。3.还有翻页和聚合

记知识先记轮廓,关于DSL语法的轮廓,记住以下3句话即可:

  1. 索引、文档和查询
  2. Match、Term和Bool
  3. 还有翻页和聚合

1、又爱又恨的DSL

使用Elasticsearch时,我们一般是调用RestClient API的方式读取和写入集群数据。有时也会使用工具查阅和操作数据,比如:使用Chrome插件Multi Elasticsearch Head或者CerebroKibana。笔者建议使用Kibana的方式操作集群数据,使用Multi Elasticsearch Head或者Cerebro从整体上观察集群。

既然是操作集群数据,那就绕不开ES的DSL语法 — 一个让人又爱又恨的语法。

  • 爱:Http Restful风格设计的,使用上简单,随手撸起一个工具都支持Http访问。
  • 恨:语法太难记,语法格式在设计上有点反人类,真不知道设计者们是怎么想的。不过你觉得有更好的方案吗?

本文整理了一些常用DSL语法,方便记忆,分了如下几类:操作索引操作文档Match查询Term查询查看分词。如果碰到复杂查询还是建议查阅官网。

2、操作数据

在Kibana上操作ES数据的方式如下:

2.1、操作索引

创建索引

PUT /goods
{
  "mappings": {
    "properties": {
      "brandName": {
        "type": "keyword"
      },
      "categoryName": {
        "type": "keyword"
      },
      "createTime": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      },
      "id": {
        "type": "keyword"
      },
      "price": {
        "type": "double"
      },
      "saleNum": {
        "type": "integer"
      },
      "status": {
        "type": "integer"
      },
      "stock": {
        "type": "integer"
      },
      "title": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      }
    }
  },
  # 根据情况选择是否要修改
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 2
  }
}

删除索引

DELETE goods

重建索引

有些场景下需要重建索引,比如修改了Mapping,重建步骤如下:

POST _reindex                    
{
  "source": {
    "index": "goods"
  },
  "dest": {
    "index": "goods1"
  }
}

DELETE goods

POST _reindex                    
{
  "source": {
    "index": "goods1"
  },
  "dest": {
    "index": "goods"
  }
}

DELETE goods1

2.2、操作文档

创建文档

# 这种方式,同样的id无法重新创建
PUT goods/_create/1
{
  "id": 1,
  "brandName": "Apple",
  "categoryName": "手机",
  "createTime": "2023-10-22 19:12:56",
  "price": 8799,
  "saleNum": 599,
  "status": 0,
  "stock": 1000,
  "title": "Apple iPhone 15 Pro 512GB 远峰蓝色 支持移动联通电信5G 双卡双待手机"
}
# 这种方式,同样的id会覆盖原有的
PUT goods/_doc/2
{
  "id": 2,
  "brandName": "Apple",
  "categoryName": "手机",
  "createTime": "2023-10-22 19:12:56",
  "price": 8799,
  "saleNum": 599,
  "status": 0,
  "stock": 1000,
  "title": "Apple iPhone 15 Pro 256GB 远峰蓝色 支持移动联通电信5G 双卡双待手机"
}

更新文档

POST goods/_update/1
{
  "doc": {
    "title":"Apple iPhone 13 Pro (A2639) 256GB 远峰蓝色 支持移动联通电信5G 双卡双待手机111"
  }
}

删除文档

DELETE goods/_doc/2

获取文档

# 获取单个文档
GET goods/_doc/1

# 批量获取
GET books/_doc/_mget
{
  "ids": ["1","2"]
}

2.3、Match查询

Match查询会对查询内容做分词,然后根据倒排索引去匹配文档。Term查询对查询内容不做分词,直接去倒排索引里去匹配文档。

查询所有

POST goods/_search
{
  "query": {
    "match_all": {

    }
  }
}

match_phrase短语查询

POST goods/_search
{
  "query": {
    "match_phrase": {
      "title": "支持"
    }
  }
}

匹配查询

POST goods/_search
{
  "query": {
    "match": {
      "title": "移动多余"
    }
  }
}

模糊匹配查询

POST goods/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "*鞋"
      }
    }
  }
}

2.4、Term查询

Term查询对查询内容不做分词,直接去倒排索引里去匹配文档。

POST goods/_search
{
  "query": {
    "term": {
      "title": {
        "value": "手机"
      }
    }
  }
}

# 匹配多个term
POST goods/_search
{
  "query": {
    "terms": {
      "title": [
        "双卡",
        "待"
      ]
    }
  }
}

2.5、组合查询

复杂查询基本会用到bool关键字。

bool + must

# 布尔查询,可以组合多个过滤语句来过滤文档
POST goods/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "title": {
              "value": "Wolfgang Mauerer"
            }
          }
        },
        {
          "term": {
            "date": {
              "value": "2010-06-01"
            }
          }
        }
      ]
    }
  }
}

# 匹配多个字段
GET product/_search
{
  "query": {
    "bool": {
      "must": [
        { "match_phrase": { "name": "连衣裙" } },
        { "match_phrase": { "en_intro": "korean" } },
        { "match_phrase": { "intro": "御姐" } }
      ]
    }
  }
}

bool + filter + range

POST books/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "author": {
              "value": "Wolfgang Mauerer"
            }
          }
        }
      ],
      "filter": [
        {
          "term": {
            "date": {
              "value": "2010-06-01"
            }
          }
        }
      ]
    }
  }
}


POST goods/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "华为"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "price": {
              "gte": 5000,
              "lte": 10000
            }
          }
        }
      ]
    }
  }
}

2.6、翻页查询

Scroll分页

# 第一次使用 scroll API
POST goods/_search?scroll=2m
{
  "query": {
    "match_all": {}
  },
  "size": 2
}
# 进行翻页
POST /_search/scroll                                                    
{
  "scroll" : "2m",   
  "scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFkxBWkYwOGw2U1dPSF94aHZTelFkaWcAAAAAAAADHhZoU05ERFl3WFIycXM3M3JKMmRQVkJB" 
}

from + size分页

POST goods/_search
{
  "query": {
    "match_all": {

    }
  },
  "from": 6,
  "size": 2,
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ]
}

2.7、聚合查询

最大、最小、平均

POST goods/_search
{
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}


POST goods/_search
{
  "aggs": {
    "min_price": {
      "min": {
        "field": "price"
      }
    }
  }
}

POST goods/_search
{
  "aggs": {
    "max_price": {
      "max": {
        "field": "price"
      }
    }
  }
}

范围查询

POST goods/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

高亮查询

POST goods/_search
{
  "query": {
    "match": {
      "title": "跑鞋"
    }
  },
  "highlight": {
    "fields": {
      "body": {
        "pre_tags": [
          "<font color='red'>"
        ],
        "post_tags": [
          "</font>"
        ]
      },
      "title": {}
    }
  }
}

分组查询

POST goods/_search
{
  "aggs": {
    "brandNameName": {
      "terms": {
        "field": "brandName"
      }
    }
  }
}

子查询

POST goods/_search
{
  "aggs": {
    "brandNameName": {
      "terms": {
        "field": "brandName"
      },
      "aggs": {
        "avgPrice": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

2.8、分析分词

相对一些分析进行分析时,看看ES怎么拆分的,可以用这个查看。

POST _analyze
{
  "analyzer": "standard",
  "text": "Linus 在90年代开发出了linux操作系统"
}
POST _analyze
{  
    "analyzer": "ik_max_word",
    "text": "Linus 在90年代开发出了linux操作系统"  
}
POST _analyze
{  
    "analyzer": "ik_smart",
    "text": "Linus 在90年代开发出了linux操作系统"  
}
POST _analyze
{  
    "analyzer": "ik_smart",
    "text": "中华人民共和国国歌"  
}
POST _analyze
{  
    "analyzer": "ik_max_word",
    "text": "中华人民共和国国歌"  
}

3、总结

本文主要介绍了常见DSL的用法,主要是帮助记忆,避免一些基本的操作还要去查询文档的尴尬。记住以下3句话,即可记住DSL的轮廓了:

  1. 索引、文档和查询
  2. Match、Term和Bool
  3. 还有翻页和聚合

本篇完结!感谢你的阅读,欢迎点赞 关注 收藏 私信!!!

原文链接:http://www.mangod.top/articles/2023/10/28/1698494800959.htmlhttps://mp.weixin.qq.com/s/X2qjkkrN0moUVWlJHSXX8w

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
11月前
|
JSON 安全 数据可视化
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
5511 0
|
12月前
|
安全 Java Linux
Linux安装Elasticsearch详细教程
Linux安装Elasticsearch详细教程
2016 64
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
606 5
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
1409 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
JSON 自然语言处理 数据库
Elasticsearch从入门到项目部署 安装 分词器 索引库操作
这篇文章详细介绍了Elasticsearch的基本概念、倒排索引原理、安装部署、IK分词器的使用,以及如何在Elasticsearch中进行索引库的CRUD操作,旨在帮助读者从入门到项目部署全面掌握Elasticsearch的使用。
|
数据可视化 Docker 容器
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
这篇文章提供了通过Docker安装Elasticsearch和Kibana的详细过程和图解,包括下载镜像、创建和启动容器、处理可能遇到的启动失败情况(如权限不足和配置文件错误)、测试Elasticsearch和Kibana的连接,以及解决空间不足的问题。文章还特别指出了配置文件中空格的重要性以及环境变量中字母大小写的问题。
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
|
Ubuntu Oracle Java
如何在 Ubuntu VPS 上安装 Elasticsearch
如何在 Ubuntu VPS 上安装 Elasticsearch
295 0
|
存储 Ubuntu Oracle
在Ubuntu 14.04上安装和配置Elasticsearch的方法
在Ubuntu 14.04上安装和配置Elasticsearch的方法
268 0
|
存储 安全 Java
在CentOS 7上安装和配置Elasticsearch的方法
在CentOS 7上安装和配置Elasticsearch的方法
1300 0