当前位置: 首页 > news >正文

ES高级查询Query DSL查询详解、term术语级别查询、全文检索、highlight高亮

文章目录

  • ES高级查询Query DSL
    • match_all
      • 返回源数据_source
      • 返回指定条数size
      • 分页查询from&size
      • 指定字段排序sort
    • 术语级别查询
      • term query术语查询
      • terms query多术语查询
      • range query范围查询
      • exists query
      • ids query
      • prefix query前缀查询
      • wildcard query通配符查询
      • fuzzy query模糊查询
    • 全文检索
      • match query匹配查询
      • multi_match query 多字段查询
      • match_phrase query短语查询
      • query_string query
      • simple_query_string
    • bool query布尔查询
    • highlight高亮
      • 基本使用
      • 自定义高亮标签
      • 多字段高亮

ES高级查询Query DSL

ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL(Domain Specified Language 领域专用语言) ,

Query DSL是利用Rest API传递JSON格式的请求体(RequestBody)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。

官网

标准格式如下

GET /索引名/_doc/_search {JOSN请求体}# 也可以省略_doc 简写成下面这种方式
GET /索引名//_search {JOSN请求体}

案例

# 无条件查询,默认返回10条数据
GET /sys_user/_search
{"query": {"match_all": {}}
}

在这里插入图片描述



案例数据生成,接下来的案例很多都是操作改索引

# 删除现有索引
DELETE /sys_user# 重新创建索引 指定ik分词器
PUT /sys_user
{"settings" : {"index" : {"analysis.analyzer.default.type": "ik_max_word"}}
}# 创建文档,指定id
PUT /sys_user/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "广州天河公园",
"remark": "java developer"
}
PUT /sys_user/_doc/2
{
"name": "李四",
"sex": 1,
"age": 28,
"address": "广州荔湾大厦",
"remark": "java assistant"
}PUT /sys_user/_doc/3
{
"name": "王五",
"sex": 0,
"age": 26,
"address": "广州白云山公园",
"remark": "php developer"
}PUT /sys_user/_doc/4
{
"name": "赵六",
"sex": 0,
"age": 22,
"address": "长沙橘子洲",
"remark": "python assistant"
}PUT /sys_user/_doc/5
{
"name": "张龙",
"sex": 0,
"age": 19,
"address": "长沙麓谷企业广场",
"remark": "java architect assistant"
}    PUT /sys_user/_doc/6
{
"name": "赵虎",
"sex": 1,
"age": 32,
"address": "长沙麓谷兴工国际产业园",
"remark": "java architect"
}    PUT /sys_user/_doc/7
{
"name": "李虎",
"sex": 1,
"age": 32,
"address": "广州番禺节能科技园",
"remark": "java architect"
}PUT /sys_user/_doc/8
{
"name": "张星",
"sex": 1,
"age": 32,
"address": "武汉东湖高新区未来智汇城",
"remark": "golang developer"
}



match_all

使用match_all,匹配所有文档,默认只会返回10条数据。

原因:_search查询默认采用的是分页查询,每页记录数size的默认值为10。如果想显示更多数据,指定size

# 无条件查询,_search默认返回10条数据
GET /sys_user/_search# 等价于
GET /sys_user/_search
{"query": {"match_all": {}}
}



返回源数据_source

_source关键字,是一个数组,在数组中指定用来指定暂时哪些字段,类似于Mysql的select 字段 from table 或MongoDB中的 $project映射

# _source关键字的相关操作
# 返回指定字段
GET /sys_user/_search
{"query": {"match_all": {}},"_source": ["name","age"]
}#不查看源数据,仅查看元字段
GET /sys_user/_search
{"query": {"match_all": {}},"_source": false
}# 只看以a开头的字段
GET /sys_user/_search
{"query": {"match_all": {}},"_source": "a*"
}



返回指定条数size

size 关键字: 指定查询结果中返回指定条数。 默认返回值10条

# 通过size关键字指定返回结果数
GET /sys_user/_search
{"query": {"match_all": {}},"size": 20
}



分页查询from&size

size:显示应该返回的结果数量,默认是 10

from:显示应该跳过的初始结果数量,默认是 0

from 关键字用来指定起始返回位置,和size关键字连用可实现分页效果

