【ElasticSearch】基于Docker 部署 ElasticSearch 和 Kibana,使用 Kibana 操作索引库,以及实现对文档的增删改查

news2024/11/28 19:01:19

文章目录

  • 前言
  • 一、使用 Docker 部署 ElasticSearch 和 Kibana
    • 1.1 部署 ElasticSearch
    • 1.2 部署 Kibana
    • 1.3 利用 Kibana 演示 Elasticsearch 分词效果
  • 二、解决中文分词的问题
    • 2.1 默认分词器对中文分词的问题
    • 2.2 引入 IK 分词器
    • 2.3 IK 分词器的两种分词模式
    • 2.4 IK 分词器存在的问题
    • 2.5 IK 分词器拓展词库和停用词条
  • 三、使用 Kibana 操作索引库
  • 三、使用 Kibana 操作索引库
    • 3.1 Mapping 属性
    • 3.2 创建和获取索引
    • 3.3 修改索引库
    • 3.4 删除索引库
  • 四、使用 Kibana 实现对文档的增删改查
    • 4.1 新增文档
    • 4.2 获取和删除文档
    • 4.3 修改文档:全量修改和增量修改
    • 4.4 文档的版本号
    • 4.5 动态 Mapping 映射


前言

Elasticsearch 和 Kibana 是强大的工具,用于构建实时搜索和数据可视化解决方案。Elasticsearch 是一个分布式、高性能的搜索引擎,可以用于存储和检索各种类型的数据,从文本文档到地理空间数据。Kibana 则是 Elasticsearch 的可视化工具,用于实时分析和可视化大规模数据集。

在本文中,将探讨如何使用 Docker 进行快速部署 Elasticsearch 和 Kibana,搭建一个强大的搜索和分析平台。我们将从基础开始,逐步介绍如何配置和管理这两个工具,以满足不同应用场景的需求。随后,将重点关注使用 Kibana 操作索引库的各种任务,包括创建、获取、修改和删除索引。这些任务对于数据管理和搜索引擎的构建至关重要,将帮助您更好地组织和利用数据。

通过阅读本文,希望能够帮助我们掌握 Elasticsearch 和 Kibana 的核心概念,具备构建强大搜索引擎和可视化工具的能力,以及解决中文分词和文档管理方面的专业知识。

一、使用 Docker 部署 ElasticSearch 和 Kibana

因为需要使用 Docker 部署 ElasticSearch 和 Kibana ,并且它们相互之间需要进行网络通信,所有首先创建一个虚拟网络,然后在运行容器的时候,加入这个网络即可。

docker network create es-net

1.1 部署 ElasticSearch

  1. 获取 ElasticSearch 镜像:

首先我们需要从 DockerHub 中拉取 ElasticSearch 镜像:

DockerHup 地址:https://hub.docker.com/_/elasticsearch。

docker pull elasticsearch

注意,ElasticSearch 的镜像体积比较大,如果能找到镜像的tar包的话,最好使用tar包加载。此时我使用的是 7.12.1版本的镜像:

使用命令加载这个 tar 包:

docker load -i es.tar
  1. 运行 ElasticSearch 容器

运行 Docker 命令,部署单点的 ElasticSearch 服务:

docker run -d \
	--name es \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v es-data:/usr/share/elasticsearch/data \
    -v es-plugins:/usr/share/elasticsearch/plugins \
    --privileged \
    --network es-net \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.12.1

上述 Docker 命令是为了运行 Elasticsearch 容器。下面是对命令的解释:

  1. docker run -d 这部分表示在后台运行容器。

  2. --name es 为容器指定一个名字,这里是 “es”。

  3. -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" 设置 Java 虚拟机的参数,包括初始堆内存大小 (-Xms) 和最大堆内存大小 (-Xmx),这里都设置为 512MB。

  4. -e "discovery.type=single-node" 设置 Elasticsearch 的节点发现机制为单节点,因为在这个配置中只有一个 Elasticsearch 实例。

  5. -v es-data:/usr/share/elasticsearch/data 将容器内 Elasticsearch 的数据目录挂载到宿主机的名为 “es-data” 的卷上,以便数据持久化。

  6. -v es-plugins:/usr/share/elasticsearch/plugins 类似上面,将容器内 Elasticsearch 的插件目录挂载到宿主机的名为 “es-plugins” 的卷上。

  7. --privileged 赋予容器一些特权,可能会有一些安全风险,需要慎用。

  8. --network es-net 将容器连接到名为 “es-net” 的网络上,目的是为了与其他容器进行通信。

  9. -p 9200:9200 -p 9300:9300 将容器内部的端口映射到宿主机上,这里分别是 Elasticsearch 的 HTTP REST API 端口(9200)和节点间通信的端口(9300)。

  10. elasticsearch:7.12.1 指定要运行的 Docker 镜像的名称和版本号,这里是 Elasticsearch 7.12.1 版本。

