Elasticsearch:Runtime fields - 运行时字段(二)
这是继上一篇文章 “Elasticsearch:Runtime fields - 运行时字段(一)” 的续篇。

在查询时覆盖字段值
如果你创建的运行时字段与映射中已存在的字段同名,则运行时字段会隐藏映射字段。在查询时,Elasticsearch 会评估运行时字段,根据脚本计算值,并将该值作为查询的一部分返回。由于运行时字段会隐藏映射字段,因此你可以覆盖搜索中返回的值而无需修改映射字段。
例如,假设你将以下文档编入 my-index-000001 索引:
DELETE my-index-000001POST my-index-000001/_bulk?refresh=true
{"index":{}}
{"@timestamp":1516729294000,"model_number":"QVKC92Q","measures":{"voltage":5.2}}
{"index":{}}
{"@timestamp":1516642894000,"model_number":"QVKC92Q","measures":{"voltage":5.8}}
{"index":{}}
{"@timestamp":1516556494000,"model_number":"QVKC92Q","measures":{"voltage":5.1}}
{"index":{}}
{"@timestamp":1516470094000,"model_number":"QVKC92Q","measures":{"voltage":5.6}}
{"index":{}}
{"@timestamp":1516383694000,"model_number":"HG537PU","measures":{"voltage":4.2}}
{"index":{}}
{"@timestamp":1516297294000,"model_number":"HG537PU","measures":{"voltage":4.0}}
后来你意识到 HG537PU 传感器没有报告其真实电压。索引值应该比报告值高 1.7 倍!你可以在 _search 请求的 Runtime_mappings 部分中定义一个脚本来隐藏 voltage 字段并在查询时计算新值,而不是重新索引数据。
如果你搜索型号与 HG537PU 匹配的文档:
GET my-index-000001/_search
{"query": {"match": {"model_number": "HG537PU"}}
}
响应包括与型号 HG537PU 匹配的文档的索引值:
{..."hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 1.0296195,"hits" : [{"_index" : "my-index-000001","_id" : "F1BeSXYBg_szTodcYCmk","_score" : 1.0296195,"_source" : {"@timestamp" : 1516383694000,"model_number" : "HG537PU","measures" : {"voltage" : 4.2}}},{"_index" : "my-index-000001","_id" : "l02aSXYBkpNf6QRDO62Q","_score" : 1.0296195,"_source" : {"@timestamp" : 1516297294000,"model_number" : "HG537PU","measures" : {"voltage" : 4.0}}}]}
}
以下请求定义了一个运行时字段,其中脚本评估 model_number 字段,其值为 HG537PU。对于每个匹配项,脚本将 voltage 字段的值乘以 1.7。
使用 _search API 上的 fields 参数,你可以检索脚本为与搜索请求匹配的文档的 measures.voltage 字段计算的值:
POST my-index-000001/_search
{"runtime_mappings": {"measures.voltage": {"type": "double","script": {"source":"""if (doc['model_number.keyword'].value.equals('HG537PU')){emit(1.7 * params._source['measures']['voltage']);}else{emit(params._source['measures']['voltage']);}"""}}},"query": {"match": {"model_number": "HG537PU"}},"fields": ["measures.voltage"]
}