# 通过from + size关键字实现分页
# 跳过前面5个文档,共显示两个文档
GET /sys_user/_search
{"query": {"match_all": {}},"from": 5, "size": 2
}



指定字段排序sort

注意:sort排序会让 _score相关性得分失效

# 使用sort关键字,按age字段降序 排序
GET /sys_user/_search
{"query": {"match_all": {}},"sort": [{"age": {"order": "desc"}}]
}# sort排序 + from size分页
GET /sys_user/_search
{"query": {"match_all": {}},"sort": [{"age": {"order": "desc"}}],"from": 5,"size": 3
}



术语级别查询

术语级别查询(Term-Level Queries)指的是搜索内容不经过文本分析直接用于文本匹配

搜索的对象大多是索引的非text类型字段。



term query术语查询

Term查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项,

术语查询直接返回包含搜索内容的文档,常用来查询索引中某个类型为keyword的文本字段,类似于SQL的“=”查询,使用十分普遍。

注意:最好不要在term查询的字段中使用text字段,因为text字段会被分词,这样做既没有意义,还很有可能什么也查不到。

# 对bool,日期,数字,结构化的文本可以利用term做精确匹配
# term 精确匹配
GET /sys_user/_search
{"query": {"term": {"age": {"value": "25"}}}
}# 思考: 查询广州白云是否有数据,为什么?
# 没有数据,因为address是text类型,索引数据时会创建倒排索引,而直接用 term 广州白云这个词 倒排索引中不存在所以查询不到数据
GET /sys_user/_search
{"query": {"term": {"address": {"value": "广州白云"}}}
}# 采用term精确查询, 查询字段映射类型为keyword
# 能查询都数据,因为address字段是类型为text 子类型为keyword,会创建一个完整address字段内容在倒排索引中
GET /sys_user/_search
{"query": {"term": {"address.keyword": {"value": "广州白云山公园"}}}
}



在ES中,Term查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分。

可以通过 constant_score 将查询转换成一个 Filtering,避免算分,并利用缓存,提高性能。

  • 将Query 转成 Filter,忽略TF-IDF计算,避免相关性算分的开销
  • Filter可以有效利用缓存
# 使用constant_score + filter 避免相关性算分
GET /sys_user/_search
{"query": {"constant_score": {"filter": {"term": {"address.keyword": "广州白云山公园"}}}}
}



term处理多值字段时,term查询是包含,不是等于。

POST /employee/_bulk
{"index":{"_id":1}}
{"name":"小明","interest":["跑步","篮球"]}
{"index":{"_id":2}}
{"name":"小红","interest":["跳舞","画画"]}
{"index":{"_id":3}}
{"name":"小丽","interest":["跳舞","唱歌","跑步"]}

在这里插入图片描述



terms query多术语查询

terms 用于指定字段上匹配多个词项,这里会精确匹配指定字段中包含的任何一个词项

# trems 多术语匹配
GET /sys_user/_search
{"query": {"terms": {"remark.keyword": ["java developer","java assistant"]}}}
}



range query范围查询

关键字

  • range 范围关键字
  • gte 大于等于
  • lte 小于等于
  • gt 大于
  • lt 小于
  • now 当前时间



# 查询age在[18,25]之间的文档,并对结果做一个降序排序
GET /sys_user/_search
{"query": {"range": {"age": {"gte": 18,"lte": 25}}}, "sort": [{"age": {"order": "desc"}}]
}

日期范围的比较 可以使用now表示当前时间

# 日期范围的比较
PUT /product/_bulk
{"index": {"_id": 1}}
{"productId": "XHDK-1293","price": 100,"date": "2022-01-01"}
{"index": {"_id": 2}}
{"productId": "XHDK-3566","price": 200,"date": "2023-01-01"}# 当前时间 - 2年    当然你也可以直接写"gte": "2022-08-12"
GET /product/_search
{"query": {"range": {"date": {"gte": "now-2y"}}}
}



exists query

使用exists关键字查询,查询文档中所有存在该字段的文档

字段不存在 和 字段值为null的文档都查询不出来

