【Elasticsearch】Elasticsearch 从入门到精通(二):基础使用

news2024/9/17 8:35:05

Elasticsearch 从入门到精通》共包含以下 2 2 2 篇文章:

  • Elasticsearch 从入门到精通(一):基本介绍
  • Elasticsearch 从入门到精通(二):基础使用

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

Elasticsearch 从入门到精通(二):基础使用

  • 1.Kibana 的基本介绍
  • 2.ES 操作前须知
    • 2.1 REST 和 CURL 介绍:
      • 2.1.1 REST
      • 2.1.2 CURL
    • 2.2 ES 请求方式
  • 3.ES API 操作
    • 3.1 创建索引
    • 3.2 插入文档
    • 3.3 查询文档
    • 3.4 更新文档
    • 3.5 搜索文档
    • 3.6 删除文档
    • 3.7 删除索引
    • 3.8 创建映射
    • 3.9 映射字段的类型
    • 3.10 获取映射字段
    • 3.11 索引库配置管理(settings)
  • 4.ES 花式查询
    • 4.1 使用 match_all 做查询
    • 4.2 通过关键字段进行查询
    • 4.3 bool 的复合查询
    • 4.4 bool 的复合查询中的 should
    • 4.5 term 匹配
    • 4.6 使用 terms 匹配多个值
    • 4.7 range 过滤
    • 4.8 exists 和 missing 过滤
    • 4.9 bool 的多条件过滤
    • 4.10 查询与过滤条件合并
  • 5.零停机重新索引数据
    • 5.1 新建索引库 articles1
    • 5.2 索引库 articles1 添加数据
    • 5.3 新建索引库 articles2
    • 5.4 拷贝数据并验证

对 Elasticsearch 操作有多种工具,这里我们使用 Kibana,先简单介绍下。

1.Kibana 的基本介绍

在这里插入图片描述

  • Kibana 是一个开源的分析和可视化平台,设计用于和 Elasticsearch 一起工作。
  • 可以用 Kibana 来搜索,查看,并和存储在 Elasticsearch 索引中的数据进行交互。
  • 可以轻松地执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。
  • Kibana 使得理解大量数据变得很容易。它简单的、基于浏览器的界面使你能够快速创建和共享动态仪表板,实时显示 Elasticsearch 查询的变化。

2.ES 操作前须知

2.1 REST 和 CURL 介绍:

2.1.1 REST

REST(REpresentational State Transfer)从字面意思看 “表述性状态传输”,它通常是开发的一种约定,当所有的开发者都遵从这种约定的时候,可以大大简化开发的沟通成本。REST 约定用 HTTP 的请求头 POSTGETPUTDELETE 正好可以对应 CRUD(CreateReadUpdateDelete)四种数据操作。

如下表所示:

HTTP 方法数据处理说明
POSTCreate新增一个没有 ID 的资源
GETRead获取一个资源
PUTUpdate更新一个资源。或新增一个含 ID 的资源(如果 ID 不存在)
DELETEDelete删除一个资源

2.1.2 CURL

CURL 是利用 URL 语法在命令行方式下工作的开源文件传输工具,使用 curl 可以简单实现常见的 get / post 请求。简单的认为是可以在命令行下面访问 URL 的一个工具。在 Centos 的默认库里面是有 curl 工具的,如果没有请 yum 安装即可。

curl 后面可跟参数:

  • -X 指定 HTTP 的请求方法,有 HEAD、GET、POST、PUT、DELETE
  • -d 指定要传输的数据
  • -H 指定 HTTP 请求头信息

Elasticsearch 提供了非常全面和强大的 REST API,通过这些 API,我们可以了解集群的信息。这些 API 可以做如下事情:

  • 检查集群、节点和索引的情况、状态和统计。
  • 管理集群、节点、索引数据和文档数据。
  • 执行 CRUD(创建、读取、更新和删除)操作,可以对索引进行操作。
  • 执行高级搜索操作,如分页、排序、过滤、脚本、聚合及其他操作。

2.2 ES 请求方式

首先说下请求 ES 的方式,后面例子都是这种方式。

  • 请求参数:curl -X{PUT} http://{host}:{port}
    • 例如:curl -XPUT http://120.0.0.1:9200/blog1?pretty
    • 在 Kibana 中可直接输入 PUT /blog1?pretty
  • body 参数:{参数内容}
{
    "settings":{
        "index":{
            "number_of_shards":1,
            "number_of_replicas":0
        }
    }
}

