倒排索引
- 把匹配的条件当作 分词
- 正向索引的话,是需要从所有行找到匹配 分词 的目标行
- 倒排索引, 是通过 分词 直接关联到目标行
- 把文件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
来查看具体含义GET /movie/_search
{
"explain": true,
"query": {
"match": {
"title": "steve"
}
}
}
分片
- 有主分片和从分片
- 一个节点不能同时存在主分片和从分片
- 一个节点不能包括相同 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的倒排索引
- 比如指定了 english 分词器