# 查询所有存在name字段的文档数据
GET /sys_user/_search
{"query": {"exists": {"field": "name"}}
}
# 索引一个文档,没有name字段
POST /sys_user/_doc
{"sex": 1,"age": 25,"address": "广州天河公园111","remark": "java developer111"
}# 索引一个文档,name字段的值为null
POST /sys_user/_doc
{"name": null,"sex": 1,"age": 25,"address": "广州天河公园222","remark": "java developer222"
}# 索引一个文档,name字段的值为""
POST /sys_user/_doc
{"name": "","sex": 1,"age": 25,"address": "广州天河公园333","remark": "java developer333"
}# 最终只能查询到  name字段的值为"" 的文档, name字段不存在 和 name值为null的文档都查询不出来
GET /sys_user/_search
{"query": {"exists": {"field": "name"}}
}



ids query

ids关键字,值为数组类型,可以根据一组id查询文档数据

# 使用ids关键字,查询一组id对应的文档
GET /sys_user/_search
{"query": {"ids": {"values": [1,2,3]}}
}



prefix query前缀查询

直接根据传入的前缀去倒排索引中进行匹配,判断倒排索引中的每个term是否以所指定的前缀开头。它不会分析要搜索字符串,传入的前缀就是想要查找的前缀

默认状态下,前缀查询不做相关性分数计算,它只是将所有匹配的文档返回,然后赋予所有相关分数值为1。它的行为更像是一个过滤器而不是查询。两者实际的区别就是过滤器是可以被缓存的,而前缀查询不行。

# 使用prefilx前缀匹配查询
GET /sys_user/_search
{"query": {"prefix": {"address": {"value": "广州"}}}
}



wildcard query通配符查询

工作原理和prefix相同,只不过它不是只比较开头,它能支持更为复杂的匹配模式。

# 使用wildcard通配符匹配
GET /sys_user/_search
{"query": {"wildcard": {"address": {"value": "*白*"}}}
}



fuzzy query模糊查询

使用fuzziness属性来进行模糊查询,从而达到搜索有错别字的情形。

fuzzy 查询会用到两个很重要的参数,fuzziness,prefix_length

  • fuzziness

    对输入的关键字进行几次操作可以和倒排索引中的term词匹配。

    新增一个字符,删除一个字符,修改一个字符,每次操作可以记做编辑距离为1;

    该参数默认值为0,即不开启模糊查询; fuzzy 模糊查询 最大模糊错误必须在0-2之间

  • prefix_length

    输入的关键字前面几个字符必须要和倒排索引的term词匹配,关键字前面几个字符不允许写错

    默认值为0

# 使用fuzzy关键字进行模糊查询
# 允许一个错别字,但是第一个字不能是错别字
GET /sys_user/_search
{"query": {"fuzzy": {"address": {"value": "白晕山","fuzziness": 1,"prefix_length": 1}}}
}



全文检索

全文检索查询旨在基于相关性搜索和匹配文本数据。

这些查询会对输入的文本进行分析,将其拆分为词项(单个单词),并执行诸如分词、词干处理和标准化等操作。

以相关性为基础进行搜索和匹配。全文检索查询使用相关性算法来确定文档与查询的匹配程度,并按照相关性进行排序。相关性可以基于词项的频率、权重和其他因素来计算。



match query匹配查询

match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找。

match支持以下参数:

  • query : 指定匹配的值

  • operator : 匹配条件类型

    • and : 条件分词后都要匹配
    • or : 条件分词后有一个匹配即可(默认)
  • minmum_should_match : 最低匹配度,即条件在倒排索引中最低的匹配度

# 下面两种写法一样,两种写法都是operator分词后or的效果
GET /sys_user/_search
{"query": {"match": {"address": "广州白云山"}}
}# 如果只有关键词需要指定,那么match关键词下的query参数就可以省略
GET /sys_user/_search
{"query": {"match": {"address": {"query": "广州白云山"}}}
}# 分词后 and的结果
GET /sys_user/_search
{"query": {"match": {"address": {"query": "广州白云山","operator": "and"}}}
}# 如果分词后是or操作,我们也可以添加minmum_should_match 来指定最低匹配度
# 至少要匹配两个分词
GET /sys_user/_search
{"query": {"match": {"address": {"query": "广州白云山公园","operator": "or","minimum_should_match": 2}}}
}