注意:请求方法 GET 和 DELETE 上面介绍了,比较简单,不过多说,主要说下 POST 和 PUT 在 ES 中的使用。

  • POST 和 PUT 共同点
    • ES 中的 PUT 和 POST 同样都具备创建和更新的功能。
  • POST 和 PUT 不同点
    • PUT 需要精确到某一个资源文件,这样才能进行对数据的更新和创建操作。
    • POST 能对整个资源集合进行操作,如果没有指定具体修改的文件 id,那么 POST 指令会自动生成一个唯一的 id 进行文件的创建,并将数据写入该文件中。如果指定了文件 id,那么就会根据填写的参数对数据进行创建和更新操作。
    • PUT、GET、DELETE 是幂等的,由于同一条这样的指令,执行多次结果都一样。比如 PUT /uri/xxx 多次,那么结果和这条指令执行一次效果一样。
    • 而 POST 是非幂等的,执行多次更改多次服务器状态。比如 POST /uri 多次,那么生成多个 UUID 的 document,执行多次效果和执行一次不一样。

3.ES API 操作

3.1 创建索引

ES 的索引是一个逻辑概念,它包括了分词列表及文档列表。同一个索引中存储了相同类型的文档,它就相当于 MySQL 中的表,或相当于 Mongodb 中的集合。

关于 索引 这个语:

  • 索引(名词):ES 是基于 Lucene 构建的一个搜索服务,它要从索引库搜索符合条件索引数据。
  • 索引(动词):索引库刚创建起来是空的,将数据添加到索引库的过程称为索引。

创建索引命令:PUT http://node01:9200/索引名称?pretty

上面命令最后有个 pretty,什么意思呢,在任意的查询字符串中增加 pretty 参数,会让 Elasticsearch 美化输出(pretty-print)JSON 响应以便更加容易阅读。

创建索引举例:

打开 Kibana,找到 dev tools

在这里插入图片描述
出现如下页面,左边是 执行区,右边是结果 返回区

在这里插入图片描述
左边框中执行以下语句:

curl -XPUT http://node01:9200/blog001/?pretty

上述语句直接粘贴到 Kibana 的 dev tools,如下左边所示,它会自动帮我们格式化语句,像 curl -X 和地址都自动隐藏了。

在这里插入图片描述
上面执行的命令并没有设置 body 参数,执行的就是默认参数。

执行如下带 body 参数的语句:

curl -XPUT http://node01:9200/blog2/?pretty
{
    "settings":{
        "index":{
            "number_of_shards":1,
            "number_of_replicas":0
        }
    }
}
  • number_of_shards:设置 分片 的数量,在集群中通常设置多个分片,表示一个索引库将拆分成多片分别存储不同的结点,提高了 ES 的处理能力和高可用性,使用单机环境,这里设置为 1。
  • number_of_replicas:设置 副本 的数量,设置副本是为了提高 ES 的高可靠性,单机环境设置为 0。

在这里插入图片描述
创建索引相当于关系数据库中的数据库还是表?

  • 如果相当于数据库,就表示一个索引库可以创建很多不同类型的文档,这在 ES 中也是允许的。
  • 如果相当于表,就表示一个索引库只能存储相同类型的文档,ES 官方建议在一个索引库中只存储相同类型的文档。

3.2 插入文档

ES 中的文档相当于 MySQL 数据库表中的数据。

使用 PUT 将一个文档添加到 /_doc(文档类型),并为该文档分配 ID 1 1 1。URL 路径显示为 index/doctype/ID索引 / 文档类型 / ID)。

curl -XPUT http://node01:9200/blog01/_doc/1?pretty
{"id": "1", "title": "五分钟学大数据"}

注意:上面说的文档类型,也叫 映射类型type)。

什么是映射类型?

简单理解相当于关系数据库的表(不准确,后面会说),每个索引里都可以有一个或多个映射类型,映射类型是 index 中的一个逻辑数据分类,一个映射类型下的文档(document),都有相同的字段(field)。

ES 6.0 6.0 6.0 之前的版本有映射类型(type)概念,但是官方将在 ES 9.0 9.0 9.0 版本中彻底删除映射类型。

为什么要移除映射类型?

开始的时候,我们说 “索引index)” 类似于 SQL 数据库中的 “数据库”,将 “类型type)” 等同于 “”。

