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
Simple Query String Query
- 类似QueryString,但是会忽略错误的语法,同时,只支持部分查询语法
- 不支持AND OR NOT,会当作字符串处理
- Term之间默认的关系是OR,可以指定Operator
- 支持部分逻辑
-
- 替代AND
- | 替代OR.
-
- 替代NOT
-
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查询
类型的自动识别
Demo
dynamic mapping,推断字段的类型
能否更改Mapping的字段类型
- 两种情况
- 新增加字段
- Dynamic 设为true时,一旦有新增字段的文档写入,Mapping 也同时被更新
- Dynamic设为false, Mapping 不会被更新,新增字段的数据无法被索引,但是信息会出现在_ source中
- Dynamic 设置成Strict,文档写入失败
- 对已有字段,一旦已经有数据写入,就不再支持修改字段定义
- Lucene实现的倒排索引,一旦生成后,就不允许修改
- 如果希望改变字段类型,必须Reindex API, 重建索引
- 新增加字段
- 原因
- 如果修改了字段的数据类型,会导致已被索引的属于无法被搜索
- 但是如果是增加新的字段,就不会有这样的影响
控制 Dynamic Mappings
- 当dynamic被设置成false时候,存在新增字段的数据写入,该数据可以被索引,但是新增字段被丢弃
- 当设置成Strict 模式时候,数据写入直接出错
Demo
#默认Mapping支持dynamic,写入的文档中加入新的字段
#该字段可以被搜索,数据也在_source中出现
#修改为dynamic false
#新增 anotherField
#该字段不可以被搜索,因为dynamic已经被设置为false
#修改为strict
#写入数据出错,HTTP Code 400
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 核心技术与实战》