白话ES搜索相关性问题

news2024/10/6 13:15:28

  之前使用es,更多的是使用term查询,和agg聚合分析。对相关性关注较少。实际上es擅长的是做模糊搜索,相关性搜索。

  ES是一个开源的通用的检索工具,能满足百分之八十的需求。相关性这个问题,是一个非常有意思的问题,值得深思。搞清楚相关性打分规则,有利于提高召回内容的相关性。深入了解以后,能帮我们解决剩下的百分之二十的需求。

1、为什么会研究搜索相关性问题

  两个需求。其中第二个需求实现,费了不少功夫。怎么调都不对,所以对相关性有了研究。

  1. 命中某个字段优先返回。 原生的相关性算法,可以通过对某个字段加权来满足此需求。
  2. 连续命中的部分越多,优先返回。此需求在当个字段中检索,效果还好,在多个字段中检索,效果不是很好。另外,经研究相关性得分计算过程,得知连续命中这个点,在相关性得分计算中并不考虑。具体可以看下文的BM25算法的计算过程。
  3. 但是需求1和需求2同时满足,并不太容易。在长文本字段中,词频的影响,例如关键词在title和content都出现了。但是在title出现了一次,在content出现了N次,召回结果会因为在content中出现的次数多,而排序在前边。最终导致需求1不能满足。如果一定要满足需求1,给某个字段加权很多。又会导致召回的结果相关性不是那么好。因为相关性得分都是根据某个字段加权来的。

2、ES中的相关性算法

ES 5.0 之前,默认的相关性算分采用的是 TF-IDF,而之后则默认采用 BM25

 2.1  TF-IDF 是什么

  TF-IDF 是ES5.0之前使用的,相关性算法。考虑词频,逆文档率,和词的长度影响。综合得到一个分数。

  1.  TF 是词频,比如某个关键词在文章A中出现了10次,在文章B中出现了20次。理想情况下,出现的次数越多。相关性就越大一点。实际计算是,对关键词在文章中出现的次数开平方。平方根的曲线如图所示:
  2. IDF 是逆文档率。关键词在越多的文章中出现,该词的得分影响就越小。比如你我他这种关键词,可能在每篇文章中都出现了。那么实际上对文档的得分没有什么意义。IDF的计算公式如下:
    idf(t) = 1 + log ( numDocs / (docFreq + 1)) 
    
    numDocs: 是文章总数。例如一共有100篇文章。
    
    docFreq :包含该关键词的文档总数。例如其中一共有10篇文章出现了关键词 “中国”
    
    词 t 的逆向文档频率( idf )是:索引中文档数量除以所有包含该词的文档数,然后求其对数。
    
    注意: 这里的log是指以e为底的对数,不是以10为底的对数。
  3. 字段长度影响。例如,“联合利剑”在标题字段出现了,在正文也出现了。理想情况下,命中标题,相关性可能会更大一些。标题和正文,一般区别就是,标题比正文短很多。在评分中,字段的长度也会作为相关性分数中的一项去计算。计算公式是:词的个数的平方根,再求倒数。例如标题中有 16个词,先开平方,得到4,再求倒数则为 0.25。正文中有100个词,先开平方得到10,再求倒数,则得到0.1。显然0.25 > 0.1,所以标题更重要。

       实际检索,实际上是会进行分词的,不管是句子精准匹配,还是模糊搜索。都需要分词后去匹配。所以总的相关性分数,实际上是拆分后每个词的分数的总和。在lucene中的相关性计算分数公式如下:

score(q,d)  =
            queryNorm(q)
          · coord(q,d)
          · ∑ (
                tf(t in d)
              · idf(t)²
              · t.getBoost()
              · norm(t,d)
            ) (t in q)