这是一个糟糕的类比,并且导致了一些错误的假设。在 SQL 数据库中,表之间是相互独立的。一个表中的各列并不会影响到其它表中的同名的列。而在 映射类型mapping type)中却不是这样的。

在同一个 Elasticsearch 索引中,其中不同映射类型中的同名字段在内部是由同一个 Lucene 字段来支持的。换句话说,假如有两个映射类型 usertweetuser 类型中的 user_name 字段与 tweet 类型中的 user_name 字段是完全一样的,并且两个 user_name 字段在两个类型中必须具有相同的映射(定义)。

这会在某些情况下导致一些混乱,比如,在同一个索引中,当你想在其中的一个类型中将 deleted 字段作为 date 类型,而在另一个类型中将其作为 boolean 字段。

在此之上需要考虑一点,如果同一个索引中存储的各个实体如果只有很少或者根本没有同样的字段,这种情况会导致稀疏数据,并且会影响到 Lucene 的高效压缩数据的能力。

基于这些原因,将映射类型的概念从 Elasticsearch 中移除。

所以在 ES 6.0 6.0 6.0 及之后版本中要弱化映射类型的概念,尽量设置一个无任何业务含义的名字,本文档的所有映射类型都统一设为 _doc

3.3 查询文档

curl -XGET http://node01:9200/blog01/_doc/1?pretty

在这里插入图片描述

3.4 更新文档

curl -XPUT http://node01:9200/blog01/_doc/1?pretty
{"id": "1", "title": "公众号【五分钟学大数据】"}

在这里插入图片描述

3.5 搜索文档

GET /blog01/article/_search?q=title:公众号【五分钟学大数据】

在这里插入图片描述
返回值说明

  • Hits
    • 返回结果中最重要的部分是 hits,它包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。
    • hits 数组中每个结果包含文档的 _index_type_id,加上 _source 字段。这意味着我们可以直接从返回的搜索结果中使用整个文档。这不像其他的搜索引擎,仅仅返回文档的 ID,需要你单独去获取文档。
    • 每个结果还有一个 _score,它衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。
    • max_score 值是与查询所匹配文档的 _score 的最大值。
  • took
    • took 值告诉我们执行整个搜索请求耗费了多少毫秒。
  • Shard
    • _shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。正常情况下我们不希望分片失败,但是分片失败是可能发生的。
    • 如果我们遭遇到一种灾难级别的故障,在这个故障中丢失了相同分片的原始数据和副本,那么对这个分片将没有可用副本来对搜索请求作出响应。假若这样,Elasticsearch 将报告这个分片是失败的,但是会继续返回剩余分片的结果。
  • timeout
    • timed_out 值告诉我们查询是否超时。默认情况下,搜索请求不会超时。 如果低响应时间比完成结果更重要,你可以指定 timeout 10 10 10 或者 10 m s 10ms 10ms,或者 1 s 1s 1sGET /_search?timeout=10ms
    • 在请求超时之前,Elasticsearch 将会返回已经成功从每个分片获取的结果。

3.6 删除文档

DELETE /blog01/article/1?pretty

3.7 删除索引

DELETE /blog01?pretty

3.8 创建映射

在索引中每个文档都包括了一个或多个字段(field),创建映射就是向索引库中创建字段及字段类型等的过程,下面是 documentfield 与关系数据库的概念的类比:

  • 文档(Document)➡ Row 记录
  • 字段(Field) ➡ Columns 列

为什么要映射?

ES 中的文档等价于 Java 中的对象,那么在 Java 对象中有字段类型(比如 stringintlong 等),同理在 ES 索引中的具体字段也是有类型的。

像下面这个操作:

PUT /document/_doc/1
{
    "title" : "Elasticsearch 怎么学",
    "author" : "五分钟学大数据",
    "titleScore" : 60
}

这种操作并没有指定字段类型,那么 Elasticsearch 会自动根据数据类型的格式识别字段的类型;

查看索引的字段类型:

GET /document/_mapping

可以发现 titleScore 的类型是 long

在这里插入图片描述
然后在插入一条数据,注意此时 titleScore 的值不是 long 类型:

PUT /document/_doc/2
{
    "title": "Elasticsearch 怎么学",
    "author": "五分钟学大数据",
    "titleScore": 66.666
}

查询数据:

GET /document/_doc/2

