关系型数据库对比
字段映射===关系型数据库的表结构
在映射中事先定义字段的数据类型
、字段的权重
、分词器
等属性
如同在关系型数据库中创建数据表时会设置字段的类型
类似数据库的ddl语句
根据业务搭建数据结构
关注方向:
- 分词:
- 作用: 把查询的内容(分词),当作索引进行使用,可以加快查询使用
- 技术: IK分词器,把
新华字典
里有的词作为一个词;自定义分词:手动录入,es中有个dic文件,将新增的分词录入到这个文件,es会自动进行加载 - 例如:商品名称
- 哪些字段进行过滤
平台属性值
分类Id - 哪些字段我们需要通过搜索查询出来。
商品名称,价格,图片等。
映射分类
动态映射
根据字段的类型自动识别
在导入数据之前不确定有哪些字段,也不清楚字段的类型是什么,使用动态映射非常合适
JSON 格式的数据 | 自动推测的字段类型 |
---|---|
null | 没有字段被添加 |
true or false | boolean 类型 |
浮点类型数字 | float 类型 |
数字 | long 类型 |
JSON 对象 | object 类型 |
数组 | 由数组中第一个非空值决定 |
string | 有可能是 date 类型(若开启日期检测)、double 或 long 类型、text 类型、keyword 类型 |
dynamic
在 mapping 中可以通过 dynamic
设置来控制是否自动新增字段
接受以下参数:
- true:默认值为 true,自动添加字段。
- false:忽略新的字段。
- strict:严格模式,发现新的字段抛出异常。
例:
创建一个 books 索引并指定 mapping,设置 it 类型下 dynamic 属性的取值为 strict,也就是说,it 类型下的文档中出现 mapping 中没有定义的字段会抛出异常PUT books
新字段在 mapping 中并没有定义时,会抛出 strict_dynamic_mapping_exception 异常{ "mappings": { "it": { "dynamic": "strict", "properties": { "title": { "type": "text" }, "publish_date": { "type": "date" } } } } }
静态映射
写入数据之前对字段的属性进行手动设置。
创建索引时手动指定索引映射,静态映射可以添加更详细、更精准的配置信息
mapping 属性
elasticsearch 的 mapping 中的字段属性非常多,具体如下表格:
字段属性
属性名 描述
type 字段类型,常用的有 text、integer 等等。
store 是否存储指定字段,可选值为 true|false,设置 true 意味着需要开辟单独的存储空间为这个字段做存储,而且这个存储是独立于 _source 的存储的。
norms 是否使用归一化因子,可选值为 true|false,不需要对某字段进行打分排序时,可禁用它,节省空间;type 为 text 时,默认为 true;而 type 为 keyword 时,默认为 false。
index_options
索引选项控制添加到倒排索引(Inverted Index)的信息,这些信息用于搜索(Search)和高亮显示:
docs:只索引文档编号(Doc Number);
freqs:索引文档编号和词频率(term frequency);
positions:索引文档编号,词频率和词位置(序号);
offsets:索引文档编号,词频率,词偏移量(开始和结束位置)和词位置(序号)。
默认情况下,被分析的字符串(analyzed string)字段使用 positions,其他字段默认使用 docs。
此外,需要注意的是 index_option 是 elasticsearch 特有的设置属性;临近搜索和短语查询时,index_option 必须设置为 offsets,同时高亮也可使用 postings highlighter。
term_vector
索引选项控制词向量相关信息:
no:默认值,表示不存储词向量相关信息;
yes:只存储词向量信息;
with_positions:存储词项和词项位置;
with_offsets:存储词项和字符偏移位置;
with_positions_offsets:存储词项、词项位置、字符偏移位置。
term_vector 是 lucene 层面的索引设置。
similarity
指定文档相似度算法(也可以叫评分模型):
BM25:es 5 之后的默认设置。
copy_to 复制到自定义 _all 字段,值是数组形式,即表明可以指定多个自定义的字段。
analyzer 指定索引和搜索时的分析器,如果同时指定 search_analyzer 则搜索时会优先使用 search_analyzer。
search_analyzer 指定搜索时的分析器,搜索时的优先级最高。
fielddata
默认是 false,因为 doc_values 不支持 text 类型,所以有了 fielddata,fielddata 是 text 版本的 doc_values,也是为了优化字段进行排序、聚合和脚本访问。
和 doc_values 不同的是,fielddata 使用的是内存,而不是磁盘;因为 fielddata 会消耗大量的堆内存,fielddata 一旦加载到堆中,在 segment 的生命周期之内都将一致保持在堆中,所以谨慎使用。
创建映射
PUT http://127.0.0.1:9200/索引名/_mapping/类型名
字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射 (mapping)