ElasticSearch 映射


关系型数据库对比

字段映射===关系型数据库的表结构
在映射中事先定义字段的数据类型、字段的权重分词器等属性
如同在关系型数据库中创建数据表时会设置字段的类型
类似数据库的ddl语句

根据业务搭建数据结构

关注方向:

  1. 分词:
  • 作用: 把查询的内容(分词),当作索引进行使用,可以加快查询使用
  • 技术: IK分词器,把新华字典里有的词作为一个词;自定义分词:手动录入,es中有个dic文件,将新增的分词录入到这个文件,es会自动进行加载
  • 例如:商品名称
  1. 哪些字段进行过滤
    平台属性值
    分类Id
  2. 哪些字段我们需要通过搜索查询出来。
    商品名称,价格,图片等。

映射分类

动态映射

根据字段的类型自动识别
在导入数据之前不确定有哪些字段,也不清楚字段的类型是什么,使用动态映射非常合适

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
    {
      "mappings": {
        "it": {
          "dynamic": "strict",
          "properties": {
            "title": {
              "type": "text"
            },
            "publish_date": {
              "type": "date"
            }
          }
        }
      }
    }
    新字段在 mapping 中并没有定义时,会抛出 strict_dynamic_mapping_exception 异常

静态映射

写入数据之前对字段的属性进行手动设置。
创建索引时手动指定索引映射,静态映射可以添加更详细、更精准的配置信息

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)


文章作者: zrh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zrh !
  目录