我们会发现 ES 能存入,并没有报错(注意),这其实是一个问题,因为如果后期 Elaticsearch 对接 Java 的时候,我们会写一个类对数据做封装,比如:

class Article{
    private String title;
    private String author;
    private String titleScore
}

对于 titleScore,设置什么类型合适?使用 long 类型,那么后面肯定会有数据格式转换的异常。

所以,我们如果能提前知道字段类型,那么最好使用 mapping 的映射管理,提前指定字段的类型,防止后续的程序问题。

先删除之前创建的索引:DELETE document

创建索引,并指定映射:

PUT document
{
    "mappings": {
        "properties": {
            "title": {
                "type": "text"
            },
            "author": {
                "type": "text"
            },
            "titleScore": {
                "type": "double"
            }
        }
    }
}

查看索引:GET document/_mapping

在这里插入图片描述
对这个索引继续添加字段:

POST /document/_mapping
{
    "properties": {
        "number": {
            "type": "text"
        }
    }
}

查看索引:GET document/_mapping

在这里插入图片描述

3.9 映射字段的类型

在 Elasticsearch 中,每一个字段都有一个类型(type)。以下为 Elasticsearch 中可以使用的类型:

分类类型名称
说明
简单类型text需要进行全文检索的字段,通常使用 text 类型来对应正文、产品描述或者短文等非结构化文本数据。分词器先会将文本进行分词转换为词条列表。将来就可以基于词条来进行检索了。文本字段不能用户排序、也很少用户聚合计算。
简单类型keyword使用 keyword 来对应结构化的数据,如 ID、电子邮件地址、主机名、状态代码、邮政编码或标签。可以使用 keyword 来进行排序或聚合计算。注意:keyword 是不能进行分词的
简单类型date保存格式化的日期数据,例如:2015-01-01 或者 2015/01/01 12:10:30。在 Elasticsearch 中,日期都将以字符串方式展示。可以给 date 指定格式:"format":"yyyy-MM-dd HH:mm:ss"
简单类型long / integer / short / byte 64 64 64 位整数 / 32 32 32 位整数 / 16 16 16 位整数 / 8 8 8 位整数
简单类型double / float / half_float 64 64 64 位双精度浮点 / 32 32 32 位单精度浮点 / 16 16 16 位半精度浮点
简单类型booleantrue / false
简单类型ipIPV4(192.168.1.110)/ IPV6(192.168.0.0/16
JSON 分层嵌套类型object用于保存 JSON 对象
JSON 分层嵌套类型nested用于保存 JSON 数组
特殊类型geo_point用于保存经纬度坐标
特殊类型geo_shape用于保存地图上的多边形坐标

3.10 获取映射字段

语法:GET /{index}/_mapping/field/{field}

GET /document/_mapping/field/number

在这里插入图片描述

3.11 索引库配置管理(settings)

所谓的 settings 就是用来修改索引分片和副本数的。

比如有的重要索引,副本数很少甚至没有副本,那么我们可以通过 setting 来添加副本数。

查看 settingsGET /document/_settings

在这里插入图片描述
可以看到当前的副本数是 1 1 1,那么为了提高容错性,我们可以把副本数改成 2 2 2

PUT /document/_settings
{
    "number_of_replicas": 2
}

在这里插入图片描述
注意:副本可以改,分片不能改!

执行如下语句会报错:

PUT /document/_settings
{
    "number_of_shards": 3
}

4.ES 花式查询

我们先插入一些数据,后面查询时以这些数据为例。

在 Kibana 界面上执行如下语句,插入一些数据:

POST /student/_doc/_bulk
{ "index": { "_id": 1 }}
{ "name" : "liubei", "age" : 20 , "sex": "boy", "birth": "1996-01-02" , "about": "i like diaocan he girl" }
{ "index": { "_id": 2 }}
{ "name" : "guanyu", "age" : 21 , "sex": "boy", "birth": "1995-01-02" , "about": "i like diaocan" }
{ "index": { "_id": 3 }}
{ "name" : "zhangfei", "age" : 18 , "sex": "boy", "birth": "1998-01-02" , "about": "i like travel" }
{ "index": { "_id": 4 }}
{ "name" : "diaocan", "age" : 20 , "sex": "girl", "birth": "1996-01-02" , "about": "i like travel and sport" }
{ "index": { "_id": 5 }}
{ "name" : "panjinlian", "age" : 25 , "sex": "girl", "birth": "1991-01-02" , "about": "i like travel and wusong" }
{ "index": { "_id": 6 }}
{ "name" : "caocao", "age" : 30 , "sex": "boy", "birth": "1988-01-02" , "about": "i like xiaoqiao" }
{ "index": { "_id": 7 }}
{ "name" : "zhaoyun", "age" : 31 , "sex": "boy", "birth": "1997-01-02" , "about": "i like travel and music" }
{ "index": { "_id": 8 }}
{ "name" : "xiaoqiao", "age" : 18 , "sex": "girl", "birth": "1998-01-02" , "about": "i like caocao" }
{ "index": { "_id": 9 }}
{ "name" : "daqiao", "age" : 20 , "sex": "girl", "birth": "1996-01-02" , "about": "i like travel and history" }

4.1 使用 match_all 做查询

GET /student/_doc/_search?pretty
{
    "query": {
        "match_all": {}
    }
}

问题:通过 match_all 匹配后,会把所有的数据检索出来,但是往往真正的业务需求并非要找全部的数据,而是检索出自己想要的;并且对于 ES 集群来说,直接检索全部的数据,很容易造成 GC 现象。所以,我们要学会如何进行高效的检索数据。

4.2 通过关键字段进行查询

GET /student/_doc/_search?pretty
{
    "query": {
        "match": {
            "about": "travel"
        }
    }
}

如果此时想查询喜欢旅游的,并且不能是男孩的,怎么办?

这样写是否可以:

GET /student/_doc/_search?pretty
{
    "query": {
        "match": {
            "about": "travel",
            "sex": "girl"
        }
    }
}

在这里插入图片描述
发现报错了,因为一个 match 下,不能出现多个字段值,需要使用复合查询。

4.3 bool 的复合查询

当出现多个查询语句组合的时候,可以用 bool 来包含。

bool 合并聚包含:mustmust_not 或者 shouldshould 表示 or 的意思。

例:查询非男性中喜欢旅行的人

GET /student/_doc/_search?pretty
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "about": "travel"
                }
            },
            "must_not": {
                "match": {
                    "sex": "boy"
                }
            }
        }
    }
}

