Elasticsearch 学习笔记Day 07

82 阅读4分钟

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


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

  • 起始标记->Elasticsearch入门(15讲):「17 | 基本概念:Query String&Simple Query String查询」
  • 结尾标记->Elasticsearch入门(15讲):「18 | 基本概念:Dynamic Mapping和常见字段类型」

Query String&Simple Query String查询

Query String Query

  • 类似URI Query

image.png

Simple Query String Query

  • 类似QueryString,但是会忽略错误的语法,同时,只支持部分查询语法
  • 不支持AND OR NOT,会当作字符串处理
  • Term之间默认的关系是OR,可以指定Operator
  • 支持部分逻辑
      • 替代AND
    • | 替代OR.
      • 替代NOT

image.png

CodeDemo

PUT /users/_doc/1 { "name":"Ruan Yiming", "about":"java, golang, node, swift, elasticsearch" }

PUT /users/_doc/2 { "name":"Li Yiming", "about":"Hadoop" }

POST users/_search { "query": { "query_string": { "default_field": "name", "query": "Ruan AND Yiming" } } }

POST users/_search { "query": { "query_string": { "fields":["name","about"], "query": "(Ruan AND Yiming) OR (Java AND Elasticsearch)" } } }

#Simple Query 默认的operator是 Or POST users/_search { "query": { "simple_query_string": { "query": "Ruan AND Yiming", "fields": ["name"] } } }

POST users/_search { "query": { "simple_query_string": { "query": "Ruan Yiming", "fields": ["name"], "default_operator": "AND" } } }

GET /movies/_search { "profile": true, "query":{ "query_string":{ "default_field": "title", "query": "Beafiful AND Mind" } } }

多fields

GET /movies/_search { "profile": true, "query":{ "query_string":{ "fields":[ "title", "year" ], "query": "2012" } } }

GET /movies/_search { "profile":true, "query":{ "simple_query_string":{ "query":"Beautiful +mind", "fields":["title"] } } }

Dynamic Mapping和常见字段类型

Mapping中的字段一旦设定后,禁止直接修改。因为倒排索引生成后不允许直接修改。需要重新建立新的索引,做reindex操作。 类似数据库中的表结构定义,主要作用

  • 定义所以下的字段名字
  • 定义字段的类型
  • 定义倒排索引相关的配置(是否被索引?采用的Analyzer)

对新增字段的处理 true false strict 在object下,支持做dynamic的属性的定义

什么是Mapping

  • Mapping 类似数据库中的schema的定义,作用如下
    • 定义索引中的字段的名称
    • 定义字段的数据类型,例如字符串,数字,布尔....
    • 字段, 倒排索引的相关配置,(Analyzed or Not Analyzed, Analyzer)
  • Mapping 会把JSON文档映射成Lucene所需要的扁平格式
  • 一个 Mapping属于一个索引的Type
    • 每个文档都属于-个Type
    • 一个Type有一个Mapping定义
    • 7.0 开始,不需要在Mapping定义中指定type信息

字段的数据类型

  • 简单类型
    • Text / Keyword
    • Date
    • Integer / Floating
    • Boolean
    • IPv4&IPv6
  • 复杂类型 -对象和嵌套对象
    • 对象类型 /嵌套类型
  • 特殊类型
    • geo_ point & geo_ shape / percolator

什么是Dynamic Mapping

  • 在写入文档时候,如果索引不存在,会自动创建索引
  • Dynamic Mapping的机制,使得我们无需手动定义Mappings。Elasticsearch会自动根据文档信息,推算出字段的类型
  • 但是有时候会推算的不对,例如地理位置信息
  • 当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询

image.png

类型的自动识别

image.png

Demo

image.png image.png image.png image.png dynamic mapping,推断字段的类型 image.png image.png image.png image.png

能否更改Mapping的字段类型

  • 两种情况
    • 新增加字段
      • Dynamic 设为true时,一旦有新增字段的文档写入,Mapping 也同时被更新
      • Dynamic设为false, Mapping 不会被更新,新增字段的数据无法被索引,但是信息会出现在_ source中
      • Dynamic 设置成Strict,文档写入失败
    • 对已有字段,一旦已经有数据写入,就不再支持修改字段定义
      • Lucene实现的倒排索引,一旦生成后,就不允许修改
    • 如果希望改变字段类型,必须Reindex API, 重建索引
  • 原因
    • 如果修改了字段的数据类型,会导致已被索引的属于无法被搜索
    • 但是如果是增加新的字段,就不会有这样的影响

控制 Dynamic Mappings

  • 当dynamic被设置成false时候,存在新增字段的数据写入,该数据可以被索引,但是新增字段被丢弃
  • 当设置成Strict 模式时候,数据写入直接出错

image.png image.png

Demo

#默认Mapping支持dynamic,写入的文档中加入新的字段

image.png image.png

#该字段可以被搜索,数据也在_source中出现

image.png image.png

#修改为dynamic false

image.png image.png

#新增 anotherField

image.png image.png

#该字段不可以被搜索,因为dynamic已经被设置为false

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

#修改为strict

image.png image.png

#写入数据出错,HTTP Code 400

image.png image.png

CodeDemo

#写入文档,查看 Mapping PUT mapping_test/_doc/1 { "firstName":"Chan", "lastName": "Jackie", "loginDate":"2018-07-24T10:29:48.103Z" }

#查看 Mapping文件 GET mapping_test/_mapping

#Delete index DELETE mapping_test

#dynamic mapping,推断字段的类型 PUT mapping_test/_doc/1 { "uid" : "123", "isVip" : false, "isAdmin": "true", "age":19, "heigh":180 }

#查看 Dynamic GET mapping_test/_mapping

#默认Mapping支持dynamic,写入的文档中加入新的字段 PUT dynamic_mapping_test/_doc/1 { "newField":"someValue" }

#该字段可以被搜索,数据也在_source中出现 POST dynamic_mapping_test/_search { "query":{ "match":{ "newField":"someValue" } } }

#修改为dynamic false PUT dynamic_mapping_test/_mapping { "dynamic": false }

#新增 anotherField PUT dynamic_mapping_test/_doc/10 { "anotherField":"someValue" }

#该字段不可以被搜索,因为dynamic已经被设置为false POST dynamic_mapping_test/_search { "query":{ "match":{ "anotherField":"someValue" } } }

get dynamic_mapping_test/_doc/10

#修改为strict PUT dynamic_mapping_test/_mapping { "dynamic": "strict" }

#写入数据出错,HTTP Code 400 PUT dynamic_mapping_test/_doc/12 { "lastField":"value" }

DELETE dynamic_mapping_test

相关阅读

总结


学习了Mapping和Dynamic Mapping,学习了ES当中它是如何对字段的类型做一个推断的,也了解在ES中怎样去设置Mapping 中的 Dynamic Mapping 值去控制这个Dynamic Mapping 的行为。

此文章为2月Day7学习笔记,内容来源于极客时间《Elasticsearch 核心技术与实战》