[ELK实战] Elasticsearch 常用操作 (基于DSL)

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 为什么不能修改一个字段的type?原因是一个字段的类型修改以后,那么该字段的所有数据都需要重新索引。Elasticsearch底层使用的是lucene库,字段类型修改以后索引和搜索要涉及分词方式等操作。索引库一旦mapping创建后无法修改和删除,但是可以添加新的字段。query下面的参数有match/...

方法 / 步骤

一: 前置工作

1.1 导入数据

POST /staff/_bulk
{"index":{"_id":1}}
{"name":"zs","realname":"张三","age":10,"birthday":"2018-12-27","salary":1000.0,"address":"北京市北海公园"}
{"index":{"_id":2}}
{"name":"ls","realname":"李四","age":20,"birthday":"2017-10-20","salary":2000.0,"address":"北京市京东大峡谷"}
{"index":{"_id":3}}
{"name":"ww","realname":"王五","age":30,"birthday":"2016-03-15","salary":3000.0,"address":"北京市陶然亭"}
{"index":{"_id":4}}
{"name":"zl","realname":"赵六","age":40,"birthday":"2003-04-19","salary":4000.0,"address":"北京市玉渊潭"}
{"index":{"_id":5}}
{"name":"tq","realname":"田七","age":50,"birthday":"2001-08-11","salary":5000.0,"address":"北京市圆明园"}

1.2 常用DSL

# 查看集群的健康值:
GET _cat/health

# 测试分词器
POST /_analyze
{
  "text":"工程师",
  "analyzer":"ik_max_word"
}

# 查看某个索引属性
GET {index_name}
#查看指定索引文档总数
GET {index_name}/_count
#按照文档数量排序索引
GET _cat/indices?v&s=docs.count:desc
# 根据ID便捷查询索引文件
GET {index_name}/_doc/{index_id}


#创建索引库
PUT page

#删除索引
DELETE /page


二: 创建相关

2.1 创建索引,指定mapping(映射关系)

索引库一旦mapping创建后无法修改和删除,但是可以添加新的字段
为什么不能修改一个字段的type?原因是一个字段的类型修改以后,那么该字段的所有数据都需要重新索引。Elasticsearch底层使用的是lucene库,字段类型修改以后索引和搜索要涉及分词方式等操作。
PUT /store
{
  "mappings": {
    "properties": {
      "id":{"type": "integer"},
      "en_name":{"type": "keyword"},
      "zn_name":{"type": "text"},
      "creat_time":{"type": "date"},
      "state_owned":{"type": "boolean"},
      "address":{"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},
      "employees":{"type": "integer_range"}
    }
  }
}

2.2 新增Mapping映射

POST /{index_name}/_mapping
{
  "properties": {
      "phone":{
        "type": "keyword"
      }
    }
}

三: 查询操作

3.1 query 查询

query 下面的参数有 match /
// match分词匹配,必须使用分词 text字段
GET {index_name}/_search
{
  "query": {
    "match": {
      "name": "operator red sea"
    }
  }
}

// 查询某个具体值
GET {index_name}/_search
{
  "query": {
    "match": {
      "actorList.name": "zhang han yu"
    }
  }
}

// 过滤查询
// term 值等匹配 必须用keyword类型字段
// term 中的词是不会被分词的,但es默认会将数据中的词进行分词所以除非是分词内的,否则term中查不到该分词
GET {index_name}/_search
{
  "query": {
    "term": {
      "user.id": {
        "value": "kimchy",
        "boost": 1.0
      }
    }
  }
}

// 短语匹配 类似于 like '%xxxx%'
GET {index_name}/_search
{
  "query": {
    "match_phrase": {
      "actorList.name": "zhang han yu"
    }
  }
}


// fuzzy查询,模糊匹配(容错匹配)
GET {index_name}/_search
{
  "query": {
    "fuzzy": {
      "name": "rad"
    }
  }
}

3.2 范围查询

// 范围过滤
GET  {index_name}/_search
{
  "query": {
    "range": {
      "doubanScore": {
        "gte": 6,
        "lte": 9
      }
    }
  }
}

3.3 混合查询

// 混合查询方式 1、先匹配,再过滤 2、同时匹配加过滤

//1.先匹配,再过滤
GET {index_name}/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "color": "red"   }},
        { "term": { "brand": "gucci" }}
      ]
    }
  }
}
//或者

//1.先匹配,再过滤
GET {index_name}/_search
{
  "query": {
    "match": {
      "name": "red"
    }
  },
  "post_filter": {
    "term": {
      "actorList.id.keyword": "ygc"
    }
  }
}
//2.同时匹配加过滤
GET {index_name}/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "red"
          }
        }
      ],
      "filter": {
          "term": {
            "actorList.id.keyword": "ygc"
          }
         }
      }
    }
}