4.4 bool 的复合查询中的 should

should 表示可有可无的(如果 should 匹配到了就展示,否则就不展示)

例:查询喜欢旅行的,如果有男性的则显示,否则不显示

GET /student/_doc/_search?pretty
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "about": "travel"
                }
            },
            "should": {
                "match": {
                    "sex": "boy"
                }
            }
        }
    }
}

4.5 term 匹配

使用 term 进行精确匹配(比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型))。

语法:

{ "term": { "age": 20 }}
{ "term": { "date": "2018-04-01" }}
{ "term": { "sex": “boy” }}
{ "term": { "about": "trivel" }}

例如:

GET /student/_doc/_search?pretty
{
    "query": {
        "bool": {
            "must": {
                "term": {
                    "about": "travel"
                }
            },
            "should": {
                "term": {
                    "sex": "boy"
                }
            }
        }
    }
}

4.6 使用 terms 匹配多个值

GET /student/_doc/_search?pretty
{
    "query": {
        "bool": {
            "must": {
                "terms": {
                    "about": [
                        "travel",
                        "history"
                    ]
                }
            }
        }
    }
}

注意:termmatch 区别:

  • term 主要是用于精确的过滤比如说:“我爱你”
  • match 下面匹配可以为包含:我、爱、你、我爱等等的解析器
  • term 语法下面就精准匹配到:“我爱你”

4.7 range 过滤

Range 过滤允许我们按照指定的范围查找一些数据:

  • gt:大于
  • gae:大于等于
  • lt:小于
  • lte:小于等于

例:查找出大于 20 20 20 岁,小于等于 25 25 25 岁的学生

GET /student/_doc/_search?pretty
{
    "query": {
        "range": {
            "age": {
                "gt": 20,
                "lte": 25
            }
        }
    }
}

4.8 exists 和 missing 过滤

existsmissing 过滤可以找到文档中是否包含某个字段或者是没有某个字段。

例:查找字段中包含 age 的文档

GET /student/_doc/_search?pretty
{
    "query": {
        "exists": {
            "field": "age"
        }
    }
}

4.9 bool 的多条件过滤

bool 也可以像之前 match 一样来过滤多行条件:

  • must:多个查询条件的完全匹配,相当于 and
  • must_not:多个查询条件的相反匹配,相当于 not
  • should:至少有一个查询条件匹配,相当于 or