这个命令配置了 ElasticSearch 的运行参数、数据卷、网络等,使其能够在后台运行,并且可以通过指定的端口访问 Elasticsearch 的 API。

当运行完这个命令之后,我们可以在浏览器中访问 宿主机IP:9200,即可看到 ElasticSearch 的响应结果:

1.2 部署 Kibana

  1. 获取 Kibana 镜像

Kibana 是 Elastic 官方提供的一个 ElasticSearch 的可视化界面,通过这个界面可以更好地对 ElasticSearch 进行操作。

想要使用 Docker 部署 Kibana,首先同样需要从 DockerHub 中获取镜像:

DockerHub:https://hub.docker.com/_/kibana。

docker pull kibana

同样的,Kibana 镜像的大小也超过了一个 G,因此如果能找到 tar 的话,尽量使用 load 获取镜像:

docker load -i kibana
  1. 运行 Kibana 容器

使用 Docker 命令运行 Kibana 容器:

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601  \
kibana:7.12.1

这 Docker 命令是为了运行 Kibana 容器,它与 Elasticsearch 一同组成了 ELK(Elasticsearch, Logstash, Kibana)技术栈的一部分。下面是对命令各个部分的解释:

  1. docker run -d 在后台运行容器。

  2. --name kibana 为容器指定一个名字,这里是 “kibana”。

  3. -e ELASTICSEARCH_HOSTS=http://es:9200 设置 Kibana 运行时连接的 Elasticsearch 节点的地址,这里指定了 Elasticsearch 服务的地址为 http://es:9200,其中 “es” 是 Elasticsearch 服务的容器名,而不是具体的 IP 地址。这是因为在 --network=es-net 中指定了容器连接到 “es-net” 网络,容器名会被解析为相应的 IP 地址。

  4. --network=es-net 将容器连接到名为 “es-net” 的网络上,确保 Kibana 能够与 Elasticsearch 容器进行通信。

  5. -p 5601:5601 将容器内部的 5601 端口映射到宿主机上,允许通过宿主机的 5601 端口访问 Kibana 的 Web 界面。

  6. kibana:7.12.1 指定要运行的 Docker 镜像的名称和版本号,这里是 Kibana 7.12.1 版本。

这个命令会在启动 Kibana 的同时连接到 Elasticsearch 服务,并映射 Kibana 的 Web 界面端口到宿主机,以便通过浏览器访问 Kibana 的用户界面进行 Elasticsearch 数据的可视化和管理。

当运行了这个命令之后,可以在浏览器中访问 宿主机IP:5601,然后就会进入 Kibana 的可视化界面:

1.3 利用 Kibana 演示 Elasticsearch 分词效果

在 Kibana 的可视化界面中,提供了一个 DevTools,在这个界面中我们就可以来编写 DSL 命令来操作 ElasticSearch,并且对 DSL 语句有提示和自动补全功能。

1. 打开 Kibana DevTools

首先,在 Kibana 的界面中找到左侧导航栏中的 “DevTools”,点击进入 DevTools 页面。

2. 编写分词演示 DSL 命令

在 DevTools 中,我们可以直接编写 DSL(Domain Specific Language,领域特定语言)命令来与 Elasticsearch 进行交互。以下是一个简单的演示,我们将使用 analyze API 来查看文本在分词阶段的效果。

什么是 DSL?
领域特定语言(Domain-Specific Language,DSL)是一种专注于解决特定问题领域的编程语言。与通用编程语言(如Java、Python)不同,DSL 被设计用来解决某一领域的具体问题,通常具有更高的表达能力和更简洁的语法。

例如,现在使用了 standard 分析器,它是 Elasticsearch 默认的分析器之一。要分析的文本是 “Elasticsearch is a powerful search engine.”。

POST _analyze
{
  "analyzer": "standard",
  "text": "Elasticsearch is a powerful search engine."
}

