hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情
- 起始标记->Elasticsearch入门(15讲):「19 | 基本概念:显式Mapping设置与常见参数介绍」
- 结尾标记->Elasticsearch入门(15讲):「20 | 基本概念:多字段特性及Mapping中配置自定义Analyzer」
显式Mapping设置与常见参数介绍
如何显式定义一个 Mapping
自定义Mapping的一些建议
- 可以参考API手册,纯手写
- 为了减少输入的工作量,减少出错概率,可以依照以下步骤
- 创建一个临时的index ,写入一些样本数据
- 通过访问Mapping API获得该临时文件的动态Mapping定义
- 修改后用,使用该配置创建你的索引
- 删除临时索引
控制当前字段是否被索引
- Index -控制当前字段是否被索引。默认为true。如果设置成false, 该字段不可被搜索
Demo
加入一个新的文档
查询
查询失败
Index Options
- 四种不同级别的Index Options配置,可以控制倒排索引记录的内容
- docs-记录docid
- 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
Demo
新增一个文档
查询
可以查到
Copy_to
- _all在7中被copy_to所替代
- 满足一些特定的搜索需求
- copy_ to将字段的数值拷贝到目标字段,实现类似 _all的作用
- copy_ to的目标字段不出现在 _source 中
数组类型
- Elasticsearch中不提供专门的数组类型。但是任何字段,都可以包含多个相同类类型的数值
CodeDemo
#设置 index 为 false DELETE users PUT users { "mappings" : { "properties" : { "firstName" : { "type" : "text" }, "lastName" : { "type" : "text" }, "mobile" : { "type" : "text", "index": false } } } }
PUT users/_doc/1 { "firstName":"Ruan", "lastName": "Yiming", "mobile": "12345678" }
POST /users/_search { "query": { "match": { "mobile":"12345678" } } }
#设定Null_value
DELETE users PUT users { "mappings" : { "properties" : { "firstName" : { "type" : "text" }, "lastName" : { "type" : "text" }, "mobile" : { "type" : "keyword", "null_value": "NULL" } } } }PUT users/_doc/1 { "firstName":"Ruan", "lastName": "Yiming", "mobile": null }
PUT users/_doc/2 { "firstName":"Ruan2", "lastName": "Yiming2" }
GET users/_search { "query": { "match": { "mobile":"NULL" } } }
#设置 Copy to DELETE users PUT users { "mappings": { "properties": { "firstName":{ "type": "text", "copy_to": "fullName" }, "lastName":{ "type": "text", "copy_to": "fullName" } } } }
PUT users/_doc/1 { "firstName":"Ruan", "lastName": "Yiming" }
GET users/_search?q=fullName:(Ruan Yiming)
POST users/_search { "query": { "match": { "fullName":{ "query": "Ruan Yiming", "operator": "and" } } } }
#数组类型 PUT users/_doc/1 { "name":"onebird", "interests":"reading" }
PUT users/_doc/1 { "name":"twobirds", "interests":["reading","music"] }
POST users/_search { "query": { "match_all": {} } }
GET users/_mapping
相关阅读
- Mapping Parameters www.elastic.co/guide/en/el…
多字段特性及Mapping中配置自定义Analyzer
多字段类型
- 多字段特性
- 厂商名字实现精确匹配
- 增加一个 keyword 字段
- 使用不同的analyzer
- 不同语言
- pinyin 字段的搜索
- 还支持为搜索和索引指定不同的 analyzer
- 厂商名字实现精确匹配
Exact Values v.s Full Text
- Exact Values v.s Full Text
- Exact Value: 包括数字 / 日期 / 具体的一个字符串 (例如“Apple Store”)
- Elasticsearch 中的keyword
- 全文本,非结构化的文本数据
- Elasticsearch 中的 text
- Exact Value: 包括数字 / 日期 / 具体的一个字符串 (例如“Apple Store”)
Exact Values不需要被分词
- Elasticsearch 为每一个字 段创建一个倒排索引
- Exact Value在索引时,不需要做特殊的分词处理
自定义分词
- 当 Elasticsearch自带的分词器无法满足时,可以自定义分词器。通过自组合不同的组件实现
- Character Filter
- Tokenizer
- Token Filter
Character Filters
- 在Tokenizer之前对文本进行处理,例如增加删除及替换字符。可以配置多个Character Filters。 会影响Tokenizer的position 和offset 信息
- 一些自带的Character Filters
- HTML strip - 去除html标签
- Mapping - 字符串 替换
- Pattern replace - 正则匹配替换
Demo
Tokenizer
- 将原始的文本按照一定的规则,切分为词(term or token)
- Elasticsearch 内置的Tokenizers
- whitespace / standard / uax_ ur_email / pattern / keyword / path hierarchy
- 可以用 Java开发插件,实现自己的Tokenizer
Demo
Token Filters
- 将Tokenizer输出的单词( term ),进行增加,修改,删除
- 自带的Token Filters
- Lowercase /stop / synonym (添加近义词)
Demo
设置一个 Custom Analyzer
Demo
CodeDemo
PUT logs/_doc/1 {"level":"DEBUG"}
GET /logs/_mapping
POST _analyze { "tokenizer":"keyword", "char_filter":["html_strip"], "text": "hello world" }
POST _analyze { "tokenizer":"path_hierarchy", "text":"/user/ymruan/a/b/c/d/e" }
#使用char filter进行替换 POST _analyze { "tokenizer": "standard", "char_filter": [ { "type" : "mapping", "mappings" : [ "- => _"] } ], "text": "123-456, I-test! test-990 650-555-1234" }
//char filter 替换表情符号 POST _analyze { "tokenizer": "standard", "char_filter": [ { "type" : "mapping", "mappings" : [ ":) => happy", ":( => sad"] } ], "text": ["I am felling :)", "Feeling :( today"] }
// white space and snowball GET _analyze { "tokenizer": "whitespace", "filter": ["stop","snowball"], "text": ["The gilrs in China are playing this game!"] }
// whitespace与stop GET _analyze { "tokenizer": "whitespace", "filter": ["stop","snowball"], "text": ["The rain in Spain falls mainly on the plain."] }
//remove 加入lowercase后,The被当成 stopword删除 GET _analyze { "tokenizer": "whitespace", "filter": ["lowercase","stop","snowball"], "text": ["The gilrs in China are playing this game!"] }
//正则表达式 GET _analyze { "tokenizer": "standard", "char_filter": [ { "type" : "pattern_replace", "pattern" : "http://(.*)", "replacement" : "$1" } ], "text" : "www.elastic.co" }
总结
学习了如何去定义一个Mapping文件,当我们有一些特定的需求的时候,就可以创建自己所需要的Mapping。学习了ES多字段的特性,也学习了Character Filters、Tokenizer、Token Filters,最后也学习了如何自定义自己的分词器。
此文章为2月Day8学习笔记,内容来源于极客时间《Elasticsearch 核心技术与实战》