例:过滤出 about 字段包含 travel 并且年龄大于 20 20 20 岁小于 30 30 30 岁的同学

GET /student/_doc/_search?pretty
{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "about": {
                            "value": "travel"
                        }
                    }
                },
                {
                    "range": {
                        "age": {
                            "gte": 20,
                            "lte": 30
                        }
                    }
                }
            ]
        }
    }
}

4.10 查询与过滤条件合并

通常复杂的查询语句,我们也要配合过滤语句来实现缓存,用 filter 语句就可以来实现。

例:查询出喜欢旅行的,并且年龄是 20 20 20 岁的文档

GET /student/_doc/_search?pretty
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "about": "travel"
                }
            },
            "filter": [
                {
                    "term": {
                        "age": 20
                    }
                }
            ]
        }
    }
}

5.零停机重新索引数据

实际生产,对于文档的操作,偶尔会遇到这种问题:

某一个字段的类型不符合后期的业务了,但是当前的索引已经创建了,我们知道 ES 在字段的 mapping 建立后就不可再次修改 mapping 的值。

5.1 新建索引库 articles1

PUT articles1
{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 1
    },
    "mappings": {
        "dynamic": "strict",
        "properties": {
            "id": {
                "type": "text",
                "store": true
            },
            "title": {
                "type": "text",
                "store": true
            },
            "readCounts": {
                "type": "integer",
                "store": true
            },
            "times": {
                "type": "text",
                "index": false
            }
        }
    }
}

5.2 索引库 articles1 添加数据

PUT articles1/_doc/1
{
    "id": "1",
    "title": "世界1",
    "readCounts": 2,
    "times": "2022-05-01"
}

5.3 新建索引库 articles2

PUT articles2
{
    "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1
    },
    "mappings": {
        "dynamic": "strict",
        "properties": {
            "id": {
                "type": "text",
                "store": true
            },
            "title": {
                "type": "text",
                "store": true
            },
            "readCounts": {
                "type": "integer",
                "store": true
            },
            "times": {
                "type": "date",
                "index": false
            }
        }
    }
}

5.4 拷贝数据并验证

POST _reindex
{
    "source": {
        "index": "articles1"
    },
    "dest": {
        "index": "articles2"
    }
}

验证数据:

GET articles2/_doc/1

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1617675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用写入这类接口后,文件指针fp是否会偏移?

以fprintf为例: 在使用 fprintf 函数写入数据时,文件指针 fp 会自动进行偏移,以确保数据被写入到文件的正确位置。 每次调用 fprintf 函数都会将数据写入文件,并且文件指针会在写入完成后自动移动到写入的末尾,以便下…

MYSQL中ID是无序的,但是需要通过指定的条件查询到最大的值的ID应该如何查询。

1、开发中遇到这个问题,下面直接通过mysql的方式讲解 select id, start_time, eva_id from a where eva_id 1 order by start_time desc 执行查询出来的数据是这样的 2、解决方案 那么问题来了, 我只想获取到start_time 最大的那个ID,那有些…

CRMEB pro版/多门店商城系统客服配置教程

客服功能配置介绍 功能提示: Pro v2.0系统采用swoole框架,客服不需要单独配置,按照正常安装流程配置好程序即可使用! 如出现客服无法使用,请检查: 1.消息队列是否正常 2.重启swoole 一、功能介绍 CRMEB商城…

【UML建模】用例图

1 参与者 参与者的概念: 指系统以外的、需要使用系统或与系统交互的外部实体 可以分为:人、外部设备、外部系统 参与者的图形符号: 例 3.1 在一个银行业务系统中,可能会有以下参与者 客户 :在银行业务系统中办理…

图像处理技术与应用(一)

