Elasticsearch之常用DSL语句

目录

[1. Elasticsearch之常用DSL语句](#1. Elasticsearch之常用DSL语句)

[1.1 操作索引](#1.1 操作索引)

[1.2 文档操作](#1.2 文档操作)

[1.3 DSL查询](#1.3 DSL查询)

[1.4 搜索结果处理](#1.4 搜索结果处理)

[1.5 数据聚合](#1.5 数据聚合)


1. Elasticsearch之常用DSL语句

1.1 操作索引

mapping是对索引库中文档的约束,常见的mapping属性包括:

  • type:字段数据类型,常见的简单类型有:

  • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)

  • 数值:long、integer、short、byte、double、float、

  • 布尔:boolean

  • 日期:date

  • 对象:object

  • index:是否创建索引,默认为true

  • analyzer:使用哪种分词器

创建索引

sql 复制代码
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",
      }
    }
  }
}

查询索引

sql 复制代码
GET /goods

修改索引库

倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,无法修改mapping

虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。

sql 复制代码
PUT /索引库名/_mapping
{
  "properties": {
    "新字段名":{
      "type": "integer"
    }
  }
}

删除索引库

sql 复制代码
DELETE /goods

1.2 文档操作

新增文档

sql 复制代码
POST /goods/_doc/1
{
  "id": 1,
  "brandName": "Apple",
  "categoryName": "手机",
  "createTime": "2023-12-26 20:00:00",
  "price": 8000,
  "saleNum": 100,
  "status": 0,
  "stock": 100,
  "title": "Apple iPhone 15 Pro 256GB 远峰蓝色 支持移动联通电信5G 双卡双待手机"
}

POST /goods/_doc/2
{
  "id": 2,
  "brandName": "Huawei",
  "categoryName": "手机",
  "createTime": "2023-12-26 20:00:00",
  "price": 7000,
  "saleNum": 400,
  "status": 0,
  "stock": 200,
  "title": "华为 HUAWEI Mate 60 Pro 智能手机 鸿蒙系统卫星通话昆仑玻璃"
}

查询文档

sql 复制代码
GET /goods/_doc/1

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

删除文档

sql 复制代码
DELETE /goods/_doc/1

修改文档

全量修改是覆盖原来的文档,其本质是:

  • 根据指定的id删除文档
  • 新增一个相同id的文档

注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。

sql 复制代码
PUT /{索引库名}/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 略
}

增量修改是只修改指定id匹配的文档中的部分字段。

sql 复制代码
POST /{索引库名}/_update/文档id
{
    "doc": {
         "字段名": "新的值",
    }
}

1.3 DSL查询

查询所有

sql 复制代码
GET /goods/_search
{
  "query": {
    "match_all": {}
  }
}

全文检索

sql 复制代码
//单字段查询
GET /goods/_search
{
  "query": {
    "match": {
      "title": "手机"
    }
  }
}

//多字段查询
GET /goods/_search
{
  "query": {
    "multi_match": {
      "query": "手机",
      "fields": ["title"]
    }
  }
}

精准查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:

  • term:根据词条精确值查询

  • range:根据值的范围查询

term查询的字段是不分词的字段,因此查询的条件也必须是不分词的词条。查询时,用户输入的内容跟自动值完全匹配时才认为符合条件。如果用户输入的内容过多,反而搜索不到数据。

sql 复制代码
GET /goods/_search
{
  "query": {
   "term": {
     "categoryName": {
       "value": "手机"
     }
   }
  }
}

//匹配多个term
GET /goods/_search
{
  "query": {
   "terms": {
     "categoryName": [
       "手机",
       "电脑"
     ]
   }
  }
}

范围查询,一般应用在对数值类型做范围过滤的时候。比如做价格范围过滤。

sql 复制代码
GET /goods/_search
{
  "query": {
   "range": {
     "price": {
       "gte": 7500,
       "lte": 9000
     }
   }
  }
}

复合查询

  • must:必须匹配的条件,可以理解为"与"

  • should:选择性匹配的条件,可以理解为"或"

  • must_not:必须不匹配的条件,不参与打分

  • filter:必须匹配的条件,不参与打分

sql 复制代码
POST goods/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
          "brandName": {
            "value": "Apple"
          }
        }}
      ],
      "should": [
        {
          "term": {
          "categoryName": {
            "value": "手机"
          }
        }}
      ],
      "filter": [
        {
          "range": {
            "stock": {
              "gt": 0
            }
          }
        }
      ]
    }
  }
}