对于match查询,其底层逻辑的概述:

  1. 分词:首先,输入的查询文本会被分词器进行分词。分词器会将文本拆分成一个个词项(terms),如单词、短语或特定字符。分词器通常根据特定的语言规则和配置进行操作。
  2. 倒排索引:ES使用倒排索引来加速搜索过程。倒排索引是一种数据结构,它将词项映射到包含这些词项的文档。每个词项都有一个对应的倒排列表,其中包含了包含该词项的所有文档的引用。
  3. 匹配计算:一旦查询被分词,ES将根据查询的类型和参数计算文档与查询的匹配度。对于match查询,ES将比较查询的词项与倒排索引中的词项,并计算文档的相关性得分。相关性得分衡量了文档与查询的匹配程度。
  4. 结果返回:根据相关性得分,ES将返回最匹配的文档作为搜索结果。搜索结果通常按照相关性得分进行排序,以便最相关的文档排在前面。

在这里插入图片描述



在这里插入图片描述




在这里插入图片描述



multi_match query 多字段查询

让查询关键词在文档内的多个字段中进行查询

# 使用multi_match,让输入的关键词在多个字段中进行查找匹配
# 这其中也有 operator  minimum_should_match 这些参数
GET /sys_user/_search
{"query": {"multi_match": {"query": "长沙赵六","fields": ["name", "address"],"operator": "or","minimum_should_match": 1}}
}



match_phrase query短语查询

对搜索文本进行分词,再去倒排索引找每个分词,并要求分词相邻。可以通过slop参数设置允许分词之间出现的最大间隔距离

我们先来使用分词器来看看一个文本是如何分词的

GET _analyze
{"analyzer": "ik_max_word","text": "广州白云山"
}

在这里插入图片描述



那么我们现在输入文本广州白云山应该是能查询到数据,因为这两个分词是相邻的,如果输入文本广州白云应该是查询不到数据,因为这两个分词是不相邻的

# 能查询到数据,因为广州 白云山 这两个分词是相邻的,
GET /sys_user/_search
{"query": {"match_phrase": {"address": "广州白云山"}}
}# 查询不到数据,因为 广州 白云  这两个分词是不相邻
GET /sys_user/_search
{"query": {"match_phrase": {"address": "广州白云"}}
}# slop参数设置允许分词之间出现的最大间隔距离
GET /sys_user/_search
{"query": {"match_phrase": {"address": {"query": "广州白云","slop": 2}}}
}

在这里插入图片描述



query_string query

对输入的文本在文档中所有字段进行匹配搜索

允许我们在单个查询字符串中指定AND | OR | NOT条件,必须大写

它也支持单字段查询和多字段查询,只不过这些功能我们通过match、multi_match也能实现

# 未指定字段查询,查询文档中的所有字段的值
# AND必须大写 文档中必须包含这两个分词才能查询出来
GET /sys_user/_search
{"query": {"query_string": {"query": "赵六 AND 橘子洲"}}
}# 指定单字段   添加default_field参数
GET /sys_user/_search
{"query": {"query_string": {"default_field": "address", "query": "赵六 OR 橘子洲"}}
}# 指定多字段  添加
GET /sys_user/_search
{"query": {"query_string": {"fields": ["name", "address"], "query": "张三 OR (赵六 AND 橘子洲)"}}
}



simple_query_string

类似于query_string ,但是会忽略错误的语法,同时只支持部分查询语法,不支持AND OR NOT ,如果存在AND这些会当作普通字符串处理。

支持部分逻辑:

  • +代替AND
  • |代替OR
  • -代替NOT
# simple_query_string 默认的operator是OR
GET /sys_user/_search
{"query": {"simple_query_string": {"fields": ["name","address"],"query": "广州公园","default_operator": "AND"}}
}GET /sys_user/_search
{"query": {"simple_query_string": {"fields": ["name","address"],"query": "广州 + 公园"}}
}



bool query布尔查询

  • 搜索上下文query context

    需计算每个文档与搜索条件相关性得分,有一定性能开销,带文本分析的全文检索查询语句适合放在搜索上下文中

  • 过滤上下文filter context

    只判断搜索条件跟文档是否匹配,不计算相关性得分。可以使用缓存加快响应速度,术语级别查询是否放在过滤上下文中