点击三角符号向 ElasticSearch 服务发送 HTTP 请求:

  1. 查看分词效果


上述结果显示了文本被分解成了多个词条(tokens),每个词条都有其在文本中的起始和结束位置。这样的分析对于搜索引擎来说是关键的,因为它决定了搜索时如何匹配文本。

另外,Elasticsearch 支持多种分析器,如:simplewhitespaceenglish 等,每个分析器有其自己的特性。选择不同的分词器,分词所得的结果也会有所不同。

二、解决中文分词的问题

2.1 默认分词器对中文分词的问题

在 Elasticsearch 中,默认的分词器在处理中文文本时可能会遇到一些问题,无法很好地将中文文本切分成有意义的词条。

例如下面的例子:

POST _analyze
{
  "analyzer": "standard",
  "text": "Elasticsearch 是一个强大的搜索引擎。"
}

使用上面的 DSL 语句得到的分词结果为:


此时发现,对于中文的分词是一个字就被分成了一个词条,要解决这个问题可以使用 IK 分词器。

2.2 引入 IK 分词器

当需要处理中文分词使,一般都会使用 IK 分词器。

项目下载地址: https://github.com/medcl/elasticsearch-analysis-ik。

为 ElasticSearch 引入 IK 分词器有两种方法:

1. 在线按照 IK 插件

按照的步骤和命令如下:

a)进入 ElasticSearch 容器内部

docker exec -it elasticsearch /bin/bash

b)在线下载并安装

./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

c)退出 ElasticSearch 容器

exit

d)重启 ElasticSearch 容器

docker restart elasticsearch

2. 离线按照 IK 插件

a)查看数据卷目录

安装插件需要知道 ElasticSearch 的plugins目录位置,我们中运行 ES 容器的时候实现了数据卷的挂载,因此需要查看 ES 容器的数据卷目录,通过下面命令查看:

 docker volume inspect es-plugins

b)进入挂载目录,然后之间将下载好的 IK 插件解压重命名后放到这个挂载目录下

c)重启 ES 容器

docker restart es

通过命令 docker logs -f es 查看 ES 容器的启动日志,就可以发现已经成功加载了 IK 分词器:

2.3 IK 分词器的两种分词模式

IK 分词器是一款专为中文文本设计的分词器,在 Elasticsearch 中包含两种主要的分词模式:ik_smartik_max_word。这两种模式在分词的细粒度上有所不同,适用于不同的应用场景。

下面演示两种模式的区别:

a)ik_smart 模式

DSL 语句:

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "Elasticsearch 是一个强大的搜索引擎。"
}

分词结果:

ik_smart 模式下,IK 分词器会进行最少切分,尽量保留专有名称和词组,以提高整体的可读性。

b)ik_max_word模式

DSL 语句:

POST _analyze
{
  "analyzer": "ik_max_word",
  "text": "Elasticsearch 是一个强大的搜索引擎。"
}

分词结果:


ik_max_word 模式下,IK 分词器会进行最细粒度的切分,尽量将文本拆分成单个词语,包括专有名称的切分。例如,对于 “搜索引擎”来说还进一步细分成了:“搜索”、“索引”、“引擎”。

2.4 IK 分词器存在的问题

尽管 IK 分词器可以针对中文进行分词,但是随着互联网的不断发展,越来越多的网络用语和新的词汇在不断的产生,例如下面的例子:

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "鸡你太美,鸡哥,坤坤,奥利给,啦啦啦,么么么,哒哒哒"
}

此时对于上述词汇的分词结果为:

通过这个结果可以发现,IK 分词器并不能对新的网络用语进行分词,并且一些语气词也需要参与分词。

2.5 IK 分词器拓展词库和停用词条

要解决上面使用 IK 分词器存在的问题可以对词典进行拓展和停用一些不必要或者敏感的词汇。

拓展词库:

要拓展 IK 分词器的词库,只需要修改 IK 分词器目录中的config目录下的IkAnalyzer.cfg.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
		<!--用户可以在这里配置自己的扩展字典 -->
		<entry key="ext_dict">ext.dic</entry>
</properties>

然后在名为ext.dic的文件中,添加想要拓展的词语即可:

停用词条:

要禁用某些不需要参与分词或者某些敏感词条,也是需要修改 IK 分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 -->
	<entry key="ext_dict">ext.dic</entry>
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords">stopword.dic</entry>
</properties>