1.4 搜索结果处理

普通字段排序

sql 复制代码
GET /goods/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
     "stock": "desc"  //asc升序
    }
  ]
}

分页

elasticsearch中通过修改from、size参数来控制要返回的分页结果:

  • from:从第几个文档开始

  • size:总共查询几个文档

sql 复制代码
GET /goods/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,
  "size": 1
}

高亮显示

sql 复制代码
POST goods/_search
{
  "query": {
    "match": {
      "title": "手机"
    }
  },
  "highlight": {
    "fields": {
      "title": {
        "pre_tags": [
          "<font color='red'>"
        ],
        "post_tags": [
          "</font>"
        ]
      }
    }
  }
}

1.5 数据聚合

聚合常见的有三类:

  • 桶(Bucket)聚合:用来对文档做分组

  • TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组

  • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

  • 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等

  • Avg:求平均值

  • Max:求最大值

  • Min:求最小值

  • Stats:同时求max、min、avg、sum等

  • 管道(pipeline)聚合:其它聚合的结果为基础做聚合

统计所有数据中的品牌有几种,按照品牌对数据分组。

sql 复制代码
GET /goods/_search
{
  "size": 0,  //设置size为0,结果中不包含文档,只包含聚合结果
  "aggs": { // 定义聚合
    "brandAgg": { //给聚合起个名字
      "terms": { // 聚合的类型,按照品牌值聚合,所以选择term
        "field": "brandName", // 参与聚合的字段
        "size": 20 // 希望获取的聚合结果数量
      }
    }
  }
}

对于每个品牌的聚合限定聚合范围,并且根据Bucket内的文档数量进行升序排序

sql 复制代码
GET /goods/_search
{
  "query": {
    "range": {
      "stock": {
        "gte": 10
      }
    }
  }, 
  
  "size": 0,  //设置size为0,结果中不包含文档,只包含聚合结果
  "aggs": { // 定义聚合
    "brandAgg": { //给聚合起个名字
      "terms": { // 聚合的类型,按照品牌值聚合,所以选择term
        "field": "brandName", // 参与聚合的字段
        "size": 20, // 希望获取的聚合结果数量
         "order": {
          "_count": "asc"
        }
        
      }
    }
  }
}

按照品牌分组,形成了一个个桶。对桶内的数据做运算,获取每个品牌的stock的min、max、avg等值。

sql 复制代码
GET /goods/_search
{
  "query": {
    "range": {
      "stock": {
        "gte": 10
      }
    }
  }, 
  
  "size": 0,  
  "aggs": { 
    "brandAgg": {
      "terms": {
        "field": "brandName", 
        "size": 20, 
         "order": {
          "_count": "asc"
        }
      },
      "aggs": {
        "stock_status": {
          "stats": {
            "field": "stock"
          }
        }
      }
    }
    
  }
}
相关推荐
jianghx10242 小时前
Docker部署ES,开启安全认证并且设置账号密码(已运行中)
安全·elasticsearch·docker·es账号密码设置
IT小哥哥呀3 小时前
电池制造行业数字化实施
大数据·制造·智能制造·数字化·mom·电池·信息化
Xi xi xi3 小时前
苏州唯理科技近期也正式发布了国内首款神经腕带产品
大数据·人工智能·经验分享·科技
yumgpkpm3 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 、mysql数据库汇聚到Cloudera CDP7.3操作指南
大数据·数据库·mysql·华为·oracle·kafka·cloudera
UMI赋能企业4 小时前
制造业流程自动化提升生产力的全面分析
大数据·人工智能
TDengine (老段)5 小时前
TDengine 数学函数 FLOOR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
派可数据BI可视化7 小时前
商业智能BI 浅谈数据孤岛和数据分析的发展
大数据·数据库·数据仓库·信息可视化·数据挖掘·数据分析
jiedaodezhuti7 小时前
Flink性能调优基石:资源配置与内存优化实践
大数据·flink
阿里云大数据AI技术8 小时前
云栖实录 | AI 搜索智能探索:揭秘如何让搜索“有大脑”
人工智能·搜索引擎
Lx3528 小时前
Flink窗口机制详解:如何处理无界数据流
大数据