类型说明
must可包含多个查询条件,每个条件均满足的文档才能被搜索到,每次查询需要计算相关度得分,属于搜索上下文
should可包含多个查询条件,不存在must和fiter条件时,至少要满足多个查询条件中的一个,文档才能被搜索到,否则需满足的条件数量不受限制,匹配到的查询越多相关度越高,也属于搜索上下文
filter可包含多个过滤条件,每个条件均满足的文档才能被搜索到,每个过滤条件不计算相关度得分,结果在一定条件下会被缓存, 属于过滤上下文
must_not可包含多个过滤条件,每个条件均不满足的文档才能被搜索到,每个过滤条件不计算相关度得分,结果在一定条件下会被缓存, 属于过滤上下文



案例

生成案例数据

PUT /books
{"settings": {"number_of_replicas": 1,"number_of_shards": 1},"mappings": {"properties": {"id": {"type": "long"},"title": {"type": "text","analyzer": "ik_max_word"},"language": {"type": "keyword"},"author": {"type": "keyword"},"price": {"type": "double"},"publish_time": {"type": "date","format": "yyy-MM-dd"},"description": {"type": "text","analyzer": "ik_max_word"}}}
}POST /_bulk
{"index":{"_index":"books","_id":"1"}}
{"id":"1", "title":"Java编程思想", "language":"java", "author":"Bruce Eckel", "price":70.20, "publish_time":"2007-10-01", "description":"Java学习必读经典,殿堂级著作!赢得了全球程序员的广泛赞誉。"}
{"index":{"_index":"books","_id":"2"}}
{"id":"2","title":"Java程序性能优化","language":"java","author":"葛一鸣","price":46.5,"publish_time":"2012-08-01","description":"让你的Java程序更快、更稳定。深入剖析软件设计层面、代码层面、JVM虚拟机层面的优化方法"}
{"index":{"_index":"books","_id":"3"}}
{"id":"3","title":"Python科学计算","language":"python","author":"张若愚","price":81.4,"publish_time":"2016-05-01","description":"零基础学python,光盘中作者独家整合开发winPython运行环境,涵盖了Python各个扩展库"}
{"index":{"_index":"books","_id":"4"}}
{"id":"4", "title":"Python基础教程", "language":"python", "author":"Helant", "price":54.50, "publish_time":"2014-03-01", "description":"经典的Python入门教程,层次鲜明,结构严谨,内容翔实"}
{"index":{"_index":"books","_id":"5"}}
{"id":"5","title":"JavaScript高级程序设计","language":"javascript","author":"Nicholas C. Zakas","price":66.4,"publish_time":"2012-10-01","description":"JavaScript技术经典名著"}

bool 查询案例

# 使用must类型,需满足所有查询条件,属于搜索上下文
GET /books/_search
{"query": {"bool": {"must": [{"match": {"title": "Java编程"}},{"match": {"description": "性能优化"}}]}}
}# 使用 should 满足任意一个查询条件即可
# 通过 minimum_should_match 参数指定需要满足条件的个数
GET /books/_search
{"query": {"bool": {"should": [{"match": {"title": "java编程"}},{"match": {"description": "性能优化"}}],"minimum_should_match": 1}}
}# 使用 filter 需满足所有查询条件
GET /books/_search
{"query": {"bool": {"filter": [{"range": {"price": {"gte": 20,"lte": 100}}},{"term": {"language": "java"}}]}}
}



在这里插入图片描述

在这里插入图片描述
在这里插入图片描述



highlight高亮

highlight 关键字: 可以让符合条件的文档中的关键词高亮。

highlight相关属性:

  • pre_tags 前缀标签
  • post_tags 后缀标签
  • tags_schema 设置为styled可以使用内置高亮样式
  • require_field_match 多字段高亮需要设置为false



基本使用

示例数据

#指定ik分词器
PUT /products
{"settings" : {"index" : {"analysis.analyzer.default.type": "ik_max_word"}}
}PUT /products/_doc/1
{"proId" : "2","name" : "牛仔男外套","desc" : "牛仔外套男装春季衣服男春装夹克修身休闲男生潮牌工装潮流头号青年春秋棒球服男 7705浅蓝常规 XL","timestamp" : 1576313264451,"createTime" : "2019-12-13 12:56:56"
}PUT /products/_doc/2
{"proId" : "6","name" : "HLA海澜之家牛仔裤男","desc" : "HLA海澜之家牛仔裤男2019时尚有型舒适HKNAD3E109A 牛仔蓝(A9)175/82A(32)","timestamp" : 1576314265571,"createTime" : "2019-12-18 15:56:56"
}



