前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ElasticSearch学习笔记

ElasticSearch学习笔记

作者头像
UzJu@菜菜狗
发布2022-04-25 16:16:25
4120
发布2022-04-25 16:16:25
举报
文章被收录于专栏:UzJu和菜菜狗UzJu和菜菜狗

ElasticSearch学习笔记

一、关系型数据库与非关系学数据库类比

关系型 Relational DB -> DataBases -> Tables -> Rows -> Columns Elasticsearch Elasticsearch -> Indices -> Types -> Documents -> Fields

Es如同SQL一样,有一套自己的查询语句,DSL查询

二、Elasticsearch增删改查

1、增

指定ID的情况下

代码语言:javascript
复制
PUT users/_doc/1
{
    "username": "wupx",
    "age": "18"
}

Create支持两种方式,一种是指定文档ID创建文档,另一种是让ES自动生成文档ID

自己指定文档ID创建文档,需要考虑ID的均衡性,避免产生分配不均衡的问题,Es的HASH函数会确保文档ID被均匀分配到不同的分片。

返回包中的_version字段,每一次操作都会加1,这是一个锁的机制,当并行修改文档的时候,更新的版本号比文档当前的版本号小时就会报错,不允许修改。

创建文档的时候,如果索引不存在,ES会自动创建对应的Index和Type

不指定ID的情况下

不指定id创建文档,HTTP请求也会变为PSOT

代码语言:javascript
复制
POST users/_doc
{
    "username": "huxy",
    "age": "18"
}

index和Create区别为:如果文档不存在,就索引新的文档,否则现有文档就会被删除,新的文档被索引版本信息_version+1

2、查

使用GET犯法,只需要GET 索引名/文档名/文档ID

代码语言:javascript
复制
GET users/_doc/1

在返回信息中_index为索引,_type为类型,_id为文档id,_version为版本信息,_source存储了文档的完整原始数据。

3、改

Update方法采用HTTP POST,在请求体重必须指名doc,在把具体文档提供在HTTP的body里,update和index犯法不同,update方法不会删除原来的文档,而是真正的数据更新

代码语言:javascript
复制
POST users/_update/1
{
    "doc": {
        "job": "coder",
        "message": "hello world"
    }
}

4、删

只需要把HTTP的方法换成Delete即可

代码语言:javascript
复制
Delete 索引名/_doc/文档id

三、Elasticsearch查询常见方法

Tips:在所有语法后面加上?pretty=true,格式化显示

1、查询所有索引及其容量

代码语言:javascript
复制
GET _cat/indices

2、查询某一个索引的映射结构

代码语言:javascript
复制
GET 索引名/_mapping

3、查询所有的相同前缀索引,通配符匹配

代码语言:javascript
复制
GET sec*/_search

4、查询所有索引模板

代码语言:javascript
复制
GET _template

5、查询具体索引模板

代码语言:javascript
复制
GET _template/模板名

6、查询集群健康状态

代码语言:javascript
复制
GET _cluster/health

7、查询所有节点

代码语言:javascript
复制
GET _cat/nodes

8、查询索引及分片的分布

代码语言:javascript
复制
GET _cat/shards

9、查询所有插件

代码语言:javascript
复制
GET _cat/plugins

四、Elasticsearch高级查询常见方法

1、查询某个索引的全部数据

代码语言:javascript
复制
GET /index/type/_search
{
    "query": {
        "match_all": {}
    }
}

2、根据某一字段精确查询

代码语言:javascript
复制
GET /index/type/_search
{
    "query": {
        "term" : {"字段名": "值"}
    }
}

3、根据某一字段模糊匹配

代码语言:javascript
复制
GET /index/tpe/_search
{
    "query": {
        "match": {"字段名": "值"}
    }
}

4、根据某一字段值进行范围查找

代码语言:javascript
复制
GET /index/type/_search
{
    "query":{
        "range": {
            "age": {"gte": 15, "lte": 25}
        }
    }
}

