Elasticsearch关键术语 系列博文 目的只用来了解概念 ; 其中 涉及到的配置和使用 是为了方便日后使用时查询的
Document文档
概念
一条数据 是可搜索的最小单位
数据形态
JSON格式 支持数组 支持嵌套
JSON对象由Field字段组成
每个字段都有字段类型 (可先指定 或 ES自动推算)
拥有的元数据
- _id
- 文档唯一ID(可自己指定 或ES自动生成)
- _index
- 文档的index索引名
- _type
- 文档的type类型名 (ES7 都是_doc)
- _source
- 文档的原始json数据
- _version
- 文档的版本信息
- _score
- 文档的相关性算分
下边展开介绍 _score相关性算分
_score 相关性算分
概念
ES根据一个算法计算的 查询语句和一个文档的匹配度
作用
用于搜索结果的排序 分高的先展示
相关性算分的简单方法
搜索字符串 去掉stopwords介词等后 将每个词的TF词频相加
算法
ES默认算法
-
ES5之前 默认TF-IDF算法
-
相关概念
- DF 文档频率 : 检索词在所有文档中出现的频率 Document Frequency
- IDF 逆文档频率 : Inverse Document Frequuency = log2(全部文档数➗检索词出现过的文档总数)
-
Lucene的TF-IDF 算法公式
-
效果举例
- 英文为主的文章中 出现几个德文 德文算分高 因为稀有
-
-
ES5开始 默认BM25算法
- 优点
- 对TF-IDF做了优化 (当TF值增加到定值时 TF-IDF会持续猛增 BM25会超缓慢增加趋于一个数值)
- Lucene的BM25算法公式
- 参数
- k : 默认值1.2 数值越小 饱和度越高
- b : 默认值0.75 取值范围0-1 0代表禁止Normalization标准化
- 参数
- 优点
similarity 自定义算法
-
概念
- 创建Index时setting设置自定义算法 mapping将自定义算法设置到指定字段上
-
语法示例
PUT my_index { "settings":{ "similarity":{ "custom_similarity":{ "type":"BM25", "b":0, "k1":2 } } }, "mappings":{ "doc":{ "properties":{ "custom_text":{ "type":"text", "similarity":"custom_similarity" }, "default_text":{ "type":"text" } } } } }
Information Retrieval 衡量相关性参考
规则
- Precision 查准率 – 尽可能返回较少无关文档
- Recall 查全率 – 尽可能返回较多相关文档
- Ranking 相关度 – 是否能按相关度排序
文档到分片的路由算法
公式
shard = hash(_routing) % number_of_primary_shards
- hash算法确保文档均匀分散到分片中
- 默认的_routing值是文档id
- 可自行定制routing数值 例如相同国家的商品 都分配到指定的shard
- 这也是 设置index settings后 主分片数 不能随意修改的根本原因
参考
阮一名资料
官方文档
百度