测试

GET /products/_search
{"query": {"term": {"name": {"value": "牛仔"}}},"highlight": {"fields": {"*": {}}}
}

在这里插入图片描述



自定义高亮标签

可以在highlight中使用pre_tagspost_tags

GET /products/_search
{"query": {"multi_match": {"query": "牛仔","fields": ["name","desc"]}},"highlight": {"pre_tags": ["<span style='color:red'>"], "post_tags": ["</span>"], "fields": {"*": {}}}
}

在这里插入图片描述



多字段高亮

之前的案例中,都是查询匹配哪些字段,highlight高亮标签中才有这些字段数据。我们也可以指定多字段都可以有高亮数据

使用多字段高亮就需要把require_field_match 参数的值设置为false

# 多字段高亮
# require_field_match属性设置为false 在fields中指定多个字段
GET /products/_search
{"query": {"match": {"name": "牛仔"}},"highlight": {"pre_tags": ["<span style='color:red'>"], "post_tags": ["</span>"], "require_field_match": "false", "fields": {"name": {},"desc": {}}}
}

在这里插入图片描述

相关文章:

ES高级查询Query DSL查询详解、term术语级别查询、全文检索、highlight高亮

文章目录 ES高级查询Query DSLmatch_all返回源数据_source返回指定条数size分页查询from&size指定字段排序sort 术语级别查询term query术语查询terms query多术语查询range query范围查询exists queryids queryprefix query前缀查询wildcard query通配符查询fuzzy query模…...

关于Blender云渲染农场,你应该知道的一切!

Blender是一个功能强大的免费开源3D创作套件&#xff0c;提供了广泛的工具和特性&#xff0c;因此受到了许多3D艺术家的喜爱。在创建3D场景的过程中&#xff0c;渲染作为最后一步&#xff0c;常常是许多艺术家头疼的问题&#xff0c;因为它不仅耗时&#xff0c;还占用了他们的计…...

Obsidian如何安装插件

文章目录 前言开始安装写在最后 前言 没有插件的 Obsidian 是不完整的 Obsidian&#xff0c;如果你正在使用 Obsidian&#xff0c;一定要会安装插件。 本文将告诉你如何安装 Obsidian 第三方插件。 开始安装 首先进入 Obsidian 界面。 点击左下角的设置图标&#xff0c;就…...

Nginx服务器申请及配置免费SSL证书

免费SSL证书申请 背景&#xff1a; 我的情况是这样&#xff0c;域名解析是华为云的&#xff0c;然后免费证书在腾讯云申请。但是大致的配置流程都是一样的 在腾讯云平台申请免费的SSL证明(目前有效期是9天)&#xff0c;申请步骤如下 主要步骤说明 申请免费SSL证书配置证书到域…...

STM32CubeMX 配置串口通信 HAL库

一、STM32CubeMX 配置串口 每个外设生成独立的 ’.c/.h’ 文件 不勾&#xff1a;所有初始化代码都生成在 main.c 勾选&#xff1a;初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。 二、重写fputc函数 ​ #include <stdio.h>#ifdef __GNUC__#def…...

GitHub的未来:在微软领导下保持独立与AI发展的平衡

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

RGB与YUV格式详解

图像处理 文章目录 图像处理前言一、RGB格式二、YUV格式三、RGB与YUV转换四、NV21转换为YUV420p五、YUV旋转 前言 在图像的世界里&#xff0c;一般使用RGB作为存储格式。而在视频的世界里&#xff0c;一般使用YUV作为压缩存储格式。有时候面试官会问&#xff1a;为什么视频使用…...

JS获取当前浏览器名称

在JavaScript中&#xff0c;获取当前浏览器名称的方法并不是一个标准的功能&#xff0c;因为浏览器厂商并没有提供一个直接的API来获取浏览器的名称。但是&#xff0c;你可以通过分析用户代理字符串&#xff08;User-Agent&#xff09;来推断出浏览器的名称。 以下是一个简单的…...

学习计算机网络(五)——ICMP协议

ICMP 协议&#xff08;Internet Control Message Protocol&#xff0c;互联网控制报文协议&#xff09;&#xff0c;主要用于在 IP 网络中传递控制消息和差错报告。 ICMP在IP系统间传递差错和管理报文&#xff0c;是任何IP实现必需和要求的组成部分。 可把ICMP报文分成两类&a…...