3.4 分页查询

// 分页查询,类似于limit
// from = (pageNo-1)*size
// 指定的查询字段"_source":
// 高亮highlight
GET {index_name}/_search
{
  "query": {
    "match": {
      "name": "red"
    }
  },
  "highlight": {
    "fields": {
      "name": "name": {"pre_tags": "<span color='red'>","post_tags": "</span>"}
    }
  },
  "_source": ["name","doubanScore"], 
  "from": 0,
  "size": 20
}

四: 更新操作

  • 覆盖方式更新(会把旧数据替换掉)
PUT / {index_name}/{index_id}?refresh=true
{
  "properties":{
    "age":{
      "type":"integer",
      "index": false
    }
  }
}
  • 部分更新
# 如果数据不存在,会报错
POST {index_name}/_update/{index_id}?refresh=true
{
  "doc": {
    "name": "胡八一"
  }
}

# 如果我们想要这样的效果:如果数据不存在,则作为新数据添加
POST {index_name}/_update/{index_id}?refresh=true
{
  "doc": {
    "name": "胡八一"
  },
  "doc_as_upsert": true
}


五: 删除操作

  • 直接删除索引
DELETE index-name
DELETE entry_record

六: 聚合查询

  • 聚合查询可以查看下面的文章

Elasticsearch 聚合查询一: Metric/指标聚合
Elasticsearch 聚合查询二: Bucketing/桶聚合

参考资料 & 致谢

[1] 官方文档

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
安全 前端开发 Java
Springboot中如何优雅的进行字段以及业务校验
Springboot中如何优雅的进行字段以及业务校验
350 0
|
存储 开发工具 数据库
【Git】版本控制的发展历史
版本控制的发展历史就像是一场关乎全人类合作、充满惊险刺激的冒险故事。这是一部充满了编程英雄彼此角力的传奇故事,而它的剧情中才华横溢的程序员们,有时甚至比电影明星还要闪耀夺目。
371 3
【Git】版本控制的发展历史
|
应用服务中间件 Linux 网络安全
linux下查找nginx.conf文件路径的方法
nginx.conf文件在哪?云吞铺子介绍Linux系统下查找nginx.conf配置文件的方法。 查找nginx.conf 1、SSH连接Linux服务器,命令:ssh root@你的服务器IP 2、执行命令:nginx -t回车,即可看到nginx.conf文件所在目录 3、cd进入目录,vi nginx.conf编辑nginx.conf文件即可。
8670 0
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
285 53
|
JavaScript 前端开发 API
Vue2与Vue3插槽使用的区别及案例
Vue 3在插槽功能上的改进,体现了其对开发体验的持续优化。通过简化API、加强动态特性和提升性能,Vue 3使得插槽的使用更加灵活和高效。这些改进不仅有助于减轻开发者的负担,还为组件之间的高级交互和内容复用打开了新的可能性。随着Vue生态系统的不断成熟,我们有理由相信,Vue将继续为前端开发提供强大且易用的工具。
227 3
|
存储 分布式计算 Apache
万字长文:基于Apache Hudi + Flink多流拼接(大宽表)最佳实践
万字长文:基于Apache Hudi + Flink多流拼接(大宽表)最佳实践
1525 3
|
编译器 C语言 C++
C语言基础教程(宏的使用和多文件编程)
C语言基础教程(宏的使用和多文件编程)
359 0
|
消息中间件
【RabbitMQ七】——RabbitMQ发布确认模式(Publisher Confirms)
【RabbitMQ七】——RabbitMQ发布确认模式(Publisher Confirms)
795 0
|
IDE Java API
Gradle 系列(2)手把手带你自定义 Gradle 插件
Gradle 系列(2)手把手带你自定义 Gradle 插件
1420 0
Gradle 系列(2)手把手带你自定义 Gradle 插件
|
Ubuntu Unix Linux
在Ubuntu安装RPM文件
Ubuntu使用`apt`和`alien`工具安装软件。`deb`是Ubuntu的标准包格式,但通过`alien`可转换及安装`RPM`包。首先确保启用`Universe`源,然后安装`alien`。转换RPM包为DEB包,运行`sudo alien package_name.rpm`,接着用`sudo apt install package_name.deb`安装。直接安装RPM包可使用`sudo alien -i package_name.rpm`,但这种方法不推荐,可能导致依赖性冲突和系统不稳定。
565 10