笔记十二: 显示 Mapping 设置与常见参数
如何显示定义一个Mapping
PUT movies
{
"mappings" : {
// define your mappings here
}
}
自定义Mapping的一些建议
- 可以参考API手册,纯手写
- 为了减少输入的工作量,减少出错率,依照以下步骤
- 创建一个临时的index,写入一些样本数据
- 通过访问 Mapping API获得该临时文件的动态 Mapping 定义
- 修改后用,使用该配置创建的索引
- 删除临时索引
控制当前字段是否被索引
- index - 控制当前字段是否被索引。默认为true。如果设置成false,该字段不可被搜索。
PUT users { "mappings" : { "properties" : { "firstName" : { "type" : "text" }, "lastName" : { "type" : "text" }, "mobile" : { "type" : "text", "index": false } } } }
Index Options
- 四种不同级别的 Index Options 配置,可以控制倒排索引记录的内容
- docs - 记录 doc id
- freqs - 记录 doc id 和 term frequencies
- positions - 记录 doc id / term frequencies / term position
- offsets - doc id / term frequencies / term posistion / character offects
- Text 类型默认记录 postions,其他默认为docs
- 记录内容越多,占用存储空间越大
null_value
- 需要对NULL 值实现搜索
- 只有 Keyword 类型支持设定 Null_Value
DELETE users PUT users { "mappings" : { "properties" : { "firstName" : { "type" : "text" }, "lastName" : { "type" : "text" }, "mobile" : { "type" : "keyword", //这个如果是text 无法设置为空 "null_value": "NULL" } } } } PUT users/_doc/2 { "firstName":"Li", "lastName": "Sunke", "mobile": null } GET users/_search?q=mobile:NULL //搜索结果 "_source" : { "firstName" : "Li", "lastName" : "Sunke", "mobile" : null }
copy_to
- _all 在 7中已经被 copy_to 所替代
- 满足一些特定的搜索需求
- copy_to 将字段的数值拷贝到目标字段,实现类似 _all 的作用
- copy_to 的目标字段不出现在_source 中
DELETE users PUT users { "mappings": { "properties": { "firstName":{ "type": "text", "copy_to": "fullName" }, "lastName":{ "type": "text", "copy_to": "fullName" } } } } PUT users/_doc/1 { "firstName":"Li", "lastName": "Sunke" } //没有新建字段 GET users/_doc/1 { "_index" : "users", "_type" : "_doc", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "firstName" : "Li", "lastName" : "Sunke" } } GET users/_search?q=fullName:(Li sunke)
数组类型
- Elasticsearch 中不提供专门的数组类型。但是任何字段,都可以包含多个相同类型的数值
DELETE users PUT users/_doc/1 { "name":"onebird", "interests":"reading" } PUT users/_doc/1 { "name":"twobirds", "interests":["reading","music"] } GET users/_mapping //部分代码 "interests" : { "type" : "text", //类型还是text "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }
PS: text
类型会使用默认分词器分词,当然你也可以为他指定特定的分词器。如果定义成keyword
类型,那么默认就不会对其进行分词。
es对字符串类型的mapping
设定,会将其定义成text
,同时为他定义一个叫做keyword
的子字段。keyword
只是他的名字,你也可以定义成kw
。这个字段的类型是keyword
(这是一个类型的关键字)
多字段类型情况下,你可以查询 title
,也可以查询title.keyword
查询类型为keyword
的子字段
本作品采用《CC 协议》,转载必须注明作者和本文链接