request.getRequestURI()与request.getRequestURL()的区别

1.返回值的区别&#xff1a; request.getRequestURL() 返回值是一个StringBuffer类型 request.getRequestURI() 返回值是一个String类型 先看 request.getRequestURL() 返回的是一个具体的地址&#xff0c;访问网页的地址 而 request.getRequestURI() 返回的是一个映射地址&a…...

3154. 到达第 K 级台阶的方案数(24.8.20)

今天发晚了&#xff0c;嘿嘿&#xff0c;玩黑神话玩的 题目 给你有一个 非负 整数 k 。有一个无限长度的台阶&#xff0c;最低 一层编号为 0 。 Alice 有一个整数 jump &#xff0c;一开始值为 0 。Alice 从台阶 1 开始&#xff0c;可以使用 任意 次操作&#xff0c;目标是到达…...

如何使用docker打包后端项目并部署到阿里云k8s集群上

如何使用docker打包后端项目并部署到阿里云k8s集群上 1. 引言 在现代软件开发中,容器化技术已经成为主流,而Kubernetes (K8s) 是管理容器的首选平台之一。本文将详细介绍如何将一个后端项目使用Docker打包,并将其部署到阿里云的Kubernetes集群上。 2. 前置条件 阿里云账号…...

ES6中解构的使用

一、提取几个属性&#xff0c;构造一个新的对象 在JavaScript中&#xff0c;你可以使用对象解构&#xff08;Object Destructuring&#xff09;来提取一个对象中的几个属性&#xff0c;并构造一个新的对象。下面是一个示例&#xff1a; 在这个例子中&#xff0c;name和email属性…...

拖拽式报表设计器优点好 实现流程化办公就靠它!

当前&#xff0c;实现流程化办公是很多企业都想要实现的目标。利用低代码技术平台、拖拽式报表设计器的优势特点&#xff0c;可以为企业降低开发成本、提升办公效率、创造更多市场价值。那么&#xff0c;您知道拖拽式报表设计器的优点是什么吗&#xff1f;通过本文一起了解拖拽…...

Spring项目:文字花园(四)

一.实现登录 传统思路: • 登陆⻚⾯把⽤⼾名密码提交给服务器. • 服务器端验证⽤⼾名密码是否正确, 并返回校验结果给后端 • 如果密码正确, 则在服务器端创建 Session . 通过 Cookie 把 sessionId 返回给浏览器. 问题: 集群环境下⽆法直接使⽤Session. 原因分析: 我们开…...

Web开发:ORM框架之Freesql的入门和技巧使用小结

目录 零、官网链接 一、字段映射表 二、查询 1.freesql独特封装&#xff1a;between关键字 2.分页&#xff08;每页 20 条数据&#xff0c;查询第 1 页&#xff09; 3.Withsql&#xff08;子查询&#xff0c;不建议&#xff09; 3.简单查询、映射查询 4.参数查询、自定义…...

软件工程(4)面向对象方法:面向对象软件工程OOSE与案例实践

OOSE&#xff08;Object-Oriented Software Engineering&#xff0c;面向对象软件工程&#xff09;是一种用于开发软件系统的工程方法论&#xff0c;它强调使用面向对象的技术和方法来设计和实现软件。OOSE 方法是由 Ivar Jacobson 提出的&#xff0c;主要包括以下几个关键方面…...

【数据结构篇】~链表算法题1(含快慢指针的解析)

前言 关于环形指针与快慢指针是算法题中的常客&#xff0c;如果能掌握将是我们的一大助力&#xff01; 1.快慢指针 1 移除链表元素​ https://leetcode.cn/problems/remove-linked-list-elements/description/ 1&#xff09;思路 这道题可以用一个新链表来保存原链表中不…...

洛谷 P1135 奇怪的电梯

链接直达&#xff1a;P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 题目来源 洛谷 题目内容 奇怪的电梯 题目背景 感谢 yummy 提供的一些数据。 题目描述 呵呵&#xff0c;有一天我做了一个梦&#xff0c;梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯&…...

vue使用axios请求后端数据

