倒排索引

  • 把匹配的条件当作 分词
  • 正向索引的话,是需要从所有行找到匹配 分词 的目标行
  • 倒排索引, 是通过 分词 直接关联到目标行
    • 把文件ID对应到关键词的映射转换为关键词到文件ID的映射

打分

TF-IDF 打分

  • TF:term frequency. 词频,document 包含了多少目标分词,越多表明越相关
  • DF: document frequency. 文档频率,包含目标分词的文档数量
  • IDF: DF 取反,可以视为区分度。
    • DF 作为分母,越大则 IDF 比例越小,表明区分度越低。
  • TF*IDF 分值高的,会优先被搜索出来

TFNORM

  • term frequency nomalized: 词频归一化
  • TF 操作会进行词频归一化,避免由于 document 的某个 field 太长导致分数太低

BM25

  • 解决词频问题
  • "description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:", 中的 k1 * (1 - b + b * dl / avgdl)
  • 解释可以通过 explain 来查看具体含义
    1. GET /movie/_search
    2. {
    3. "explain": true,
    4. "query": {
    5. "match": {
    6. "title": "steve"
    7. }
    8. }
    9. }

分片

  • 有主分片和从分片
    • 一个节点不能同时存在主分片和从分片
    • 一个节点不能包括相同 document 的多个分片
  • 如果从分片不能在n-1个节点上都存在(主分片和从分片不能同时存在一个节点上),那么整个 es 就处于 warning 状态
  • master 节点负责路由和处理写请求,因为 master 节点直到各个主分片的具体位置
    • 主分片不一定位于 master 节点上,这个要注意

分布式索引原理

  • master 节点负责写请求的路由
    • 会通过 document id 找到该 document 的主分片所在节点
    • 对应路由写好后,会通知其他从分片进行同步更新
  • master 节点挂掉后,会通过paxos方式从具备竞争主节点能力的机器中竞选主节点后,所有写请求都要通过主节点
  • 读请求会进行 负载均衡
    • 不管是不是 master 节点

Analyze

  • 分词的过程:
    • 字符过滤器,根据需要去除不需要的字符
    • 字符处理,根据需要分割字符
      • 标准字符处理器,是根据空格和标点符号分割内容
    • 分词过滤,对分割后的字符做处理
      • 一般是变小写
      • english 分词器,还会对分割后的字符做提取词干
  • 插入和查询,都是跟着这个过程来着
    • 比如指定了 english 分词器
      • 插入 Eating a apple,根据分词后,会分为 eat appl 两个词干,这两个词干分词就会作为倒排索引指向当前 document
      • 使用 eating 进行查找,根据分词后,会分为 eat,命中 eat的倒排索引