score(q,d) 文档d对查询q的相关性得分
queryNorm(q) 查询的规范化因子
coord(q,d) 协调因子
∑ 文档d的查询q中每个词t的权重之和
tf(t in d) 文档d中t词的词频(出现次数)
idf(t) t词的逆文档频率
t.getBoost() 已应用于查询的boost。匹配的关键词可以设置权重
norm(t,d) 是字段长度归一值,与检索时字段的Boost (如果存在)相结合

 2.2 BM25是什么

  BM25算法是在TF-IDF之上的补充。其实仔细想一下,还是能够发现TF-IDF的缺陷的。如下:

  1. 词频。假如数据质量很低,某个词在文章中出现的频率特别高。这会影响召回的效果。发现仅仅只是词频高。 在词频足够高的情况下是会影响到其它评分项的。针对此问题,BM25的做了补充,给了用户使用上更多的自定义空间。其中关于词频这个问题,给了一个参数 k1来控制词频影响的重要程度。具体如何使用,如何调整,在下边。
  2. 字段长短问题。像开篇提出来的那样,希望命中某个字段就优先返回。这个需求,其实涉及到了词频的问题。在ES使用的BM25算法中,词频阻止实现这个需求。比如一个词在标题中出现了一次,但是在正文中出现了10词甚至更多,这样我们并不能实现在命中标题就将数据排序在前。即使去调标题的权重,也仅能达到70的效果。在BM25算法中,提供了另外一个参数b。可以加对大长文本字段的惩罚。从而达到我们想要的命中标题字段就优先返回。

2.3 BM25在ES中的具体实现(BM25算法公式)

我们直接使用   "explain": true, 参数,在kibana上,分析一个DSL语句。然后一步一步的分析。

我搜索的关键词是 “联合利剑”,然后被分成了三个词,联合,合利,利剑。所以文档的总得分是,“联合”得分 + “合利”得分  + “利剑”得分

先看看“联合”这个词的分数计算。可以看到公式就是: boost * idf * tf 

boost : 是给到权重分数,这个可以在查询语句中传入。

idf: 其实就是逆文档率。计算公式 log(1 + (N - n + 0.5) / (n + 0.5)),其中 N是总的文档数,n为出现“联合”一次的文档数。

tf:是词频。 freq / (freq + k1 * (1 - b + b * dl / avgdl)) 。freq 是词在该文档出现的次数,b和k1在上边提到过,在ES默认的BM25算法中,都是默认值,b为0.75,k1为1.2(下边再说为什么默认是这两个值,以及如何调)。dl 为该文档中检索字段的长度avgdl检索字段的平均长度

{
                  "value" : 77.40897,
                  "description" : "weight(title:联合 in 422639) [PerFieldSimilarity], result of:",
                  "details" : [
                    {
                      "value" : 77.40897,
                      "description" : "score(freq=1.0), computed as boost * idf * tf from:",
                      "details" : [
                        {
                          "value" : 22.0,
                          "description" : "boost",
                          "details" : [ ]
                        },
                        {
                          "value" : 6.267289,
                          "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                          "details" : [
                            {
                              "value" : 44240,
                              "description" : "n, number of documents containing term",
                              "details" : [ ]
                            },
                            {
                              "value" : 23316810,
                              "description" : "N, total number of documents with field",
                              "details" : [ ]
                            }
                          ]
                        },
                        {
                          "value" : 0.56142133,
                          "description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                          "details" : [
                            {
                              "value" : 1.0,
                              "description" : "freq, occurrences of term within document",
                              "details" : [ ]
                            },
                            {
                              "value" : 1.2,
                              "description" : "k1, term saturation parameter",
                              "details" : [ ]
                            },
                            {
                              "value" : 0.75,
                              "description" : "b, length normalization parameter",
                              "details" : [ ]
                            },
                            {
                              "value" : 50.0,
                              "description" : "dl, length of field (approximate)",
                              "details" : [ ]
                            },
                            {
                              "value" : 93.51748,
                              "description" : "avgdl, average length of field",
                              "details" : [ ]
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }

以上例子是一个最简单的案例,仅仅在一个字段中做检索。假如在多个字段中做检索,会更复杂一些。下边结合ES的参数再分析,这里先不展开。

2.4 BM25中,如何调调参,会有什么效果

在上边的公式中,得分为: boost * idf * tf 。可调整的只有b和k1这两个参数

其中boost是某个查询字段的权重,可以在查询语句中传入。

idf 公式log(1 + (N - n + 0.5) / (n + 0.5)) 其中N和n都取决于数据,无法控制。

tf:是词频。得分公式为: freq / (freq + k1 * (1 - b + b * dl / avgdl))。 b和k1只包在这个公式中。b是和长度相关联的,b在公式的分母上,还是以title为例,当title大于平均长度,则 dl / avgdl 大于1, 那么b越大且大于1,就会加大对长度的惩罚力度,如果b越小,则会削弱对长文本的惩罚力度。因为b在分母上且和文档长度相关。  k1也是在分母上,但是可以再次调整词频对分数的影响。适当的增大k1的值可以减小词频对相关性分数的影响。对于词频的得分公式,举例如下。根据总的得分公式,boost * idf * tf ,其实我们关注的是,tf是趋向于1的,tf越小,相关性总分数越小。tf越趋向于1,总得分越和句子的长短以及词频越无关。

  1. 当检索的字段的内容,大于该字段的平均字段的长度。假如平均长度位10,检索字段为20,则dl / avgdl 为2。我们用默认的b取值0.75,k默认取值1.2。假设检索的目标关键词在被检索文档字段中出现了5次。则得分公式为 5/ (5 + 1.2 *(1 - 0.75 + 0.75 * 20 / 10)) 。

 从整体上,b趋向于0,会屏蔽文本长度对分数的影响。b越大,会加大对长文本的惩罚力度。b为0.75,k1为1.2。该默认才是,是经历过学术界大量数据测试得出的数据。在ES官方博客上,有说到,不要去轻易动这两个参数。很可能带来更差的效果。很多问题优先考虑使用其它的方式解决。调b和k1是很复杂的事情。效果收益并不很明显。

参考文档如下:(这是官方的文档,值得好好琢磨)

Practical BM25 - Part 3: Considerations for Picking b and k1 in Elasticsearch | Elastic Blog

2.5  b 和 k1的取值范围

b 取值范围在[0,1]。 最佳范围在 [0.3,  0.9]

k1 取值范围在 [0, 3]。最佳范围在[0.5,  2]

  • b needs to be between 0 and 1. Many experiments test values in increments of around 0.1 and most experiments seem to show the optimal b to be in a range of 0.3-0.9 (Lipani, Lupu, Hanbury, Aizawa (2015); Taylor, Zaragoza, Craswell, Robertson, Burges (2006); Trotman, Puurula, Burgess (2014); etc.)
  • k1 is typically evaluated in the 0 to 3 range, though there’s nothing to stop it from being higher. Many experiments have focused on increments of 0.1 to 0.2 and most experiments seem to show the optimal k1 to be in a range of 0.5-2.0

2.6  什么时候去调b 和k1

  没有任何办法的时候,才调它。并且根据以上最佳取值范围内,以0.1递增,测试在自己数据集上的检索效果。

2.7  其它的方法调整相关性

  还是根据官方博客,所说的那样,有以下方法可以去尝试。以下效果都会好于调BM25参数。

  

  • Boosting or adding constant scores for things like exact phrase matches in a bool query
  • Making use of synonyms to match other terms the user may be interested in
  • Adding fuzziness, typeahead, phonetic matching, stemming, and other text/analysis components to help with misspellings, language differences, etc.
  • Adding or using a function score to decay the scores of older documents or documents which are further geographically from the end user

调整boost 取值范围[0, 1] 大于1则会做归一化。实际上越大,则越会放大相关性分数。通常,我们在检索多个字段的时候,假如某个字段的权重不够高,但是我们的需求是让该字段优先级更高一点。就可以通过调这个参数。

官方参考链接:

Practical BM25 - Part 3: Considerations for Picking b and k1 in Elasticsearch | Elastic Blog

2.7.1 指定检索字段的boost权重

注意在相关性总得分公式中boost * idf * tf,boost大于1,则对相关性提分,小于1,则对相关性减分。但是新的评分 _score 会在应用权重提升之后被归一化 ,每种类型的查询都有自己的归一算法。

 案例如下:

GET /demo_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": {
              "query": "联合利剑",
              "boost": 2
            }
          }
        },
        {
          "match": {
            "content": "联合利剑"
          }
        }
      ]
    }
  },
  "explain": true
}

不过检索多个字段我还是喜欢multi_match,或者query_string语法。里边有更多的参数可以调,可以使用

GET demo_index/_search
{
  "explain": true, 
  "query": {
    "multi_match": {
      "query": "联合利剑",
      "type": "best_fields",
      "tie_breaker": 0.3,
      "analyzer": "search_analyzer", 
      "fields": [
        "title^10",
        "content^1"
      ],
      "minimum_should_match": "80%"
    }
  },
  "highlight": {
    "fields": {
      "content": {},
      "title": {}
    }
  }
}

其中这三个参数至关重要!它解决了我在开篇提到的需求2(连续命中越多得分越大) 

"tie_breaker": 0.3,默认值为0。使用单个最佳匹配查询子句的分数。同时,也可以通过参数 tie_breaker 控制其他查询子句的分数对 _score 的影响。相关性得分计算公式:_score = max(BM25) + ∑ other(BM25)*tie_breaker

 "analyzer": "search_analyzer"。 这个是非常重要的(这里search_analyzer是我自定义的,如果没有修改。就指定为ik_smart。)。假如使用了中文分词器,建议在index的时候使用ik_max_word。检索的时候指定 ik_smart。检索的效果会更好一些。否则,如下不同分词器效果展示。如果检索使用ik_max_word,会检索出来很多不相关的内容。单个字命中,召回的数据会严重影响搜索相关性。

注意:关于analyzer并不是固定的。分场景来设置。如果关注句子匹配的效果,可以设置成 ik_max_word。如果是关注模糊匹配的召回效果,使用ik_smart会更好一些。

 "minimum_should_match": "80%" ,该参数会减少召回不相关的内容。可以把连续命中更多的内容返回。

  注意:以上一几个参数的效果。也仅仅只能达到70%的效果。想要90%以上的效果,还要再来点黑科技。

不同分词效果展示

GET _analyze
{
  "text": [
    "联合利剑"
  ],
  "analyzer": "ik_smart"
}

# ik_smart分词效果
{
  "tokens" : [
    {
      "token" : "联合",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "利剑",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 1
    }
  ]
}


GET _analyze
{
  "text": [
    "联合利剑"
  ],
  "analyzer": "ik_max_word"
}

# ik_max_word 分词效果
{
  "tokens" : [
    {
      "token" : "联合",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "联",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "合利",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "合",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "利剑",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "利",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 5
    },
    {
      "token" : "剑",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 6
    }
  ]
}

2.7.2 使用function_score 打分函数,来调整打分

  例如,开篇提的需求,想把连续命中越多的越优先放在前边。那么可以通过使用句子匹配,对完全命中的排在前边。下边例子中,我希望完全命中title的加分。

GET demo_index/_search
{
  "_source": [
    "title",
    "content"
  ],
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": [
            {
              "multi_match": {
                "query": "联合利剑",
                "type": "best_fields",
                "tie_breaker": 0.3,
                "fields": [
                  "title",
                  "content"
                ],
                "minimum_should_match": "80%"
              }
            }
          ]
        }
      },
      "functions": [
        {
          "filter": {
            "match_phrase": {
              "title": "联合利剑"
            }
          },
          "weight": 10
        }
      ],
      "score_mode": "max",
      "boost_mode": "multiply"
    }
  }
}

 function_score 有很多的参数,有很多新鲜的玩法。这里不过多展开了,这里提供一个官网的地址

Function score query | Elasticsearch Guide [8.7] | Elastic

  注意:function函数会在检索过程中的每一条数据上应用。增加了单次检索的时间复杂度。所以会略微影响性能。

2.7.3 使用rescore 来调整打分

rescore 和 function_score不同的是,resocore是一种粗排再精排的思路。也就是function_score是对全局的数据排序。而rescore 只是对一次召回的结果进行重新排序。优点是性能影响小缺点是影响召回的质量

使用语法如下:

GET demo_index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "content": {
              "query": "联合利剑",
              "minimum_should_match": "80%"
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "联合利剑"
            }
          }
        }
      ]
    }
  },
  "rescore": {
    "window_size": 10,
    "query": {
      "rescore_query": {
        "match_phrase": {
          "title": {
            "query": "联合利剑",
            "slop": 0
          }
        }
      }
    }
  }
}

2.7.4 使用修改BM25中的 b和k1参数

  这里根据经验,在词频和句子长度对得分影响大的时候可以尝试修改。

PUT /demo_index
{
  "settings": {
    "similarity": {
      "my_similarity": {
        "type": "BM25",
        "b": 0.8,
        "k1": 1.5
      }
    }
  },
  "mappings": {
    "properties": {
        "title": {
          "type": "text",
          "similarity": "my_similarity"
        }
      }
  }
}

效果演示如下:使用explain来看得分计算过程。

POST demo_index/_search
{
  "explain": true, 
  "query": {
    "match": {
      "title": "联合利剑"
    }
  }
}

可以看到召回结果中,得分计算过程,b已经被改成了0.8默认为0.75 

ES相关性检索中的一些坑

  不同的index,各自计算各自的分数。因为不同的index TF和IDF都不一样。可能会出现,同一条数据在A index 得分大于 B index。导致一个奇怪的效果,就是召回的结果中,明明数据a 比b好,但是a排在了b的后边。

  即使是同一index,不同的shard,也一样有以上的问题。es中数据维护的单元是shard。shard又是由segment组成的。这会影响最后的召回效果。如果可以的话将segment 合并成一个。如果数据不是太多,尽可能维护更少的shard。(单个shard最多不超过50G,不要小于30G)

  搜索不是100的事情,不管如何都做不到100%召回结果。只能通过上边提的方法,去尝试调整。另外不同的场景,分情况讨论,或者使用不同的方式来解决,也能最终解决问题。

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

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

相关文章

卡尔曼滤波与组合导航原理笔记(一) 第一部分 滤波的基本概念、递推最小二乘

文章目录 一、滤波的基本概念1、传统数字滤波器2、现代控制中的状态观测器3、最优估计的含义4、温度估计的例子1.问题描述2.分析 二、递推最小二乘 课程链接:https://www.bilibili.com/video/BV11K411J7gp/?p1 参考书目:《捷联惯导算法与组合导航原理》…

搭建本地MQTT服务器实现局域网通信

在这里mqtt就不多做介绍了直接上手怎么搭建本地服务器 一-. 我们先下载一个emqx,我们可以去官网下载免费的 https://www.emqx.io/https://www.emqx.io/ 下载完成之后我们打开这个文件夹 然后进入bin目录在左上角输入cmd然后回车 如果操作成功会来到这个界面 在这…

不压缩打包layui

手动打包 下载layui源码(当前版本2.6.4),并解压缩 下载地址:layui gitee 安装nodejs(v10.24.1) 下载链接 windows-x64 安装cnpm npm install -g cnpm -registryhttps://registry.npm.taobao.org全局安…

Real3D 动画书 jQuery 插件

Real3D FlipBook jQuery Plugin 插件 新 – 用于 REAL3D 动画书 JQUERY 插件的 PDF 到图像转换器 一种将 PDF 转换为图像和 JSON 的工具,用于创建带有链接、文本搜索和文本选择的优化 PDF 活页簿。 使用图像和 JSON 创建的 PDF 动画书加载页面的速度比标准 PDF 动画…

i.MX6ULL点灯

i.MX6ULL点灯 对应底板原理图找到对应的IO引脚号 CCGR寄存器共有七个,分别是0~6。 使能时钟,CCGR0~6这7个寄存器控制着6ULL所有外设时钟的使能。 为了简单,设置CCGR0~6这7个寄存器全部为0xFFFFFFFF,相当于使能所有外设时钟。 …

springboot项目外卖管理 day01-项目搭建以及后台登陆