前后端分离项目的基础&#xff1a; 前后端跨域访问 vite.config.js中加入 // 1.为什么要跨域 //因为浏览器的同源策略,不同站点之间访问需要跨域 //实现跨域的方式&#xff1a;server: {proxy: {// 假设要跨域访问的后端 API 地址以 /api 开头/api: { //表示拦截以/api开头的…...

目标检测 | yolov10 原理和介绍

相关系列&#xff1a; 目标检测 | yolov1 原理和介绍 目标检测 | yolov2/yolo9000 原理和介绍 目标检测 | yolov3 原理和介绍 目标检测 | yolov4 原理和介绍 目标检测 | yolov5 原理和介绍 目标检测 | yolov6 原理和介绍 目标检测 | yolov7 原理和介绍 目标检测 | yolov8 原理和…...

基于Springboot 和Vue 的高校宿舍管理系统源码

网络上很多宿舍管理系统都不完整&#xff0c;大多数缺少数据库文件&#xff0c;所在使用极其不方便&#xff0c;由于本人程序员&#xff0c;根据代码&#xff0c;自己花时间不全了数据库文件&#xff0c;并且可以完美运行&#xff01;&#xff01;&#xff01;&#xff01;&…...

3:2比例的程序员专业显示器,效率提升显著,摸鱼时间又多了

对于我们程序员来说&#xff0c;显示器的重要性不言而喻&#xff0c;作为我们与代码交流的直接工具&#xff0c;他影响着我们的工作效率、舒适度和整体编程体验。我在家用的是自己笔记本的屏幕&#xff0c;简单写写代码还行&#xff0c;涉及到多任务协同或者大代码量开发就有点…...

vue3 cascader省市区三级联动如何指定字段,如何根据id查到对应的名字

如果我们接口数据字段名不是value和code。要加个props :props"{ value:code,label:regionName}"根据id查name需要一个ref和一个change事件<el-cascader :options"areaData" ref"addressCodeRef" change"handleChange" :props"…...

算法4:前缀和(上)

文章目录 一维前缀和二维前缀和寻找数组的中心下标除自身以外数组的乘积 一维前缀和 二维前缀和 寻找数组的中心下标 class Solution { public:int pivotIndex(vector<int>& nums) {int n nums.size();vector<int> f(n), g(n);f[0] nums[0];g[n - 1] num…...

美国政府紧急应对三星Galaxy手机安全漏洞

一、美国政府紧急通知更新三星Galaxy手机系统 美国政府近日发布紧急通知&#xff0c;要求联邦政府雇员在8月28日前更新三星Galaxy手机系统&#xff0c;否则将面临禁止使用这些设备的后果。这是继7月针对Pixel手机用户的类似要求之后的又一次紧急行动。此次事件的导火索是谷歌发…...

看 逆行人生

电影和我的职业本身有相关性&#xff0c;而且我特别喜欢徐峥执导的电影&#xff0c;这次的题材也算是碰上自己的胃口。 周六&#xff0c;下了大半天的雨&#xff0c;早上驱车到公司加班&#xff0c;下午六点多到时候特别想去看电影&#xff0c;果断再驱车从公司赶回来&#xff…...

0819、0820梳理及一些面试题梳理

一、抓包分析 二、HTTP服务器 三、动态库与静态库 四、一些面试题 指针数组和数组指针的区别&#xff1a;指针数组本质是一个数组&#xff0c;只是数组中存储的是指针变量。数组指针存储的是该数组的起始地址&#xff0c;对该指针来说每偏移一个单位就是偏移了一整个数组的地…...

HttpUtils工具类(一)常见的HttpUtils工具类及如何自定义java的http连接池

目录 一、几种常见的Http调用方式 1. 使用 Apache HttpClient 2. 使用 OKhttpClient 3. 使用第三方库&#xff08;Hutool&#xff09;的http链接池 4. 使用 Spring RestTemplate 5. 使用 Java 原生的HttpURLConnection 二、总结 常用三种HttpUtils对比总结 一、几种常见…...

使用 Lombok 遇到一个问题

起因是换了一个电脑&#xff0c;重新从服务器上拉了一个项目。项目是由maven构建的&#xff0c;在控制台中使用mvn命令编译项目时&#xff0c;没有任何问题&#xff0c;编译成功。如下图&#xff1a; 可是idea里面的源码&#xff0c;却标红了&#xff0c;如下&#xff1a; 错误…...