然后在名为stopword.dic的文件中,添加想要停用的词语即可:

配置完成,重启 ES 容器,再次运行刚才的 DSL 语句:

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "鸡你太美,鸡哥,坤坤,奥利给,啦啦啦,么么么,哒哒哒"
}

此时的运行结果:


至此,就成功为 IK 分词器拓展和停用了词条。

三、使用 Kibana 操作索引库

三、使用 Kibana 操作索引库

3.1 Mapping 属性

在使用 Kibana 操作索引库之前,了解索引的 mapping 属性是非常重要的。Mapping 是对索引库中文档的结构和字段的约束,它定义了文档中每个字段的数据类型、分词器等属性。以下是一些常见的 mapping 属性:

1. type 字段数据类型

  • 字符串类型:

    • text:用于存储可分词的文本,通常用于全文搜索。
    • keyword:精确匹配的关键字,不分词,常用于过滤、聚合等场景。
  • 数值类型:

    • long, integer, short, byte, double, float:用于存储数值。
  • 布尔类型:

    • boolean:存储布尔值。
  • 日期类型:

    • date:存储日期和时间。
  • 对象类型:

    • object:存储复杂结构的对象。

2. index 是否创建索引

  • 默认为 true,表示创建索引。可以设置为 false,表示不创建索引,该字段不可搜索。

3. analyzer 使用的分词器

  • 定义字段使用的分词器,影响搜索和分词行为。

4. properties 子字段

  • 如果字段是对象类型,可以定义子字段的 mapping。

示例:

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "standard"
      },
      "price": {
        "type": "double"
      },
      "is_available": {
        "type": "boolean"
      },
      "created_at": {
        "type": "date"
      },
      "category": {
        "type": "keyword"
      },
      "details": {
        "type": "object",
        "properties": {
          "description": {
            "type": "text"
          },
          "manufacturer": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

上述示例定义了一个索引的 mapping,包含了不同类型的字段以及它们的属性。理解 mapping 对于在 Kibana 中正确操作索引非常重要,它影响了索引中文档的结构和 Elasticsearch 的行为。

3.2 创建和获取索引

在 Elasticsearch 中,创建和获取索引是操作索引库的基本步骤之一。下面是如何在 Kibana 中执行 DSL 代码来创建和获取索引的详细说明:

  1. 创建索引

DSL 代码:

PUT /demo
{
  "mappings": {
    "properties": {
      "info": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email":{
        "type": "keyword",
        "index": false
      },
      "name":{
        "properties": {
          "firstName":{
            "type":"keyword"
          },
          "lastName":{
            "type":"keyword"
          }
        }
      }
    }
  }
}

说明:

  • 使用 PUT 请求创建一个名为 demo 的索引库。
  • mappings 中定义了不同字段的属性,如 info 使用了中文分词器 ik_smart
  • email 字段设置了 indexfalse,表示不对该字段创建索引,该字段不可搜索。
  • name 字段是一个对象类型,包含 firstNamelastName 两个子字段。

执行结果:

在 Kibana 的 DevTools 中执行上述代码,会成功创建名为 demo 的索引库。

创建索引结果

  1. 获取索引

DSL 代码:

GET /索引名

说明:

  • 使用 GET 请求获取名为 demo 的索引库的信息。

执行结果:

在 Kibana 的 DevTools 中执行上述代码,会获取刚刚创建的 demo 索引的信息。

获取索引结果

通过以上步骤,可以成功创建索引并获取索引的信息。在实际应用中,创建和管理索引是构建 Elasticsearch 数据结构的基础,对于数据的存储和检索具有重要作用。

3.3 修改索引库

在 Elasticsearch 中,一旦索引库和其对应的 mapping 创建后,mapping 一般无法直接修改。但是,我们可以通过添加新的字段的方式来间接修改索引库。下面是具体的操作步骤:

DSL 代码:

PUT /demo/_mapping
{
  "properties": {
    "age": {
      "type": "integer"
    }
  }
}

说明:

  • 使用 PUT 请求修改 demo 索引库的 mapping。
  • properties 中定义了一个新的字段 age,数据类型为 integer

执行结果:

在 Kibana 的 DevTools 中执行上述代码,成功为 demo 索引库添加了一个新的字段 age

修改索引库结果

通过这种方式,我们可以对索引库进行修改,添加新的字段,以满足数据结构的演进和变化需求。需要注意的是,对于已经存在的文档,新添加的字段默认是 null 或者空值,具体行为取决于字段的数据类型。

3.4 删除索引库

在 Elasticsearch 中,如果需要删除一个索引库,可以使用 DELETE 请求。以下是删除 demo 索引库的操作步骤:

DSL 代码:

DELETE /demo

执行结果:

在 Kibana 的 DevTools 中执行上述代码,成功删除了名为 demo 的索引库。

删除索引库结果

注意:

  • 删除索引库是一个慎重的操作,会删除索引库中的所有数据和 mapping。
  • 如果尝试获取已删除的索引,将会得到 404 错误。

通过删除索引库,可以清空数据和结构,适用于重新创建索引或者不再需要的索引的情况。

四、使用 Kibana 实现对文档的增删改查

4.1 新增文档

在 Elasticsearch 中,新增文档是将数据存储到索引库中的过程。以下是在 Kibana DevTools 中使用 DSL 语法新增文档的详细说明:

DSL 代码:

POST /demo/_doc/1
{
  "info": "五虎上将之一",
  "email": "zy@demo.cn",
  "name": {
    "firstName": "云",
    "lastName": "赵"
  },
  "age": 18
}

说明:

  • 使用 POST 请求将文档新增到 demo 索引库中。
  • _doc 表示文档类型,1 是文档的唯一标识符。
  • 文档内容包括字段 infoemailnameage

执行结果:

在 Kibana 的 DevTools 中执行上述代码,成功新增了一个文档到 demo 索引库中。

新增文档结果

通过新增文档,可以将数据灵活地存储到 Elasticsearch 中,以便后续的检索和分析。

4.2 获取和删除文档

1. 获取文档

语法:

GET /索引库名/_doc/文档id 

例如,获取刚才新增的文档:

GET /demo/_doc/1

执行结果:

获取文档结果

2. 删除文档

删除文档使用的方法是 DELETE,DSL 语法如下:

DELETE /索引库名/_doc/文档id

例如,删除刚才新增的文档:

DELETE /demo/_doc/1

文档删除成功后,Elasticsearch 会返回一个包含删除信息的 JSON 响应。通过上述操作,我们可以灵活地对文档进行获取和删除,适用于不同的数据管理需求。

4.3 修改文档:全量修改和增量修改

在 Elasticsearch 中,对文档的修改主要分为全量修改和增量修改两种方式。

1. 全量修改

全量修改使用的方法是 PUT,它会删除旧文档并添加新文档。全量修改的语法如下:

PUT /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 省略
}

