ElasticSearch核心语法使用-ES内功修炼第二篇

545 阅读4分钟

“这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

上一篇介绍了ElasticSearch核心基础语法入门篇,本节介绍ElasticSearch核心语法第二篇。

一、文档批量操作

1. 批量查询文档数据

通过_mget批量获取文档数据。

1.1 URL中不指定index和type

GET _mget
{
  "docs": [
    {
      "_index": "moe_db",
      "_type": "_doc",
      "_id": 1
    },
    {
      "_index": "moe_db",
      "_type": "_doc",
      "_id": 2
    }
  ]
}

查询结果如下:

image.png

1.2 URL中指定index

GET /moe_db/_mget
{
  "docs": [
    {
      "_type": "_doc",
      "_id": 1
    },
    {
      "_type": "_doc",
      "_id": 2
    }
  ]
}

1.3 URL中指定index和type

GET /moe_db/_doc/_mget
{
  "docs": [
    {
      "_id": 1
    },
    {
      "_id": 2
    }
  ]
}

2. 批量操作文档数据

通过_bulk实现批量操作文档操作

2.1 批量创建数据

关键命令:create

POST _bulk
{"create":{"_index":"article","_type":"_doc","_id":1}}
{"id":1,"title":"央媒评游戏产业","content":"2021年8月3日消息 今日央媒《经济参考报》发表文章《“精神鸦片”竟长成数千亿产业》指出,当前,未成年人网络沉迷现象普遍,网络游戏对未成年人的健康成长造成不可低估的影响。文章将网络游戏比作新型“毒品”,并点名批评了《王者荣耀》游戏。","tags":["网游","青少年"],"create_time":1628073182948}
{"create":{"_index":"article","_type":"_doc","_id":2}}
{"id":2,"title":"人民教育出版社紧急说明:是吴一凡!","content":"教材中使用的汉语拼音名字Wu Yifan,在配套教师用书中对应的中文名是“吴一凡”。该拼音名字从2001年教材第一版审定开始沿用至今,已经20年,与近些年才出现在公众视野的某涉案艺人无任何关联。","tags":["烦不烦","无不无聊"],"create_time":1628073182948}

结果如下:

image.png

2.2 批量修改数据

关键命令:update

POST _bulk
{"update":{"_index":"article","_type":"_doc","_id":1}}
{"doc":{"title":"在线教育怎么了?","content":"其中新东方、好未来、高途盘中跌幅均60%,截至发稿,仍跌超50%。值得注意的是,好未来一度出现临时停牌情况,停牌前股价报9.63美元/股,跌幅超53%。截至发稿,好未来已恢复交易,恢复交易后股价继续下跌,跌破9美元/股。","tags":["在线教育","培训"]}}

2.3 批量删除数据

关键命令:delete

POST _bulk
{"delete":{"_index":"article", "_type":"_doc", "_id":1}}

二、DSL查询

1. 什么是DSL?

DSL全名为Domain Specific Language的缩写,ElasticSearch可以通过基于JSON格式的DSL来进行查询。(Elasticsearch provides a ful1 Query DSL based on JSON to define queries)

2. DSL分类

DSL大体可以分为2类处理,先进行各种查询,然后在对查询结果进行聚合统计。

2.1 查询query

2.1.1 无条件查询

无条件查询默认就是查询所有。

  1. 方式一:
GET /article/_doc/_search
  1. 方式二:
GET /article/_doc/_search
{
  "query": {
    "match_all": {}
  }
}

2.1.2 有条件查询

有条件查询大体又可以分为单条件查询和多条件查询。

2.1.2.1 单条件查询

1. 模糊查询

match可以狭义的理解为模糊查询,match会根据该字段的分词器,进行分词查询

POST /article/_doc/_search
{
  "query": {
    "match": {
      "title": "吴xx"
    }
  }
}

详细查询参考官网match语法

2. 精确查询

精确查询大体有如下几种:

  • term : 单个条件相等
  • terms : 单个字段属于某个值数组内的值
  • range : 字段属于某个范围内的值
  • exists : 某个字段的值是否存在
  • ids : 通过ID批量查询

注意:不用的分词器查询效果不一样!!!比如默认不指定分词器的话,将采用默认standard分词器,对英文是按照空格分词的,最中文是按照一个字一个字进行分词。

POST /moe_db/_doc/_search
{
  "query": {
    "term": {
      "name": "admin"
    }
  }
}

POST /article/_doc/_search
{
  "query": {
    "term": {
      "title": "吴"
    }
  }
}

2.1.2.2 多条件查询

多条件查询是将多个单条件查询语句进行组合而形成的一个完整的查询条件。

  • bool : 各条件之间有and,or或not的关系
    • must : 各个条件都必须满足,即各条件是and的关系
    • should : 各个条件有一个满足即可,即各条件是or的关系
    • must_not : 不满足所有条件,即各条件是not的关系
    • filter : 不计算相关度评分,它不计算_score即相关度评分,效率更高
  • constant_score : 不计算相关度评分

三、总结

ElasticSearch查询语法非常多,特别是DSL,本篇开始介绍了ElasticSearch的批量操作文档命令,然后介绍了下DSL查询,考虑到DSL篇幅内容多的情况,将对DSL查询分篇进行介绍。

欢迎大家关注微信公众号(MarkZoe)互相学习、互相交流。