gte是大于等于 lte是小于等于

5、根据条件进行过滤查询

代码语言:javascript
复制
GET /index/type/_search
{
    "query":{
        "bool":{
            "filter": {
                "term": {"字段": "值"}
            }
        }
    }
}

五、DSL查询方法

DSL查询使用Json格式的请求体与Elasticsearch交互

DSL查询主要包括两种类型的查询语句

  • 叶子查询语句:用于查询特殊字段的特殊值,例如:match,term,range等
  • 复合查询语句:可以合并其他的叶子查询或复合查询,从而实现非常复杂的查询逻辑

1、基本语法

使用DSL查询,需要用query参数

代码语言:javascript
复制
GET /_search
{
    "query": <quer clause>
}

没有查询条件的查询,就是空查询,他会匹配所有的文档

代码语言:javascript
复制
GET /_search
{
    "query": {}
}

以上语句等价于

代码语言:javascript
复制
GET /_search

基本查询案例

使用match查询full_name字段包含john的记录

代码语言:javascript
复制
GET /_search
{
    "query": {
        "match": {
            "full_name": "john"
        }
    }
}

查询与过滤

DSL查询根据使用目的的不同分为两种类型

  • 上下文查询(Query Context),简称查询
  • 上下文过滤(Filter Context),简称过滤

查询Query

在上下文查询语境中,查询语句会询问文档与查询语句的匹配出程度,此外,它还会判断文档是否匹配并计算相关性评分_scoure的值

过滤Filter

在上下文过滤语境中,查询语句主要解决文档是否匹配的问题,而不会在意匹配程度,过滤主要用于结构化的数据

一般来说,过滤语句比查询语句的执行效率更高,因为它不用计算文档的相关性评分Score

全文搜索或需要用到相关性评分Score的场景采用查询Query,其他的全部用过滤Filter

代码语言:javascript
复制
GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}

全文查询

全文查询语句通常用于全文本字段的查询

match

查询可操作文本,数值和日期类型的数据,分期它们并构建查询语句

实例:查询full_name字段包含John或smith的文档

代码语言:javascript
复制
GET /_search
{
    "query" : {
        "match" : {
            "full_name" : "John Smith"
        }
    }
}

Tips:Elasticsearch会先使用分析器分析John Smith为两个独立的项,然后再去构建查询,这里的full_name字段可以替换为任何你想要查询的字段,甚至是_all字段

match属于boolean的类型,也就是说,分析器会对提供的查询文本进行分析并构建boolean查询语句,由match构建的boolean查询语句默认是逻辑或or,当然可以通过operator参数来改变这个默认行为

代码语言:javascript
复制
GET /_search
{
    "query": {
        "match" : {
            "full_name" : {
                "query" : "John Smith",
                "operator" : "and"
            }
        }
    }
}

说明: full_name 是字段名称,query 参数的值是提供的查询文本,operator 参数用于设置 match 的逻辑(or 还是 and)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ElasticSearch学习笔记
    • 一、关系型数据库与非关系学数据库类比
      • 二、Elasticsearch增删改查
        • 1、增
        • 2、查
        • 3、改
        • 4、删
      • 三、Elasticsearch查询常见方法
        • 1、查询所有索引及其容量
        • 2、查询某一个索引的映射结构
        • 3、查询所有的相同前缀索引,通配符匹配
        • 4、查询所有索引模板
        • 5、查询具体索引模板
        • 6、查询集群健康状态
        • 7、查询所有节点
        • 8、查询索引及分片的分布
        • 9、查询所有插件
      • 四、Elasticsearch高级查询常见方法
        • 1、查询某个索引的全部数据
        • 2、根据某一字段精确查询
        • 3、根据某一字段模糊匹配
        • 4、根据某一字段值进行范围查找
        • 5、根据条件进行过滤查询
      • 五、DSL查询方法
        • 1、基本语法
    相关产品与服务
    Elasticsearch Service
    腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档