例如,对刚才新增的文档进行全量修改:

PUT /demo/_doc/1
{
  "info": "五虎上将之一",
  "email": "ZhaoYun@demo.cn",
  "name": {
    "firstName": "云",
    "lastName": "赵"
  },
  "age": 18
}

执行结果如下:

全量修改结果

实际上,全量修改相当于删除原有的文档内容,然后进行新增操作。因此,此处 PUT 的作用也相当于新增。

** 2. 增量修改**

增量修改使用的方法是 POST,它可以修改指定字段的值。增量修改的语法如下:

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

例如,对刚才新增的文档进行增量修改:

POST /demo/_update/1
{
  "doc":{
    "email":"ZYun@demo.cn"
  }
}

执行结果如下:

增量修改结果

通过上述操作,我们可以实现对文档内容的全量修改和增量修改,具体选择哪种方式取决于业务需求和数据管理的策略。全量修改适用于需要更新整个文档内容的场景,而增量修改则更灵活,可以选择性地更新部分字段。

4.4 文档的版本号

什么是文档的版本号:

在 Elasticsearch 中,每个文档都有一个版本号(version),用于标识文档的变更历史。当对文档进行修改时,版本号会随之递增,每次修改都会生成一个新的版本。

为什么需要文档的版本号:

文档的版本号在并发写入和更新的场景中起到了重要的作用。当多个客户端同时尝试修改同一文档时,通过版本号可以确保写入的顺序和一致性。在分布式系统中,版本号还用于控制数据的一致性和冲突解决。

例如,对于 id 为 1 的文档:

1. 新增时,_version 为 1

2. 第一次修改后,_version 变为 2

3. 再次修改后,_version 变为 3

通过上面的操作,可以发现一个规律。那就是每修改一次文档,那么该文档的版本号就会加 1。

版本号的作用:

版本号在处理并发写入、更新和冲突解决时非常重要。通过版本号,Elasticsearch 可以确保在并发修改的情况下,数据的一致性和正确性。当多个客户端尝试修改同一文档时,只有最新的版本会被接受,避免了数据的混乱和冲突。

版本号的使用让 Elasticsearch 成为一个强大的分布式数据库,能够处理大规模的并发写入和更新操作。

4.5 动态 Mapping 映射

在 Elasticsearch 中,我们有时会遇到需要向索引中添加新字段的情况。这就涉及到了动态 Mapping 映射的概念。动态 Mapping 是 Elasticsearch 在插入文档时自动识别字段类型并进行映射的机制。

让我们通过一个具体的例子来说明动态 Mapping 的工作原理。假设我们向索引中插入以下文档:

PUT /demo/_doc/2
{
  "info": "五虎上将之一",
  "email": "zf@demo.cn",
  "name": {
    "firstName": "飞",
    "lastName": "张"
  },
  "age": 35,
  "score": [98.5, 98.9, 97.9, 99.2],
  "isMarried": false,
  "birthday": "1988-05-20",
  "city": "上海"
}

执行结果:

这个文档中包含了索引中之前未见过的字段,例如 scoreisMarriedbirthdaycity。然而,Elasticsearch 并没有报错,而是成功插入了文档。这是因为 Elasticsearch 会自动进行动态 Mapping 映射。

动态 Mapping 映射的规则如下:

JSON类型Elasticsearch类型
字符串日期格式字符串:date 类型;普通字符串:text 类型,并添加 keyword 类型子字段
布尔值boolean 类型
浮点数float 类型
整数long 类型
对象嵌套object 类型,并添加 properties
数组由数组中的第一个非空类型决定
空值将被忽略

通过动态 Mapping,Elasticsearch 能够灵活地处理文档中新增的字段,为我们提供了方便和便利。这种功能使得 Elasticsearch 能够智能地适应不断变化的数据结构,为索引的管理提供了灵活性。

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

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

相关文章

HTTP爬虫IP:流量or数量计费模式那个更适合爬虫?

在使用HTTP爬虫IP时&#xff0c;我们常常需要考虑计费方式&#xff1a;按流量计费还是按数量计费。这两种计费方式各有优势&#xff0c;但是哪种更加划算呢&#xff1f;本文将为您深入探讨HTTP爬虫IP的流量计费和数量计费的特点、适用场景以及选择适合自己的计费方式的实用技巧…

MySQL学习笔记(快速入门)

一、数据库相关概念 名称全称简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管理系统操纵和管理数据库的大型软件DataBase Management System (DBMS)SQL操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数…

[PyTorch][chapter 57][WGAN-GP 代码实现]

前言&#xff1a; 下图为WGAN 的效果图&#xff1a; 绿色为真实数据的分布&#xff1a; 8个高斯分布 红色&#xff1a; 为随机产生的数据分布&#xff0c;跟真实分布基本一致 WGAN-GP&#xff1a; 1 判别器D: 最后一层去掉sigmoid 2 生成器G 和判别器D: loss不取log 3 损失函数…

Spring AOP 详解及@Trasactional

Spring AOP 详解 AOP基础 AOP: Aspect Oriented Program, 面向切面编程。解耦&#xff08;组织结构调整&#xff09;、增强&#xff08;扩展&#xff09;。 AOP术语 术语 说明 Aspect&#xff08;切面&#xff09; 横切于系统的连接点实现特定功能的类 JoinPoint&#xf…

Axios、SASS学习笔记

目录 前言 一、Axios基础认识 1、简介 2、相关文档 3、基本配置 4、基础快捷使用 二、Axios封装 1、公共配置文件 2、细化每个接口的配置 3、使用并发送请求 三、SASS 1、简介 2、相关文档 3、使用前奏 4、使用变量 5、嵌套规则 6、父级选择器标识 & 前言…

小谈设计模式(10)—原型模式

小谈设计模式&#xff08;10&#xff09;—原型模式 专栏介绍专栏地址专栏介绍 原型模式角色分类抽象原型&#xff08;Prototype&#xff09;具体原型&#xff08;Concrete Prototype&#xff09;客户端&#xff08;Client&#xff09;原型管理器&#xff08;Prototype Manager…