查看响应,每个结果的 measures.voltage 计算值分别为 7.14 和 6.8。这更像了!运行时字段在搜索请求中计算了此值,但没有修改映射值,该值仍会在响应中返回。
检索运行时字段
使用 _search API 上的 fields 参数检索运行时字段的值。运行时字段不会显示在 _source 中,但 fields API 适用于所有字段,即使是那些未作为原始 _source 的一部分发送的字段。
定义运行时字段以计算星期几
例如,以下请求添加了一个名为 day_of_week 的运行时字段。运行时字段包含一个脚本,该脚本根据 @timestamp 字段的值计算星期几。我们将在请求中包含 "dynamic":"runtime",以便将新字段作为运行时字段添加到映射中。
DELETE my-index-000001PUT my-index-000001/
{"mappings": {"dynamic": "runtime","runtime": {"day_of_week": {"type": "keyword","script": {"source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))"}}},"properties": {"@timestamp": {"type": "date"}}}
}
提取一些数据
让我们提取一些示例数据,这将产生两个索引字段:@timestamp 和 message。
POST /my-index-000001/_bulk?refresh
{ "index": {}}
{ "@timestamp": "2020-06-21T15:00:01-05:00", "message" : "211.11.9.0 - - [2020-06-21T15:00:01-05:00] \"GET /english/index.html HTTP/1.0\" 304 0"}
{ "index": {}}
{ "@timestamp": "2020-06-21T15:00:01-05:00", "message" : "211.11.9.0 - - [2020-06-21T15:00:01-05:00] \"GET /english/index.html HTTP/1.0\" 304 0"}
{ "index": {}}
{ "@timestamp": "2020-04-30T14:30:17-05:00", "message" : "40.135.0.0 - - [2020-04-30T14:30:17-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
{ "index": {}}
{ "@timestamp": "2020-04-30T14:30:53-05:00", "message" : "232.0.0.0 - - [2020-04-30T14:30:53-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
{ "index": {}}
{ "@timestamp": "2020-04-30T14:31:12-05:00", "message" : "26.1.0.0 - - [2020-04-30T14:31:12-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
{ "index": {}}
{ "@timestamp": "2020-04-30T14:31:19-05:00", "message" : "247.37.0.0 - - [2020-04-30T14:31:19-05:00] \"GET /french/splash_inet.html HTTP/1.0\" 200 3781"}
{ "index": {}}
{ "@timestamp": "2020-04-30T14:31:27-05:00", "message" : "252.0.0.0 - - [2020-04-30T14:31:27-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
{ "index": {}}
{ "@timestamp": "2020-04-30T14:31:29-05:00", "message" : "247.37.0.0 - - [2020-04-30T14:31:29-05:00] \"GET /images/hm_brdl.gif HTTP/1.0\" 304 0"}
{ "index": {}}
{ "@timestamp": "2020-04-30T14:31:29-05:00", "message" : "247.37.0.0 - - [2020-04-30T14:31:29-05:00] \"GET /images/hm_arw.gif HTTP/1.0\" 304 0"}
{ "index": {}}
{ "@timestamp": "2020-04-30T14:31:32-05:00", "message" : "247.37.0.0 - - [2020-04-30T14:31:32-05:00] \"GET /images/nav_bg_top.gif HTTP/1.0\" 200 929"}
{ "index": {}}
{ "@timestamp": "2020-04-30T14:31:43-05:00", "message" : "247.37.0.0 - - [2020-04-30T14:31:43-05:00] \"GET /french/images/nav_venue_off.gif HTTP/1.0\" 304 0"}
搜索计算出的星期几
以下请求使用搜索 API 检索原始请求在映射中定义为运行时字段的 day_of_week 字段。此字段的值是在查询时动态计算的,无需重新索引文档或索引 day_of_week 字段。这种灵活性允许你修改映射而不更改任何字段值。
GET my-index-000001/_search
{"fields": ["@timestamp","day_of_week"],"_source": false
}

上一个请求返回所有匹配文档的 day_of_week 字段。我们可以定义另一个名为 client_ip 的运行时字段,该字段也对 message 字段进行操作,并将进一步细化查询。在查询之前,我们先查看一下索引的映射:
GET my-index-000001/_mapping

从上面我们可以看出来,由于我们在 mappings 中设置了 "dynamic": "runtime",那么 message 这个字段自动地被设置为 keyword 类型,而不是我们通常认为的 text 字段。也就是说 message 这个字段还具有 doc value。
我们可以通过如下的查询来返回 client_ip 这个字段:
PUT /my-index-000001/_mapping
{"runtime": {"client_ip": {"type": "ip","script" : {"source" : "String m = doc[\"message\"].value; int end = m.indexOf(\" \"); emit(m.substring(0, end));"}}}
}
运行另一个查询,但使用 client_ip 运行时字段搜索特定的 IP 地址:
GET my-index-000001/_search
{"size": 1,"query": {"match": {"client_ip": "211.11.9.0"}},"fields" : ["*"]
}

这次响应仅包含两个命中。day_of_week(星期日)的值是在查询时使用映射中定义的运行时脚本计算的,结果仅包含与 211.11.9.0 IP 地址匹配的文档。
从相关索引中检索字段
警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。
_search API 上的 fields 参数还可用于通过具有 lookup 类型的运行时字段从相关索引中检索字段。
注意:由 lookup 类型的运行时字段检索的字段可用于丰富搜索响应中的命中。无法查询或聚合这些字段。
POST ip_location/_doc?refresh
{"ip": "192.168.1.1","country": "Canada","city": "Montreal"
}PUT logs/_doc/1?refresh
{"host": "192.168.1.1","message": "the first message"
}PUT logs/_doc/2?refresh
{"host": "192.168.1.2","message": "the second message"
}POST logs/_search
{"runtime_mappings": {"location": {"type": "lookup", // 1 "target_index": "ip_location", // 2"input_field": "host", // 3"target_field": "ip", "fetch_fields": ["country", "city"] // 5 }},"fields": ["host","message","location"],"_source": false
}
- 在主搜索请求中定义一个运行时字段,其查找类型为使用 term 询从目标索引中检索字段。
- 查找查询针对的目标索引
- 主索引上的字段,其值用作查找术语查询的输入值
- 查找查询搜索的查找索引上的字段
- 要从查找索引中检索的字段列表。请参阅搜索请求的 fields 参数。
上面代码运行的结果为:

上述搜索从返回的搜索结果的每个 IP 地址的 ip_location 索引中返回 country 和 city。
查找字段的响应被分组以保持每个文档与查找索引的独立性。每个输入值的查找查询预计最多与查找索引上的一个文档匹配。如果查找查询与多个文档匹配,则将选择一个随机文档。
索引运行时字段
运行时字段由其运行的上下文定义。例如,你可以在搜索查询的上下文中或索引映射的 runtime 部分中定义运行时字段。如果你决定索引运行时字段以获得更好的性能,只需将完整的运行时字段定义(包括脚本)移动到索引映射的上下文中。Elasticsearch 会自动使用这些索引字段来驱动查询,从而缩短响应时间。此功能意味着你只需编写一次脚本,即可将其应用于支持运行时字段的任何上下文。
注意:目前不支持索引 composite 运行时字段。
然后,你可以使用运行时字段来限制 Elasticsearch 需要计算值的字段数量。将索引字段与运行时字段结合使用,可以灵活地处理索引数据以及定义其他字段的查询。
重要:索引运行时字段后,你无法更新包含的脚本。如果你需要更改脚本,请使用更新后的脚本创建一个新字段。
例如,假设你的公司想要更换一些旧的压力阀。连接的传感器只能报告真实读数的一小部分。你决定不为压力阀配备新的传感器,而是根据报告的读数计算值。根据报告的数据,你在 my-index-000001 的映射中定义以下字段:
DELETE my-index-000001PUT my-index-000001/
{"mappings": {"properties": {"timestamp": {"type": "date"},"temperature": {"type": "long"},"voltage": {"type": "double"},"node": {"type": "keyword"}}}
}
然后,你可以批量索引来自传感器的一些样本数据。这些数据包括每个传感器的 voltage 读数:
POST my-index-000001/_bulk?refresh=true
{"index":{}}
{"timestamp": 1516729294000, "temperature": 200, "voltage": 5.2, "node": "a"}
{"index":{}}
{"timestamp": 1516642894000, "temperature": 201, "voltage": 5.8, "node": "b"}
{"index":{}}
{"timestamp": 1516556494000, "temperature": 202, "voltage": 5.1, "node": "a"}
{"index":{}}
{"timestamp": 1516470094000, "temperature": 198, "voltage": 5.6, "node": "b"}
{"index":{}}
{"timestamp": 1516383694000, "temperature": 200, "voltage": 4.2, "node": "c"}
{"index":{}}
{"timestamp": 1516297294000, "temperature": 202, "voltage": 4.0, "node": "c"}
在与几位现场工程师交谈后,你意识到传感器报告的值至少应该是当前值的两倍,但可能更高。你创建一个名为 voltage_corrected 的运行时字段,该字段检索当前电压并将其乘以 2:
PUT my-index-000001/_mapping
{"runtime": {"voltage_corrected": {"type": "double","script": {"source": """emit(doc['voltage'].value * params['multiplier'])""","params": {"multiplier": 2}}}}
}
你可以使用 _search API 上的 fields 参数检索计算值:
GET my-index-000001/_search
{"fields": ["voltage_corrected","node"],"size": 2
}

在查看传感器数据并运行一些测试后,你确定报告的传感器数据的乘数应为 4。为了获得更高的性能,你决定使用新的乘数参数对 voltage_corrected 运行时字段进行索引。
在名为 my-index-000001 的新索引中,将 voltage_corrected 运行时字段定义复制到新索引的映射中。就这么简单!你可以添加一个名为 on_script_error 的可选参数,该参数确定如果脚本在索引时抛出错误,是否拒绝整个文档(默认)。
DELETE my-index-000001PUT my-index-000001/
{"mappings": {"properties": {"timestamp": {"type": "date"},"temperature": {"type": "long"},"voltage": {"type": "double"},"node": {"type": "keyword"},"voltage_corrected": {"type": "double","on_script_error": "fail", // 1"script": {"source": """emit(doc['voltage'].value * params['multiplier'])""","params": {"multiplier": 4}}}}}
}
- 如果脚本在索引时抛出错误,则会导致整个文档被拒绝。将值设置为 ignore 将在文档的 _ignored 元数据字段中注册该字段并继续索引。
将来自传感器的一些样本数据批量索引到 my-index-000001 索引中:
POST my-index-000001/_bulk?refresh=true
{ "index": {}}
{ "timestamp": 1516729294000, "temperature": 200, "voltage": 5.2, "node": "a"}
{ "index": {}}
{ "timestamp": 1516642894000, "temperature": 201, "voltage": 5.8, "node": "b"}
{ "index": {}}
{ "timestamp": 1516556494000, "temperature": 202, "voltage": 5.1, "node": "a"}
{ "index": {}}
{ "timestamp": 1516470094000, "temperature": 198, "voltage": 5.6, "node": "b"}
{ "index": {}}
{ "timestamp": 1516383694000, "temperature": 200, "voltage": 4.2, "node": "c"}
{ "index": {}}
{ "timestamp": 1516297294000, "temperature": 202, "voltage": 4.0, "node": "c"}
你现在可以在搜索查询中检索计算值,并根据精确值查找文档。以下范围查询返回计算出的 voltage_corrected 大于或等于 16 但小于或等于 20 的所有文档。同样,使用 _search API 上的 fields 参数来检索所需的字段:
POST my-index-000001/_search
{"query": {"range": {"voltage_corrected": {"gte": 16,"lte": 20,"boost": 1.0}}},"fields": ["voltage_corrected", "node"]
}

根据所包含脚本的计算值,响应包含与范围查询匹配的文档的 voltage_corrected 字段。
使用运行时字段探索数据
考虑要从中提取字段的大量日志数据。索引数据非常耗时,并且会占用大量磁盘空间,而你只想探索数据结构,而无需预先提交 schema。
你知道日志数据包含要提取的特定字段。在本例中,我们希望重点关注 @timestamp 和 message 字段。通过使用运行时字段,你可以定义脚本来计算搜索时这些字段的值。
将索引字段定义为起点
你可以从一个简单的示例开始,将 @timestamp 和 message 字段作为索引字段添加到 my-index-000001 映射中。为了保持灵活性,请使用 wildcard 作为 message 的字段类型:
DELETE my-index-000001PUT /my-index-000001/
{"mappings": {"properties": {"@timestamp": {"format": "strict_date_optional_time||epoch_second","type": "date"},"message": {"type": "wildcard"}}}
}
提取一些数据
映射要检索的字段后,将日志数据中的一些记录索引到 Elasticsearch 中。以下请求使用 bulk API 将原始日志数据索引到 my-index-000001 中。你可以使用小样本来试验运行时字段,而不是索引所有日志数据。
最终文档不是有效的 Apache 日志格式,但我们可以在脚本中考虑这种情况。
POST /my-index-000001/_bulk?refresh
{"index":{}}
{"timestamp":"2020-04-30T14:30:17-05:00","message":"40.135.0.0 - - [30/Apr/2020:14:30:17 -0500] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
{"index":{}}
{"timestamp":"2020-04-30T14:30:53-05:00","message":"232.0.0.0 - - [30/Apr/2020:14:30:53 -0500] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
{"index":{}}
{"timestamp":"2020-04-30T14:31:12-05:00","message":"26.1.0.0 - - [30/Apr/2020:14:31:12 -0500] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
{"index":{}}
{"timestamp":"2020-04-30T14:31:19-05:00","message":"247.37.0.0 - - [30/Apr/2020:14:31:19 -0500] \"GET /french/splash_inet.html HTTP/1.0\" 200 3781"}
{"index":{}}
{"timestamp":"2020-04-30T14:31:22-05:00","message":"247.37.0.0 - - [30/Apr/2020:14:31:22 -0500] \"GET /images/hm_nbg.jpg HTTP/1.0\" 304 0"}
{"index":{}}
{"timestamp":"2020-04-30T14:31:27-05:00","message":"252.0.0.0 - - [30/Apr/2020:14:31:27 -0500] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
{"index":{}}
{"timestamp":"2020-04-30T14:31:28-05:00","message":"not a valid apache log"}
此时,你可以查看 Elasticsearch 如何存储你的原始数据。
GET /my-index-000001

该映射包含两个字段:@timestamp 和 message。
使用 grok 模式定义运行时字段
如果你想要检索包含 clientip 的结果,则可以将该字段作为运行时字段添加到映射中。以下运行时脚本定义了一个 grok 模式,该模式从文档中的单个文本字段中提取结构化字段。grok 模式就像一个正则表达式,支持可以重复使用的别名表达式。
该脚本匹配 %{COMMONAPACHELOG} 日志模式,该模式了解 Apache 日志的结构。如果模式匹配 (clientip != null),则脚本会发出匹配 IP 地址的值。如果模式不匹配,则脚本只会返回字段值而不会崩溃。
PUT my-index-000001/_mappings
{"runtime": {"http.client_ip": {"type": "ip","script": """String clientip=grok('%{COMMONAPACHELOG}').extract(doc["message"].value)?.clientip;if (clientip != null) emit(clientip); """}}
}
- 此条件确保即使 message 的模式不匹配,脚本也不会崩溃。
或者,你可以在搜索请求的上下文中定义相同的运行时字段。运行时定义和脚本与之前在索引映射中定义的完全相同。只需将该定义复制到搜索请求的 “runtime_mappings” 部分下,并包含与运行时字段匹配的查询即可。此查询返回的结果与你在索引映射中为 http.clientip 运行时字段定义搜索查询的结果相同,但仅限于此特定搜索的上下文:
GET my-index-000001/_search
{"runtime_mappings": {"http.clientip": {"type": "ip","script": """String clientip=grok('%{COMMONAPACHELOG}').extract(doc["message"].value)?.clientip;if (clientip != null) emit(clientip);"""}},"query": {"match": {"http.clientip": "40.135.0.0"}},"fields" : ["http.clientip"]
}

定义 composite 运行时字段
你还可以定义复合运行时字段,以便从单个脚本发出多个字段。你可以定义一组类型化的子字段并发出值映射。在搜索时,每个子字段都会检索映射中与其名称关联的值。这意味着你只需指定一次 grok 模式即可返回多个值:
PUT my-index-000001/_mappings
{"runtime": {"http": {"type": "composite","script": "emit(grok(\"%{COMMONAPACHELOG}\").extract(doc[\"message\"].value))","fields": {"clientip": {"type": "ip"},"verb": {"type": "keyword"},"response": {"type": "long"}}}}
}
搜索特定 IP 地址
使用 http.clientip 运行时字段,你可以定义一个简单的查询来搜索特定 IP 地址并返回所有相关字段。
GET my-index-000001/_search
{"query": {"match": {"http.clientip": "40.135.0.0"}},"fields" : ["*"]
}
API 返回以下结果。由于 http 是一个 composite 运行时字段,因此响应包括字段下的每个子字段,包括与查询匹配的任何关联值。无需提前构建数据结构,你就可以以有意义的方式搜索和探索数据,以试验并确定要索引的字段。

另外,还记得脚本中的 if 语句吗?
if (clientip != null) emit(clientip);
如果脚本不包含此条件,则查询将在任何与模式不匹配的分片上失败。通过包含此条件,查询将跳过与 grok 模式不匹配的数据。
搜索特定范围内的文档
你还可以运行对时间戳字段进行操作的范围查询。以下查询将返回时间戳大于或等于 2020-04-30T14:31:27-05:00 的任何文档:
GET my-index-000001/_search
{"query": {"range": {"timestamp": {"gte": "2020-04-30T14:31:27-05:00"}}}
}

响应包含日志格式不匹配但时间戳在定义范围内的文档。
使用 dissect 模式定义运行时字段
如果你不需要正则表达式的强大功能,则可以使用解析模式代替 grok 模式。dissect 模式匹配固定分隔符,但通常比 grok 更快。
你可以使用 dissect 来实现与使用 grok 模式解析 Apache 日志相同的结果。你无需匹配日志模式,而是包含要丢弃的字符串部分。特别注意要丢弃的字符串部分将有助于构建成功的解析模式。
PUT my-index-000001/_mappings
{"runtime": {"http.client.ip": {"type": "ip","script": """String clientip=dissect('%{clientip} %{ident} %{auth} [%{@timestamp}] "%{verb} %{request} HTTP/%{httpversion}" %{status} %{size}').extract(doc["message"].value)?.clientip;if (clientip != null) emit(clientip);"""}}
}
类似地,你可以定义一个解剖模式来提取 HTTP 响应代码:
然后,你可以使用 http.responses 运行时字段运行查询以检索特定的 HTTP 响应。使用 _search 请求的 fields 参数来指示要检索哪些字段:
GET my-index-000001/_search
{"query": {"match": {"http.responses": "304"}},"fields" : ["http.client_ip","timestamp","http.verb"]
}

响应包含一个文档,其中 HTTP 响应为 304。
相关文章:
Elasticsearch:Runtime fields - 运行时字段(二)
这是继上一篇文章 “Elasticsearch:Runtime fields - 运行时字段(一)” 的续篇。 在查询时覆盖字段值 如果你创建的运行时字段与映射中已存在的字段同名,则运行时字段会隐藏映射字段。在查询时,Elasticsearch 会评估运…...
Python正则表达式的入门用法(上)
Python正则表达式是使用re模块来进行操作的。re模块提供了一组函数,用于进行字符串的匹配和查找操作。 下面是Python中使用正则表达式的一些常用函数: re.search(pattern, string):在字符串中查找并返回第一个匹配的对象。 re.match(patte…...
Audio Processing Graphs 管理 Audio Units
Audio Processing Graphs 管理 Audio Units Audio Processing Graphs 管理 Audio UnitsAudio Processing Graph 拥有精确的 I/O UnitAudio Processing Graph 提供线程安全通过 graph "pull" 音频流 Audio Processing Graphs 管理 Audio Units audio processing grap…...
欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理?
欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理? 欧盟新规委员会发布《通用充电器指令》指南通用充電器的 RED 修正案办理流程: 2024年5月7日,欧盟委员会发布《通用充电器指令》指南,修订了《无线…...
thinkphp6/8 验证码
html和后台验证代码按官方来操作 ThinkPHP官方手册 注意: 如果验证一直失败,看看Session是否开启, 打印dump(session_status());结果2为正确的, PHP_SESSION_DISABLED: Session功能被禁用(返回值为0)。…...
Ubuntu 22.04 LTS 上安装 MySQL8.0.23(在线安装)
目录 在线安装MySQL 步骤1:更新软件包列表 步骤2:安装MySQL服务器 步骤3:启动MySQL服务 步骤4:检查MySQL状态 步骤5:修改密码、权限 在线安装MySQL 步骤1:更新软件包列表 在进行任何软件安装之前&a…...
如何选择优质模型?SD3性能究竟如何?
遇到难题不要怕!厚德提问大佬答! 厚德提问大佬答12 厚德提问大佬答第十二期 你是否对AI绘画感兴趣却无从下手?是否有很多疑问却苦于没有大佬解答带你飞?从此刻开始这些问题都将迎刃而解!你感兴趣的话题,厚德…...
Linux上脚本备份数据库(升级版)
直接上代码: #!/bin/bash# 配置部分 mysql_user"root" mysql_host"localhost" mysql_port"3306" mysql_charset"utf8mb4" mysql_defaults_file"/home/mysql/mysql_back/.my.cnf"backup_base_dir"/mnt/sdd/…...
【深度解析】滑动窗口:目标检测算法的基石
标题:【深度解析】滑动窗口:目标检测算法的基石 目标检测是计算机视觉领域的一个核心任务,旨在识别图像中所有感兴趣的目标,并确定它们的位置和大小。滑动窗口方法作为目标检测中的一种传统技术,虽然在深度学习时代逐…...
约束:对于数据的限制
主键约束 主键约束:唯一约束非空约束,该字段上的数据不能重复且不能为null 注意:一张表必须有且只有一个主键 添加主键约束 -- 方式一(推荐) CREATE TABLE user(username VARCHAR(32) PRIMARY KEY,password VARCHAR(32),nick_name VARCHAR(3…...
【总线】AXI4第七课时:AXI的额外的控制信息(PROT和CACHE)
大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣,那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者,AXI4以其高性能和高度可扩展性,成为了现代电子系统中不可或缺的通信桥梁…...
MAVEN 重新配置参考
【笔记04】下载、配置 MAVEN(配置 MAVEN 本地仓库)(MAVEN 的 setting.xml)-阿里云开发者社区 windows 系统环境变量 MAVEN_HOME 也可以改一下...
ByteTrack论文阅读笔记
目录 ByteTrack: Multi-Object Tracking by Associating Every Detection Box摘要INTRODUCTION — 简介BYTE算法BYTE算法用Python代码实现实验评测指标轻量模型的跟踪性能 总结SORT算法简介ByteTrack算法和SORT算法的区别 ByteTrack: Multi-Object Tracking by Associating Eve…...
LVS+Keepalived 高可用集群搭建实验
192.168.40.204lvs+keepalivedlvs-k1192.168.40.140lvs+keepalivedlvs-k2192.168.40.150nginx官方教程web-1192.168.40.151nginxepel阿里云源web-2Woo79 | LVS+Keepalived 高可用集群搭建 (图文详解小白易懂) doctor @yang | 生产环境必备的LVS+Keepalived ,超级详细的原理…...
代码随想三刷动态规划篇7
代码随想三刷动态规划篇7 198. 打家劫舍题目代码 213. 打家劫舍 II题目代码 337. 打家劫舍 III题目代码 121. 买卖股票的最佳时机题目代码 198. 打家劫舍 题目 链接 代码 class Solution {public int rob(int[] nums) {if(nums.length1){return nums[0];}if(nums.length2){…...
linux应用开发基础知识(八)——内存共享(mmap和system V)
mmap内存映射 内存共享定义 内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对…...
上海小程序开发需要进行定制开发吗?
随着互联网技术与移动设备的不断成熟,小程序也已普及到人们日常生活的方方面面。随着企业与互联网联结的愈发深入,小程序的开发可以为企业带来更高效的经营模式,降本增效。那么,上海小程序作为无需安装且开发门槛较低的应用&#…...
Qt开发 | qss简介与应用
文章目录 一、qss简介与应用二、QLineEdit qss介绍与使用三、QPushButton qss1.常用qss1.1 基本样式表1.2 背景图片1.3 图片在左文字在右 2.点击按钮弹出菜单以及右侧箭头样式设置3.鼠标悬浮按钮弹出对话框 四、QCheckBox qss妙用:实时打开关闭状态按钮五、QComboBo…...
模块一SpringBoot(一)
maven记得配置本地路径和镜像 IJ搭建 SpringIntiallizer--》将https://start.spring.io改成https://start.aliyun.com/ 项目结构 Spring有默认配置, application.properties会覆盖默认信息: 如覆盖端口号server.port8888...
C语言 | Leetcode C语言题解之第213题打家劫舍II
题目: 题解: int robRange(int* nums, int start, int end) {int first nums[start], second fmax(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second fmax(first nums[i], second);first temp;}retur…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...
