Elasticsearch:使用 ES|QL

news2024/11/26 8:45:30

在我之前的文章 “Elasticsearch:ES|QL 查询语言简介”,我对 ES|QL 做了一个简单的介绍。在今天的文章中,我们来描述如何使用 ES|QL。

REST API

这个用来返回 ES|QL (Elasticsearch qyery language) 的查询结果。它具有如下的格式:

POST /_query
{
  "query": """
    FROM library
    | EVAL year = DATE_TRUNC(1 YEARS, release_date)
    | STATS MAX(page_count) BY year
    | SORT year
    | LIMIT 5
  """
}

请求

POST _query

前提条件

  • 如果启用了 Elasticsearch 安全功能,你必须对你搜索的数据流、索引或别名具有读取索引权限。

请求参数

参数描述
delimiter(可选,字符串)CSV 结果的分隔符。 默认为 ,。 API 仅支持 CSV 响应的此参数。
format

(可选,字符串)响应的格式。 有关有效值,请参阅如下的响应格式。

你还可以使用 Accept HTTP 标头指定格式。 如果你同时指定此参数和 Accept HTTP 标头,则此参数优先。

响应格式

ES|QL 可以以以下人类可读和二进制格式返回数据。 你可以通过在 URL 中指定格式参数或设置 Accept 或 Content-Type HTTP 标头来设置格式。

注意:URL 参数优先于 HTTP 标头。 如果两者均未指定,则响应将以与请求相同的格式返回。

format

HTTP header

Description

Human readable

csv

text/csv

Comma-separated values

json

application/json

JSON (JavaScript Object Notation) human-readable format

tsv

text/tab-separated-values

Tab-separated values

txt

text/plain

CLI-like representation

yaml

application/yaml

YAML (YAML Ain’t Markup Language) human-readable format

Binary

cbor

application/cbor

Concise Binary Object Representation

smile

application/smile

Smile binary data format similar to CBOR

csv 格式接受格式化 URL 查询属性分隔符,该属性指示应使用哪个字符来分隔 CSV 值。 默认为逗号 (,),并且不能采用以下任何值:双引号 (")、回车符 (\r) 和换行符 (\n)。也不能使用制表符 (\t)。请改用 tsv 格式。

请求 body

参数描述
columnar(可选,布尔值)如果为 true,则以列格式返回结果。 默认为 false。 API 仅支持 CBOR、JSON、SMILE 和 YAML 响应的此参数。 请参阅下面的 columnar results。
params(可选,数组)查询中参数的值。 有关语法,请参阅下面的将参数传递给查询。
query(必需,对象)要运行的 ES|QL 查询。 有关语法,请参阅语法参考。
time_zone可选,字符串)用于搜索的 ISO-8601 时区 ID。 多个 ES|QL 日期/时间函数使用此时区。 默认为 Z (UTC)。

响应 body

项目描述
columns

(对象数组)搜索结果的列标题。 每个对象都是一列。

columns 对象的属性

  • name(字符串)列的名称。
  • type(字符串)列的数据类型。
rows(数组的数组)搜索结果的值。

实例

总览

ES|QL 查询 API 接受查询参数中的 ES|QL 查询字符串,运行它并返回结果。 例如:

POST /_query?format=txt
{
  "query": "FROM library | KEEP author, name, page_count, release_date | SORT page_count DESC | LIMIT 5"
}

上面搜索的结果为:

     author      |        name        |  page_count   | release_date
-----------------+--------------------+---------------+------------------------
Peter F. Hamilton|Pandora's Star      |768            |2004-03-02T00:00:00.000Z
Vernor Vinge     |A Fire Upon the Deep|613            |1992-06-01T00:00:00.000Z
Frank Herbert    |Dune                |604            |1965-06-01T00:00:00.000Z
Alastair Reynolds|Revelation Space    |585            |2000-03-15T00:00:00.000Z
James S.A. Corey |Leviathan Wakes     |561            |2011-06-02T00:00:00.000Z

Kibana 控制台

