Elasticsearch 学习笔记Day 08

118 阅读4分钟

hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!


开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情

  • 起始标记->Elasticsearch入门(15讲):「19 | 基本概念:显式Mapping设置与常见参数介绍」
  • 结尾标记->Elasticsearch入门(15讲):「20 | 基本概念:多字段特性及Mapping中配置自定义Analyzer」

显式Mapping设置与常见参数介绍

如何显式定义一个 Mapping

image.png

自定义Mapping的一些建议

  • 可以参考API手册,纯手写
  • 为了减少输入的工作量,减少出错概率,可以依照以下步骤
    • 创建一个临时的index ,写入一些样本数据
    • 通过访问Mapping API获得该临时文件的动态Mapping定义
    • 修改后用,使用该配置创建你的索引
    • 删除临时索引

控制当前字段是否被索引

  • Index -控制当前字段是否被索引。默认为true。如果设置成false, 该字段不可被搜索

image.png

Demo

image.png image.png 加入一个新的文档 image.png image.png 查询 image.png 查询失败 image.png

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
  • 记录内容越多,占用存储空间越大

image.png

null_value

  • 需要对Null值实现搜索
  • 只有Keyword 类型支持设定Null_Value

image.png

Demo

image.png 新增一个文档 image.png image.png 查询 image.png 可以查到 image.png

Copy_to

  • _all在7中被copy_to所替代
  • 满足一些特定的搜索需求
  • copy_ to将字段的数值拷贝到目标字段,实现类似 _all的作用
  • copy_ to的目标字段不出现在 _source 中

image.png

数组类型

  • Elasticsearch中不提供专门的数组类型。但是任何字段,都可以包含多个相同类类型的数值

image.png

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中配置自定义Analyzer

多字段类型

  • 多字段特性
    • 厂商名字实现精确匹配
      • 增加一个 keyword 字段
    • 使用不同的analyzer
      • 不同语言
      • pinyin 字段的搜索
      • 还支持为搜索和索引指定不同的 analyzer

image.png

Exact Values v.s Full Text

  • Exact Values v.s Full Text
    • Exact Value: 包括数字 / 日期 / 具体的一个字符串 (例如“Apple Store”)
      • Elasticsearch 中的keyword
    • 全文本,非结构化的文本数据
      • Elasticsearch 中的 text

image.png

Exact Values不需要被分词

  • Elasticsearch 为每一个字 段创建一个倒排索引
    • Exact Value在索引时,不需要做特殊的分词处理

image.png

自定义分词

  • 当 Elasticsearch自带的分词器无法满足时,可以自定义分词器。通过自组合不同的组件实现
    • Character Filter
    • Tokenizer
    • Token Filter

Character Filters

  • 在Tokenizer之前对文本进行处理,例如增加删除及替换字符。可以配置多个Character Filters。 会影响Tokenizer的position 和offset 信息
  • 一些自带的Character Filters
    • HTML strip - 去除html标签
    • Mapping - 字符串 替换
    • Pattern replace - 正则匹配替换

Demo

image.png image.png image.png image.png image.png image.png image.png image.png

Tokenizer

  • 将原始的文本按照一定的规则,切分为词(term or token)
  • Elasticsearch 内置的Tokenizers
    • whitespace / standard / uax_ ur_email / pattern / keyword / path hierarchy
  • 可以用 Java开发插件,实现自己的Tokenizer

Demo

image.png image.png

Token Filters

  • 将Tokenizer输出的单词( term ),进行增加,修改,删除
  • 自带的Token Filters
    • Lowercase /stop / synonym (添加近义词)

Demo

image.png image.png image.png image.png

设置一个 Custom Analyzer

image.png

Demo

image.pngimage.pngimage.png

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 核心技术与实战》