图像处理技术与应用入门 使用skimage进行图像读取和显示 skimage库(Scikit-image)提供了一个强大的工具集,用于执行各种图像处理任务。以下是如何使用skimage读取和显示图像的基本示例: from skimage import ioimg io.imread(…

华为sr-mpls policy配置案例

SR-MPLS POLICY在ensp上面做不了,这是官方上的配置

金铲铲无限金币-罗小黑最新

罗小黑最新,下载自测。 记得查看注意事项。 获取链接:https://pan.baidu.com/s/1mRuQPAqWXv6oeihQ5fsn0w?pwdd0s3 提取码:d0s3 --来自百度网盘超级会员V1的分享

Apache Answer 开源问答社区安装体验

Answer 是由 SegmentFault 思否团队打造的一款问答平台软件,后端使用 Go 语言编写,于2022年10月24日(程序员节)正式开源。你可以免费使用 Answer 高效地搭建一个问答社区,并用于产品技术问答、客户支持、用户交流等场景。 2023年10月9日,Answer 顺利通过投票,以全票通过…

spring的跨域问题

跨域问题 什么是跨域解决跨域 什么是跨域 跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。如果出现了以下情况中的任意一种,那么它就是跨域请求: 1、协议不同,如 http 和 h…

Ubuntu 自己写的程序如何创建快捷方式

在Ubuntu中创建程序的快捷方式通常是通过将一个指向程序可执行文件的.desktop文件放入/usr/share/applications/或用户的~/.local/share/applications/目录来实现的。以下是创建快捷方式的基本步骤和示例: 在application里创建快捷方式 创建一个新的.desktop文件。…

把 WordPress 变成 BaaS 服务:API 调用指南

有了前面两篇内容的铺垫,我们来聊聊 WordPress 作为 CMS / BaaS 服务使用时绕不开的问题,API 调用。 这篇内容同样的,会尽量少贴代码,简单的讲清楚一件事,降低阅读负担。 写在前面 首先,我们需要进行清晰…

STM32H750时钟频率和功耗以及RTC功能测试

STM32H750时钟频率和功耗和RTC功能测试 ✨在使用STM32CubeMX修改STM32H750时钟树参数时,如果使用软件自动求解,这是一个非常耗时的操作,有时候还不一定成功,还是推荐使用手动方式进行配置,这一点和STM32其他系列不同&a…

叉车4G无线视频监控管理解决方案:提升效率,保障安全

在现代物流行业中,叉车被广泛应用于仓储和物流领域,成为提升效率和降低成本的重要工具。然而,叉车作为重要的运输设备,其安全性和管理效率也备受关注。针对这一问题,叉车4G无线视频监控管理解决方案应运而生。 叉车是仓…

RB-Tree

RB-tree 平衡二叉搜索树 元素排列规则有利于search 和 insert red-black tree(红黑树)是平衡二元搜索树(balanced binary tree)。其特征:排列规则有利于Search和Insert,并保持适度平衡—无任何节点过深。rb_tree提供两种插入操作:inset_unique和insert…

Rest微服务案例

Rest 父工程构建microservicecloud-api公共子模块Modulemicroservicecloud-provider-dept-8001部门微服务提供者Modulemicroservicecloud-consumer-dept-80部门微服务消费者Module 以Dept部门模块做一个微服务通用案例 Consumer消费者(Client)通过REST调…

HF区块链链码基础

链码生命周期 一 . 链码准备 准备文件 . 在测试目录下创建chaincode,拷贝测试链码进 chaincode目录,拷贝 set-env.sh 脚本进 scripts 目录 二. 打包链码 打包测试链码 export FABRIC_CFG_PATH${PWD}/config peer lifecycle chaincode package ./chaincode/chaincode_basic.…

什么是信息熵?

什么是信息? ​ 我们在日常生活中吃瓜的时候总会说信息量太大了,那么这个信息是怎么个意思呢?我们在听到的时候很多原因都是因为这个消息是新鲜的,我们没见过的,没听说过,所以就说是信息量大。 信息熵 2…

重学java 22.面向对象 继承、抽象综合案例

我们纵横交错,最后回到原点 —— 24.4.23 综合案例 流程思维图 代码实现 方式1 利用set方法为属性赋值 父类: public abstract class Development extends Employee{}子类1: public class JavaEE extends Development{Overridepublic void w…

【软考高项】二十四、整合管理基础内容

一、概述内容 定义 项目整合管理包括识别、定义、组合、统一和协调项目管理过程组的各个过程和项目管理活动,项目整合管理贯穿项目始终。目标 ①资源分配;②平衡竞争性需求;③研究各种备选方法;④裁剪过程以实现项目目标;⑤管理各个项目管理知识领域之间的…

前端性能分析工具及使用

Lighthouse Lighthouse (谷歌浏览器的插件商店中搜索并安装,浏览器中点击F12,开发者工具中可使用)是 Google 开发的一款工具,用于分析网络应用和网页,收集现代性能指标并提供对开发人员最佳实践的意见。只要…