如果你使用 Kibana 控制台(强烈推荐),请在创建查询时利用三引号 """。这不仅会自动转义查询字符串内的双引号 ("),而且还支持多行请求:

POST /_query?format=txt
{
  "query": """
    FROM library
    | KEEP author, name, page_count, release_date
    | SORT page_count DESC
    | LIMIT 5
  """
}

使用 Elasticsearch Query DSL 进行过滤

在过滤器参数中指定 Query DSL 查询以过滤运行 ES|QL 查询的文档集。

POST /_query?format=txt
{
  "query": """
    FROM library
    | KEEP author, name, page_count, release_date
    | SORT page_count DESC
    | LIMIT 5
  """,
  "filter": {
    "range": {
      "page_count": {
        "gte": 100,
        "lte": 200
      }
    }
  }
}

返回:

    author     |                name                |  page_count   | release_date
---------------+------------------------------------+---------------+------------------------
Douglas Adams  |The Hitchhiker's Guide to the Galaxy|180            |1979-10-12T00:00:00.000Z

列结果 - columnar results

默认情况下,ES|QL 以行形式返回结果。 例如,FROM 将每个单独的文档作为一行返回。 对于 json、yaml、cbor 和 smile 格式,ES|QL 可以以列方式返回结果,其中一行代表结果中所有列的值。

POST /_query?format=json
{
  "query": """
    FROM library
    | KEEP author, name, page_count, release_date
    | SORT page_count DESC
    | LIMIT 5
  """,
  "columnar": true
}

返回:

{
  "columns": [
    {"name": "author", "type": "text"},
    {"name": "name", "type": "text"},
    {"name": "page_count", "type": "integer"},
    {"name": "release_date", "type": "date"}
  ],
  "values": [
    ["Peter F. Hamilton", "Vernor Vinge", "Frank Herbert", "Alastair Reynolds", "James S.A. Corey"],
    ["Pandora's Star", "A Fire Upon the Deep", "Dune", "Revelation Space", "Leviathan Wakes"],
    [768, 613, 604, 585, 561],
    ["2004-03-02T00:00:00.000Z", "1992-06-01T00:00:00.000Z", "1965-06-01T00:00:00.000Z", "2000-03-15T00:00:00.000Z", "2011-06-02T00:00:00.000Z"]
  ]
}

将参数传递给查询

通过将值集成到查询字符串本身,可以将值(例如条件的值)传递给 “内联(inline)” 查询:

POST /_query
{
  "query": """
    FROM library
    | EVAL year = DATE_EXTRACT("year", release_date)
    | WHERE page_count > 300 AND author == "Frank Herbert"
    | STATS count = COUNT(*) by year
    | WHERE count > 0
    | LIMIT 5
  """
}

为了避免任何黑客攻击或代码注入的尝试,请在单独的参数列表中提取值。 在每个参数的查询字符串中使用问号占位符 (?):

POST /_query
{
  "query": """
    FROM library
    | EVAL year = DATE_EXTRACT("year", release_date)
    | WHERE page_count > ? AND author == ?
    | STATS count = COUNT(*) by year
    | WHERE count > ?
    | LIMIT 5
  """,
  "params": [300, "Frank Herbert", 0]
}

在 Kibana 中使用 ES|QL

你可以在 Kibana 中使用 ES|QL 来查询和聚合数据、创建可视化并设置警报。

本指南向你展示如何在 Kibana 中使用 ES|QL。 要执行查询,请加载 “Sample Web 日志” 示例数据集,方法是单击来自 Kibana Home 的 “Try sample data”,选择 “Other sample data sets”,然后单击 “Sample web logs”卡上的 “Add data”。

ES|QL 入门

要开始在 Discover 中使用 ES|QL,请打开主菜单并选择 Discover。 接下来,从数据视图菜单中选择 Try ES|QL。

可以使用高级设置中的 discovery:enableESQL 设置来启用和禁用从数据视图菜单中选择 ES|QL 的功能。

查询栏

切换到 ES|QL 模式后,查询栏会显示示例查询。 例如:

from kibana_sample_data_logs | limit 10

每个查询都以源命令开始。 在此查询中,源命令是 FROM。 FROM 从数据流、索引或别名中检索数据。 在此示例中,数据是从 kibana_sample_data_logs 检索的。

源命令后面可以跟一个或多个处理命令。 在该查询中,处理命令是 LIMIT。 LIMIT 限制检索的行数。

提示:单击帮助图标 (esql 图标帮助)可打开所有命令和功能的产品内参考文档。

为了更轻松地编写查询,自动完成功能会提供包含可能的命令和功能的建议:

注意:ES|QL 关键字不区分大小写。 以下查询与前一个查询相同:

FROM kibana_sample_data_logs | LIMIT 10

展开查询栏

为了便于阅读,你可以将每个处理命令另起一行。 以下查询与前一个查询相同:

FROM kibana_sample_data_logs
| LIMIT 10

为了更方便地编写多行查询,请单击双头箭头按钮 (esql 图标展开查询栏)来展开查询栏:

要返回紧凑查询栏,请单击最小化编辑器按钮 (esql 图标最小化查询栏)。

警告

查询可能会导致警告,例如在查询不受支持的字段类型时。 发生这种情况时,查询栏中会显示警告符号。 要查看详细警告,请展开查询栏,然后单击 warnings

结果表

对于示例查询,结果表显示 10 行。 省略 LIMIT 命令,结果表默认最多 500 行。 使用 LIMIT,你可以将限制增加到最多 10,000 行。

注意:10,000 行限制仅适用于查询检索并显示在 Discover 中的行数。 任何查询或聚合都在完整数据集上运行。

每行显示示例查询的两列:包含 @timestamp 字段的列和包含完整文档的列。 要显示文档中的特定字段,请使用 KEEP 命令:

FROM kibana_sample_data_logs
| KEEP @timestamp, bytes, geo.dest

要将所有字段显示为单独的列,请使用 KEEP *:

FROM kibana_sample_data_logs
| KEEP *

注意:Discover 中的最大列数为 50。如果查询返回超过 50 列,Discover 只显示前 50 列。

排序

要对其中一列进行排序,请单击要排序的列名称并选择排序顺序。 请注意,这执行客户端排序。 它仅对查询检索到的行进行排序,由于(隐式)限制,这些行可能不是完整的数据集。 要对完整数据集进行排序,请使用 SORT 命令:

FROM kibana_sample_data_logs
| KEEP @timestamp, bytes, geo.dest
| SORT bytes DESC

时间过滤

要显示指定时间范围内的数据,请使用 time filter。 仅当你查询的索引具有名为 @timestamp 的字段时,才会启用时间过滤器。

如果你的索引没有名为 @timestamp 的时间戳字段,你可以使用 WHERE 命令和 NOW 函数限制时间范围。 例如时间戳字段名为 timestamp,查询最近15分钟的数据:

FROM kibana_sample_data_logs
| WHERE timestamp > NOW() - 15minutes

分析和可视化数据

Discover 在查询栏和结果表之间显示日期直方图可视化。 如果你正在查询的索引不包含 @timestamp 字段,则不会显示直方图。

可视化适应查询。 查询的性质决定了可视化的类型。 例如,此查询聚合每个目标国家/地区的总字节数:

FROM kibana_sample_data_logs
| STATS total_bytes = SUM(bytes) BY geo.dest
| SORT total_bytes DESC
| LIMIT 3

生成的可视化结果是一个显示前 3 个国家/地区的条形图:

要将可视化更改为其他类型,请单击可视化类型下拉列表:

要对可视化进行其他更改(例如轴和颜色),请单击铅笔按钮 (esql 图标编辑可视化)。 这将打开一个内联编辑器:

你可以通过单击保存按钮 (esql 图标保存可视化)将可视化保存到新的或现有的仪表板。 保存到仪表板后,你可以继续对可视化进行更改。 单击右上角的选项按钮 (esql 图标选项)并选择 Edit ESQL Visualization 以打开内联编辑器:

制定丰富政策

ES|QL ENRICH 命令使你能够使用另一个数据集的字段来 enrich 查询数据集。 在使用 ENRICH 之前,你需要创建并执行丰富策略。 如果存在策略,则会自动完成建议。 如果没有,请单击 “Click to create” 来创建一个。

接下来,你可以输入策略名称、策略类型、源索引和可选的查询:

点击 Next 选择匹配字段并丰富字段:

最后点击 Create and execute

现在,你可以在 ES|QL 查询中使用丰富策略:

创建警报规则

你可以使用 ES|QL 查询来创建警报。 从 Discover 中,单击 Alerts 并选择 Create search threshold rule。 这将打开一个面板,使你能够使用 ES|QL 查询创建规则。 接下来,你可以测试查询、添加连接器并保存规则。

局限性

  • 当 Discover 处于 ES|QL 模式时,不会启用用于过滤数据的用户界面。 要过滤数据,请编写一个使用 WHERE 命令的查询。
  • 在 ES|QL 模式下,单击 “Discover” 字段列表中的字段不会显示该字段的快速统计信息。
  • Discover 显示的行数不超过 10,000 行。 此限制仅适用于查询检索并显示在 Discover 中的行数。 任何查询或聚合都在完整数据集上运行。
  • Discover 显示不超过 50 列。 如果查询返回超过 50 列,Discover 仅显示前 50 列。
  • 在没有任何过滤器的情况下一次查询许多索引可能会导致 Kibana 出现错误,类似于 esql] > Unexpected error from Elasticsearch: The content length (536885793) is bigger than the maximum allowed string (536870888). 内容长度 (536885793) 大于允许的最大字符串 (536870888)。 ES|QL 的响应太长。 使用 DROP 或 KEEP 来限制返回的字段数。

任务管理

我们可以使用 task management API 来列举及取消 ES|QL 查询。这个 API 返回有关集群中当前正在执行的任务的信息。

警告:Task management API 是新的,仍应被视为测试版功能。 API 可能会以不向后兼容的方式进行更改。 有关功能状态,请参阅 #51628。

请求

GET /_tasks/<task_id>

GET /_tasks

先决条件

如果启用了Elasticsearch安全功能,你必须具有 monitor 或  manage 集群权限才能使用此 API。

描述

任务管理 API 返回有关当前在集群中的一个或多个节点上执行的任务的信息。

Path 参数

<task_id>
(可选,字符串)要返回的任务 ID (node_id:task_number)。

请求参数

名称描述
actions

(可选,字符串)用于限制请求的操作的逗号分隔列表或通配符表达式。

省略此参数将返回所有操作。

detailed(可选,布尔值)如果为 true,则响应包括有关分片恢复的详细信息。 默认为 false。
group_by

(可选,字符串)用于对响应中的任务进行分组的键。

可能的值为:

  • nodes - 缺省为 Node ID
  • parents - Parent task ID
  • none - 不要对任务进行分组
nodes(可选,字符串)用于限制返回信息的节点 ID 或名称的逗号分隔列表。
parent_task_id

(可选,字符串)用于限制返回信息的父任务 ID。

要返回所有任务,请省略此参数或使用值 -1。

master_timeout(可选,时间单位)等待连接到主节点的时间。 如果超时之前未收到响应,则请求失败并返回错误。 默认为 30 秒。
timeout(可选,时间单位)等待响应的时间。 如果超时之前未收到响应,则请求失败并返回错误。 默认为 30 秒。
wait_for_completion(可选,布尔值)如果为 true,则请求将阻塞,直到所有找到的任务完成。 默认为 false。

响应代码

404(缺少资源)

如果指定了 <task_id> 但未找到,则此代码表示没有与请求匹配的资源。

例子

GET _tasks (1)
GET _tasks?nodes=nodeId1,nodeId2 (2)
GET _tasks?nodes=nodeId1,nodeId2&actions=cluster:* (3)
  1. 检索当前在集群中所有节点上运行的所有任务。
  2. 检索在节点 nodeId1 和 nodeId2 上运行的所有任务。 有关如何选择单个节点的更多信息,请参阅节点规范。
  3. 检索在节点 nodeId1 和 nodeId2 上运行的所有与集群相关的任务。

API 返回以下结果:

{
  "nodes" : {
    "oTUltX4IQMOUUVeiohTt8A" : {
      "name" : "H5dfFeA",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1:9300",
      "tasks" : {
        "oTUltX4IQMOUUVeiohTt8A:124" : {
          "node" : "oTUltX4IQMOUUVeiohTt8A",
          "id" : 124,
          "type" : "direct",
          "action" : "cluster:monitor/tasks/lists[n]",
          "start_time_in_millis" : 1458585884904,
          "running_time_in_nanos" : 47402,
          "cancellable" : false,
          "parent_task_id" : "oTUltX4IQMOUUVeiohTt8A:123"
        },
        "oTUltX4IQMOUUVeiohTt8A:123" : {
          "node" : "oTUltX4IQMOUUVeiohTt8A",
          "id" : 123,
          "type" : "transport",
          "action" : "cluster:monitor/tasks/lists",
          "start_time_in_millis" : 1458585884904,
          "running_time_in_nanos" : 236042,
          "cancellable" : false
        }
      }
    }
  }
}

从特定任务中检索信息

还可以检索特定任务的信息。 以下示例检索有关任务 oTUltX4IQMOUUVeiohTt8A:124 的信息:

GET _tasks/oTUltX4IQMOUUVeiohTt8A:124

如果未找到任务,API 将返回 404。

要检索特定任务的所有子任务:

GET _tasks?parent_task_id=oTUltX4IQMOUUVeiohTt8A:123

如果未找到父级,API 不会返回 404。

获取有关任务的更多信息

你还可以使用 detailed 请求参数来获取有关正在运行的任务的更多信息。 这对于区分任务很有用,但执行成本更高。 例如,使用 detailed 请求参数获取所有搜索:

GET _tasks?actions=*search&detailed

API 返回以下结果:

{
  "nodes" : {
    "oTUltX4IQMOUUVeiohTt8A" : {
      "name" : "H5dfFeA",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1:9300",
      "tasks" : {
        "oTUltX4IQMOUUVeiohTt8A:464" : {
          "node" : "oTUltX4IQMOUUVeiohTt8A",
          "id" : 464,
          "type" : "transport",
          "action" : "indices:data/read/search",
          "description" : "indices[test], types[test], search_type[QUERY_THEN_FETCH], source[{\"query\":...}]",
          "start_time_in_millis" : 1483478610008,
          "running_time_in_nanos" : 13991383,
          "cancellable" : true,
          "cancelled" : false
        }
      }
    }
  }
}

新的 description 字段包含人类可读的文本,该文本标识任务正在执行的特定请求,例如标识由搜索任务正在执行的搜索请求,如上面的示例。 其他类型的任务有不同的描述,例如 _reindex 具有源和目标,或 _bulk 只具有请求数和目标索引。 许多请求仅具有空的描述,因为关于请求的更详细的信息不容易获得或者对于识别请求特别有帮助。

重要:带有详细信息的 _tasks 请求也可能返回状态。 这是任务内部状态的报告。 因此,其格式因任务而异。 虽然我们试图保持特定任务的状态在各个版本之间保持一致,但这并不总是可行,因为我们有时会更改实现。 在这种情况下,我们可能会从特定请求的状态中删除字段,因此你对状态所做的任何解析都可能会在次要版本中中断。

等待完成

任务 API 还可用于等待特定任务的完成。 以下调用将阻塞 10 秒,或者直到 I

POST _tasks/oTUltX4IQMOUUVeiohTt8A:12345/_cancel

D 为 oTUltX4IQMOUUVeiohTt8A:12345 的任务完成。

GET _tasks/oTUltX4IQMOUUVeiohTt8A:12345?wait_for_completion=true&timeout=10s

你还可以等待某些操作类型的所有任务完成。 此命令将等待所有 reindex 任务完成:

GET _tasks?actions=*reindex&wait_for_completion=true&timeout=10s

任务取消

如果长时间运行的任务支持取消,则可以使用取消任务 API 取消它。 以下示例取消任务 oTUltX4IQMOUUVeiohTt8A:12345:

POST _tasks/oTUltX4IQMOUUVeiohTt8A:12345/_cancel

任务取消命令支持与列表任务命令相同的任务选择参数,因此可以同时取消多个任务。 例如,以下命令将取消在节点 nodeId1 和 nodeId2 上运行的所有重新索引任务。

POST _tasks/_cancel?nodes=nodeId1,nodeId2&actions=*reindex

任务在被取消后可能会继续运行一段时间,因为它可能无法立即安全地停止其当前活动,或者因为 Elasticsearch 必须完成其他任务的工作才能处理取消。 列表任务 API 将继续列出这些已取消的任务,直到它们完成。 列表任务 API 响应中的 cancelled 标志表示取消命令已被处理,任务将尽快停止。 要排查取消的任务无法立即完成的原因,请使用带有 ?detailed 参数的列表任务 API 来识别系统正在运行的其他任务,并使用 Nodes 热线程 API 来获取有关系统正在执行的工作的详细信息完成取消的任务。

任务分组

任务 API 命令返回的任务列表可以按节点(默认)分组,也可以使用 group_by 参数按父任务分组。 以下命令会将分组更改为父任务:

GET _tasks?group_by=parents

可以通过指定 none 作为 group_by 参数来禁用分组:

GET _tasks?group_by=none

识别正在运行的任务

X-Opaque-Id 标头在 HTTP 请求标头上提供时,将作为响应中的标头以及任务信息的标头字段中返回。 这允许跟踪某些呼叫,或将某些任务与启动它们的客户端相关联:

curl -i -H "X-Opaque-Id: 123456" "http://localhost:9200/_tasks?group_by=parents"

API 返回以下结果:

HTTP/1.1 200 OK
X-Opaque-Id: 123456 (1)
content-type: application/json; charset=UTF-8
content-length: 831

{
  "tasks" : {
    "u5lcZHqcQhu-rUoFaqDphA:45" : {
      "node" : "u5lcZHqcQhu-rUoFaqDphA",
      "id" : 45,
      "type" : "transport",
      "action" : "cluster:monitor/tasks/lists",
      "start_time_in_millis" : 1513823752749,
      "running_time_in_nanos" : 293139,
      "cancellable" : false,
      "headers" : {
        "X-Opaque-Id" : "123456" (2)
      },
      "children" : [
        {
          "node" : "u5lcZHqcQhu-rUoFaqDphA",
          "id" : 46,
          "type" : "direct",
          "action" : "cluster:monitor/tasks/lists[n]",
          "start_time_in_millis" : 1513823752750,
          "running_time_in_nanos" : 92133,
          "cancellable" : false,
          "parent_task_id" : "u5lcZHqcQhu-rUoFaqDphA:45",
          "headers" : {
            "X-Opaque-Id" : "123456" (3)
          }
        }
      ]
    }
  }
}
  1. id 作为响应头的一部分
  2. 由 REST 请求启动的任务的 ID
  3. REST请求发起的任务的子任务

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

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

相关文章

MongoDB安全及系例全教程

一、系列文章目录 一、MongoDB安装教程—官方原版 二、MongoDB 使用教程(配置、管理、监控)_linux mongodb 监控 三、MongoDB 基于角色的访问控制 四、MongoDB用户管理 五、MongoDB基础知识详解 六、MongoDB—Indexs 七、MongoDB事务详解 八、MongoDB分片教程 九、Mo…

用扩散AI生成的合成数据的质量评估方法【4个指标】

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 为了生成有用的图像数据集&#xff0c;我们使用真实世界的照片数据集作为指南针&#xff0c;探索即时工程的艺术。 我们的稳定扩散&#xff08;…

PPT模板,免费下载!

找免费PPT模板就上这6个网站&#xff0c;各种模板、素材都能找到&#xff0c;质量还很高&#xff0c;赶紧收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYwNDUx 菜鸟图库网有非常丰富的免费素材&#xff0c;像设计类、办公类、自媒…

红海云签约中国煤科信息公司,数智引领科技型国企人力资源数字化变革

中煤科工集团信息技术有限公司&#xff08;以下简称“中国煤科信息公司”&#xff09;隶属于中国煤炭科工集团&#xff0c;作为中国煤科核心软件的研发中心、数据技术中心、内部信息化支撑中心&#xff0c;是中国煤科加快智能矿山建设和数字化转型的核心力量。 基于对数字化转…

软件设计模式原则(一)迪米特法则

开一个小专题——详细总结一下软件设计模式原则&#xff0c;这部分在《软计》和《java设计模式》中算是很重要的知识点&#xff0c;值得展开详细讲解一下~首先介绍的是【迪米特法则】 一.定义 迪米特法则又称为最少知识原则&#xff0c;其定义为&#xff1a;一个软件实体应当尽…

vue使用JsBarcode生成条形码

在工作中&#xff0c;有一个需求是接口返回的订单号生成条形码&#xff0c;如图&#xff1a; 1.安装依赖 yarn add jsbarcode2.引入 在script标签中引入 import JsBarcode from jsbarcode 3.使用 this.$refs.a.src的值为条形码的地址。 <template><div><img…

linux下多机器ssh免密码登录配置

20,21,22,23等4台机器配置ssh免密登陆 确认sshd配置 查看/etc/ssh/sshd_config文件&#xff0c;确认如下配置没有被注释掉&#xff1a; AuthorizedKeysFile .ssh/authorized_keys每一台机器修改hosts配置主机名&#xff08;可选&#xff09; 执行ssh命令&#xff0c;如…

积分球测试粉末反射率

积分球测试粉末主要是基于光在积分球内的反射和混合。具体来说&#xff0c;当光线进入积分球时&#xff0c;它将在球的内表面上进行反射。由于积分球的内表面是高反射材料&#xff0c;所以大部分光线将被反射&#xff0c;而不会逃逸出球体。在积分球内&#xff0c;光线经过多次…

基于51单片机的全自动洗衣机系统设计

**单片机设计介绍&#xff0c;基于51单片机的全自动洗衣机系统设计(仿真、程序、论文) 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的全自动洗衣机系统是一种集成控制、传感、显示等功能于一体的智能洗衣机系统&a…

Security ❀ UDP/TCP传输层常见DOS攻击详解

文章目录 1. UDP协议基础2. UDP Flood2.1. 攻击原理2.2. 防护方法 3. TCP三次握手和四次挥手3.1. 三次握手3.2. 四次挥手 4. SYN Flood4.1. 攻击原理4.2. 防护方法 5. SYN-ACK Flood5.1. 攻击原理5.2. 防护方法 6. ACK Flood6.1. 攻击原理6.2. 防护方法 7. FIN/RST Flood7.1. 攻…

来可电子基于UDS的ECU刷写方案

车辆电子控制单元&#xff08;ECU&#xff09;的刷写方式也正在发生重大变化。传统的ECU刷写方法通常使用CAN卡连接电脑进行&#xff0c;现在越来越多的汽车商家和软件开发人员开始采用基于总线UDS来进行ECU刷写。 1、通过我们LKmast上位机软件编写配置刷写步骤 2、导入到我们…

python将图片序列保存成gif

这里用到的模块是imageio。用imageio.mimsave即可将图片序列保存成gif动态图。以下是本人编写的小实验&#xff1a; import cv2 import imageiopaths ["./images/0001.png", "./images/0002.png", "./images/0003.png", ...] frames [] for i…

瑞禧生物分享纳米粉体~二硫化钼粉体 MoS2 纯度:99% 纳米二硫化钼(MoS2)

二硫化钼粉体 名称&#xff1a;二硫化钼粉体 纯度&#xff1a;99% 外观&#xff1a;粉末 纳米二硫化钼(MoS2)粉体硫化钼粉体 二硫化铝化学性质稳定、热稳定性好 、摩擦系数低 、润滑作用优 良且在较为苛 刻的工作环境下能保持 良好的摩擦性能因此二硫化铝被广泛应用于固体润…

一键报警可视对讲管理机10寸触摸屏管理机

一键报警可视对讲管理机10寸触摸屏管理机 一、管理机技术指标&#xff1a; 1、10寸LCD触摸屏&#xff0c;分辨率1024*600&#xff1b; 2、摄像头1200万像素 3、1000M/100M自适应网口&#xff1b; 4、按键设置&#xff1a;报警/呼叫按键&#xff0c;通话/挂机按键&#xff0…

count+group by

一、count()函数 1、count(*) 把所有的行数都查询出来&#xff0c;除非该行中所有的数据为null SELECTCOUNT(*) FROMemployees结果&#xff1a;107 2、count(commission_pct) 把指定列中所有的行数查出来&#xff0c;只要一行为null&#xff0c;那就不计数 SELECTCOUNT(com…

【Qt-22】Qt乱码问题解决

最近在Qt项目中遇到TCP通信接收数据乱码的问题&#xff0c;很是苦恼&#xff0c;经过多次尝试&#xff0c;终于得以解决。 感谢Qt TcpSocket 传递数据乱码显示_qt中socket接受到的客户端数据显示不出来-CSDN博客 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)_XX風的博客…

采购供应链思维导图

供应链采购&#xff0c;是指企业根据生产需要&#xff0c;通过与供应商签订合同&#xff0c;由供应商提供原材料、零部件、包装材料等&#xff0c;企业负责产品的制造&#xff0c;并将产品销售给用户的一种交易方式。 供应链管理 横向:采购把东西买进来&#xff0c;生产去加工增…

windows 使用 EasyScreenLive 和 EasyDarwin 软件实现相机 rtsp 推流

1. 下载软件 实现 rtsp 推流&#xff0c;需要运行&#xff08;1&#xff09;rtsp 服务器、&#xff08;2&#xff09;rtsp 推流客户端。 rtsp 服务器 EasyDarwin&#xff1a;https://github.com/EasyDarwin/EasyDarwin rtsp 推流客户端 EasyScreenLive&#xff1a;https://git…

打造个人的Minecraft服务器:Java+cpolar实现我的世界联机游戏

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …