目录
Elasicsearch优化-B站视频笔记
/      

Elasicsearch优化-B站视频笔记

携程架构师

https://www.bilibili.com/video/BV1NY411573K/?spm_id_from=333.788

集群侧的优化

1、优化部署方式

  • 尽可能使用高配置和SSD、独占资源

    SSD具有高效的读写数据和稳定性

  • 核心业务集群配置专有主节点:如master节点、写入节点、数据节点、协调节点。

2、最优化容量规划

  • 分片和副本规划
    • 每个分片不超过 30 GB
    • 拒绝 “ 一拖N ”,防止单台节点和CPU负载飙高

ES高可用架构部署:读写分离、流量隔离、减少超时

LB -> 协调节点 -> 数据节点 -> 主节点

LB -> Ingest 节点 -> 数据节点 -> 主节点

这里的LB是软负载;例如(Nginx)

硬负载和软负载的概念可以参考:https://blog.csdn.net/swadian2008/article/details/119960016

避免频繁更新

服务侧的优化

索引拆分

合理分片

合理副本

日志方案

// TODO

自定义打分机制(笔记)

B站视频:https://www.bilibili.com/video/BV1Ji4y127Tg/?spm_id_from=pageDriver

例如:好好学习,天天向上; 类型为 text

倒排索引为:

(term)		(construct)
好		->		docId\frequency\position\payload
好
学
习

Payload: 是lucene 提供的一个可以在索引的过程中将关键词权重与文档进行一个关联

  • Lucene 默认 TFIDF 打分机制

    $$
    score(q, d)=coord(q, d) * queryNorm(q) * \sum_{t \in d}(tf(t \in d) * idf(t)^2 * boost(t) * norm(t, d))
    $$

    score(q, d): 总得分

    Coord(q, d): 协调因子

    queryNorm(q): 查询范数

    Tf(t-d): 词频

    Idf(t)^2: 逆文档概率

    boost(t): 词项权重

    norm: 长度范数

  • Lucene 自定义 Payload 打分机制

    $$
    score(q, d) = coord(q, d) * queryNorm(q) * \sum_{t \in d} (tf(t \in d) * idf(t)^2 * Payload(t \in d) * boost(t) * norm(t, d)) * boost(q)
    $$

    $$
    score(q, d) = 1 * 1 * \sum_{t \in d} (1 * 1 * Payload(t \in d) * boost(t) * 1 * boost(q)
    $$

    将其他项设置为1,用我们自定义 Payload 来绝对最终评分

    其他同上

    Payload(t-d): Payload 得分

    boost(q): 查询权重

我们可以通过重写这个公式,打包成插件,安装到我们的 elastic 集群中,实现自定义评分

场景一

商城搜索,两个用户分别为男1、女1,搜索关键字 “苹果”,根据数据库中已有的数据可知 男1职业为厨师、女1为IT工作人员。期望不同用户搜索的,最终返回的数据为他们更为关注的。

需求:

让女1搜索的 “苹果” 优先召回苹果手机等相关的

让男1搜索的 “苹果” 优先召回水果苹果等相关的

自定义分析器(Analyzer)

当 Elasticsearch 自带的分词器无法满足时,可以自定义分词器。通过组合不同的组件实现

  • Character Filter
  • Tokenizer
  • Token Filter

Character Filter(字符过滤器)

  • 字符过滤器以字符流的形式接收原始文本,并可以通过添加、删除或更改字符来转换该流。一个分析器可能有0个或多个字符字符过滤器。

在 Tokenizer 对文本进行处理,例如增加删除以及替换字符。可以配置多个 Character Filter 。会影响 Tokenizer 的 position 和 offset 信息。

一些自带的 Character Filter

  • HTML strip - 去除 html 标签
  • Mapping - 字符串替换
  • Pattern replace 正则匹配替换

Tokenlizer(分词器)

  • 一个分词器接收一个字符流,并将其拆分单个 token(通常是单个单词),并输出一个 token 流。比如使用whitespace分词器,当遇到空格的时候会将文本拆分成 token。

    一个分析器只能有一个分词器

  • 将原始的文本按照一定的规则,切分为词(term or token)

  • Elasticsearch 内置的 Tokenizers

    • whitespace / standard / uax_url_mail / pattern / keyword / path hierarchy
  • 可以用 Java 开发 插件,实现自己的 Tokenizer

  • ES内置分词器

    • 标准分词器 Standard Tokenizer (standard)
    • 连词分词器 NGram Tokenizer (ngram)
    • 边际连词分词器 Edge NGram Tokenizer (edge_ngram)
    • 关键字分词器 Keyword Tokenzier 不分词 (keyword)
    • 字符分词器 Letter Tokenizer 将文本按非字符 (non lentter) 进行分词 (letter)
    • 小写分词器 Lower case Tokenizer 小写后,再按字符分词器 Letter Tokenizer (lowercase)
    • 空格分词器 Whitespace Tokenizer 以空格来分词 (whitespace)
    • 模式分词器 / 正则分词器 Pattern Tokenizer (pattern)
    • 标准 Email URL 分词器 UAX Email URL Tokenizer 把 email 和 url 当作一个词 (uax_url_emial)
    • 路径层次分词器 Path Hiberarchy Tokenizer 按默认定界符:'/' 路径分割 (path_hierarchy)

Token filter(token 过滤器)

  • token 过滤器接收 token 流,并且可能会添加、删除或更改 tokens。比如一个 lower case token 可以将所有的 token 转成小写。一个分析器可能有 0 个或多个 token 过滤器,它们按顺序应用。

  • 内置分词过滤器:

    • 标准分词过滤器 (standard)

    • 小写分词过滤器 (lowercase)

    • 长度分词过滤器 (length)

      长度分词过滤器将长度超过最短和最长限制范围的单词过滤掉

    • 停用词分词过滤器 (stop)

参考

https://wenku.baidu.com/view/582a906b2d3f5727a5e9856a561252d380eb2015.html

https://blog.csdn.net/m0_37661458/article/details/107462575


标题:Elasicsearch优化-B站视频笔记
作者:gitsilence
地址:https://blog.lacknb.cn/articles/2022/06/05/1654425633205.html