文章目录 一、软件开发整体介绍1.1、软件开发流程1.2、角色分工1.3、软件环境1.4、技术选型1.5、功能架构1.6、角色 二、环境搭建2.1、数据库的创建2.2、创建springboot项目并添加依赖2.3、配置yml文件2.4、将前端页面配置进resource目录![在这里插入图片描述](https://img-blo…

ec-canvas 在小程序上的使用

文章目录 I. 前言echarts、ec-canvas,在小程序中进行数据可视化的意义 II. 安装ec-canvas1. 下载安装ec-canvas组件2. 配置组件参数 III. 初识ec-canvas1. echarts在微信小程序中的工作原理2. echarts小程序版的局限性与创新点3. 通过一个简单的示例了解ec-canvas的…

chatgpt赋能python:Python备份列表l:保护你的重要数据

Python备份列表l: 保护你的重要数据 当我们谈到数据的安全性时,备份是非常重要的。备份应该是在任何操作之前考虑的,因为在数据丢失或计算机崩溃时,我们需要在短时间内恢复数据。在这篇文章中,我们将讨论Python备份列表l。 什么…

【python技能树】python简介

1 Python定义 Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构,它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言: 开发过程中没有了编译这个环节。类似于…

Linux系统-Ubuntu安装指定版本的内核

Ubuntu安装指定版本的内核 以下演示 Linux 系统内核,手动安装的话可以安装所有指定版本的内核。 查看当前系统内核 uname -sr接下来以安装 5.13.0 内核为例 首先去 http://kernel.ubuntu.com/~kernel-ppa/mainline/找到内核版本为5.13.0 的链接 根据电脑64位处理器 选择 AM…

chatgpt赋能python:Python奇数和偶数和

Python奇数和偶数和 在Python编程中,奇数和偶数和是一个基本的概念。奇数和偶数是指整数的特定类型,其中奇数是指不能被2整除的正整数,偶数是指可以被2整除的正整数。本文将介绍Python中计算奇数和偶数和的方法。 计算奇数和偶数 要计算奇…

「QT」QT5程序设计目录

✨博客主页:何曾参静谧的博客 📌文章专栏:「QT」QT5程序设计 目录 📑【QT的基础知识篇】📑【QT的GUI编程篇】📑【QT的项目示例篇】📑【QT的网络编程篇】📑【QT的数据库编程篇】📑【QT的跨平台编程篇】📑【QT的高级编程篇】📑【QT的开发工具篇】📑【QT的调…

chatgpt赋能python:Python地址怎么写的SEO

Python地址怎么写的SEO 随着数字化时代的到来,搜索引擎优化(SEO)已成为网站排名和流量的重要因素。为了让Python 相关网站在搜索引擎上更加有利的排名,需要了解Python地址要怎么写才能获得更好的SEO效果。 为什么地址要写好 地…

操作系统(进程与线程,复习自用)

进程与线程 进程与线程进程的概念、组成、特征进程的状态与转换进程控制进程通信(IPC)线程概念 多线程模型线程的实现方式 多线程模型线程的状态与转换 CPU调度与上下文切换调度的概念、层次进程调度的时机 切换与过程调度方式调度器 闲逛进程调度算法的…

chatgpt赋能python:Python备份交换机:保障网络安全的必备工具

Python备份交换机:保障网络安全的必备工具 在当今互联网时代,因特网已经成为了全球的必备基础设施。然而,在使用网络的过程中,我们也会遭遇到各种各样的问题,其中最常见的就是网络中断或数据丢失。特别是对于企业和组…

javaScript蓝桥杯----绝美宋词

目录 一、介绍二、准备三、目标四、代码五、踩坑六、完成 一、介绍 “今宵酒醒何处,杨柳岸晓风残月”,“蓦然回首,那人却在灯火阑珊处”,“试问闲愁都几许?一川烟草,满城风絮,梅子黄时雨” … …

K8s网络管理 flannel

K8s网络管理 flannel 1 网络管理1.1 Service1.1.1 网络体系1.1.2 工作模型1.1.3 SVC实践1.1.4 IPVS实践 1.2 其他资源1.2.1 域名服务1.2.2 CoreDNS1.2.3 无头服务 2 容器网络2.1 网络方案2.2 flannel2.3 主机网络 1 网络管理 1.1 Service 1.1.1 网络体系 应用流程 资源对象…

Elasticsearch基础

Elasticsearch是搜索服务器 视频地址:https://www.bilibili.com/video/BV1Sy4y1G7LL/?p6&spm_id_from333.880.my_history.page.click&vd_sourcefc7fa697b97f292319c5b0cde4755484 下载地址:[https://artifacts.elastic.co/downloads/elasticse…

赋予品牌文化原力,从已有文化中挖掘

赋予品牌以文化原力,从已有文化中挖掘 华与华总结为: 寻找母体,寄生母体,成为母体,壮大母体 非常经典的例子:微信红包 趣讲大白话:文化有持续的力量 【趣讲信息科技186期】 *******************…

Redisson看门狗机制为什么比将锁设置成永久有效期更好?

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…