《C++ Primer》第4章 表达式(二)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 4.6 成员访问运算符&#xff08;P133&#xff09; 点运算符和箭头运算符都可用于访问成员&#xff0c;ptr->mem 等价于 (*ptr).mem 。箭头作用于指针类型对象&#xff0c;结果为左值&#xff1b;点运算符…

【Mysql】 blob 转text

有个数据表字段存储的字段类型是blob&#xff0c;想查看字段内容。 blob是二进制的无法直接查看怎么办&#xff1f; 写sql&#xff0c;blob 转text SELECT CONVERT(content USING utf8) FROM article_content ; 我想把原来content字段完全转成text 新建 text 类型字段conten…

uniapp 在uni.scss 根据@mixin定义方法 、通过@include全局使用

在官方文档中提及到uni.scss中变量的使用&#xff0c;而我想定义方法&#xff0c;这样写css样式更方便 一、官方文档的介绍 根据官方文档我知道&#xff0c;在这面定义的变量全局都可使用。接下来我要在这里定义方法。 二、在uni.scss文件中定义方法 我在uni.scss文件中定义了…

三、浏览器缓存动如何使用(Expires、 cache-control、Etag、last-modified)----哪些文件需要强缓存,哪些文件需要协商缓存

参考链接1&#xff1a;彻底弄懂强缓存与协商缓存 参考链接2&#xff1a;浏览器缓存 参考链接3&#xff1a;扼杀 304&#xff0c;Cache-Control: immutable 如何搭建 express&#xff0c;或者node服务 ### 如何搭建 express&#xff0c;npm install express --save### expre…

[C++基础]-多态

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 本期学习目标&am…

智能AI系统源码ChatGPT系统源码+详细搭建部署教程+AI绘画系统+已支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Chat…

NFT Insider#110:The Sandbox与TB Media Global合作,YGG Web3游戏峰会阵容揭晓

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#xff0…

双字单字拆分/合并操作(博途SCL源代码)

博途PLC的位、字节拆分和合并操作还可以参考下面的文章链接: 博途PLC 位/字/字节 Bit/ Word/Byte拆分与合并_博途的bit-CSDN博客有时候我们需要将分散分布的开关量信号组合为一个整体比如一个字节再完成发送,或者一些报警联锁控制,组合为一个字方便触摸屏报警记录等,下面我…

day11_oop_面向对象基础

零、今日内容 一、作业 二、面向对象 一、作业 题目26 设计方法,在一个数组中&#xff0c;返回所有的 指定数据的下标 例如, 这个数组[1,2,8,4,5,7,8,7,8,9],找到其中元素8的下标[2,6,8]public static void main(String[] args) {int[] arr {1,2,8,4,5,7,8,7,8,9};int[] ind…

云计算安全的新挑战:零信任架构的应用

文章目录 云计算的安全挑战什么是零信任架构&#xff1f;零信任架构的应用1. 多因素身份验证&#xff08;MFA&#xff09;2. 访问控制和策略3. 安全信息和事件管理&#xff08;SIEM&#xff09;4. 安全的应用程序开发 零信任架构的未来 &#x1f389;欢迎来到云计算技术应用专栏…

vue-3

一、文章内容概括 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 二、Vue生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09…

二叉搜索树的初步认识

二叉搜索树与常见的查找算法有什么区别&#xff1f; 首先&#xff0c;如果有同学不知道有哪些查找算法可以查看&#xff1a;常见查找算法_加瓦不加班的博客-CSDN博客 如果还有一些不了解的&#xff0c;请查看加瓦不加班_数据结构,链表,递归-CSDN博客 接下来&#xff0c;我们来…

玄子Share- IDEA 2023 SpringBoot 热部署

玄子Share- IDEA 2023 SpringBoot 热部署 修改 IDEA 部署设置 IDEA 勾选如下选项 新建 SpringBoot 项目 项目构建慢的将 Spring Initializr 服务器 URL 改为阿里云&#xff1a;https://start.aliyun.com/ 在这里直接勾选Spring Boot Devtools插件即可 测试 切出 IDEA 项目文…

「专题速递」AR协作、智能NPC、数字人的应用与未来

元宇宙是一个融合了虚拟现实、增强现实、人工智能和云计算等技术的综合概念。它旨在创造一个高度沉浸式的虚拟环境&#xff0c;允许用户在其中交互、创造和共享内容。在元宇宙中&#xff0c;人们可以建立虚拟身份、参与虚拟社交&#xff0c;并享受无限的虚拟体验。 作为互联网大…