概述
这是关于elasticsearch学习的第4篇博客,本篇带大家了解一下Request Body Search 、Mapping 和 Template 的基本使用。
- elasticsearch - 索引、文档和RESTApi
- elasticsearch - 节点、集群分片及副本、CRUD
- elasticsearch - Request Body Search、Mapping
Request Body Search
将查询语句通过Http Request Body 发送给ElasticSearch。
Query DSL
1.查询所有的内容
//#ignore_unavailable=true,可以忽略尝试访问不存在的索引“404_idx”导致的报错
POST /indexName,404_idx/_search?ignore_unavailable=true
{
"profile": true,
"query": {
"match_all": {}
}
}
2.from size 进行分页,下面的demo中从0开始,默认返回10个结果,获取靠后的翻页成本较高。
POST /kibana_sample_data_ecommerce/_search
{
"from":10,
"size":20,
"query":{
"match_all": {}
}
}
3.sort进行排序,最好在数字型与日期型的字段上排序,因为对于多值类型或分析过的字段排序,系统会选一个值,无法得知该值。
#对日期排序
POST kibana_sample_data_ecommerce/_search
{
"sort":[{"order_date":"desc"}],
"from":10,
"size":20,
"query":{
"match_all": {}
}
}
4._source 如果 _source 没有存储,那就只返回匹配的文档的元数据,_source 支持使用通配符 _source["name.*,"desc*]
POST kibana_sample_data_ecommerce/_search
{
"_source":["order_date"],
"query":{
"match_all": {}
}
}
5.使用查询表达式 Match
POST indexName/_search
{
"query": {
"match": {
"title": "last christmas"
}
}
}
//operator 设置AND 表示两个词都需要出现
POST indexName/_search
{
"query": {
"match": {
"title": {
"query": "last christmas",
"operator": "and"
}
}
}
}
Mapping
- Mapping类似于数据库中的schema的定义,作用如下:
- 定义索引中的字段名称
- 定义字段的数据类型,例如字符串,数字,布尔
- 字段,倒排索引的相关配置
- Mapping会把Json文档映射成Lucene所需要的扁平格式
- 一个Mapping属于一个索引的Type
- 每个文档都属于一个Type
- 一个Type有一个Mapping定义
- 7.0开始,不需要在Mapping定义中指定Type信息
Mapping字段的数据类型
- 简单类型
- Text / Keyword
- Date
- Integer / Floating
- Boolean
- IPv4 & IPv6
- 复杂类型 - 对象和嵌套对象
- 对象/嵌套对象
- 特殊类型
- geo_point & geo_shape /percolator
Dynamic Mapping
- 在写入文档时候,所有索引不存在,会自动创建索引
- Dynamic Mapping的机制,使得我们无需手动定义Mappings。Es会根据文档信息,推算出字段的类型。
- 但是有时候会推算的不对,例如地理位置信息
- 当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询
查看Mapping文件:
GET indexName/_mapping
能否更改Mapping的字段类型
- 两种情况
- 新增加字段
- Dynamic设为true时,一旦有新增字段的文档写入,Mapping也同时被更新
- Dynamic设为false时,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在 _source 中
- Dynamic 设置成 Strict,文档写入失败
- 对已有字段,一旦已经有数据写入,就不再支持修改字段的定义
- Lucene实现的倒排索引,一旦生成后,就不允许修改
- 如果希望改变字段类型,必须Reindex Api ,重建索引
- 新增加字段
- 原因
- 如果修改了字段的数据类型,会导致已被索引的属于无法被搜索
- 但是如果是新加的字段,就不会有这样的影响
控制 Dynamic Mapping
- 当Dynamic Mapping 被设置成false的时候,存在新增字段的数据写入,该数据可以被索引,但是新增字段被丢弃
- 当设置成strict模式时候,数据写入直接出错
PUT indexName
{
"mapping":{
"_doc":{
"dynamic":"false"
}
}
}
显示Mapping设置与常见参数介绍
1.显示定义一个Mapping
PUT indexName
{
"mappings":{
//这里是定义Mapping的具体字段名称和类型
}
}
自定义Mapping的一些建议:
- 可以参考Api手册,纯手写
- 为了减少输入的工作量,减少出错概率,可以依照以下步骤
- 创建一个临时的index,写入一些样本数据
- 通过访问Mapping Api 获得该临时文件的动态Mapping定义
- 修改后用,使用该配置创建你的索引
- 删除临时索引
1.控制当前字段是否被索引。默认为true,如果设置成false,改字段不可被搜索
2.需要对null值的搜索,只有Keyword类型支持设定Null_Value
PUT IndexName
{
"mappings":{
"dynamic" : "false",
"properties" : {
"apiVersion" : {
"type" : "integer"
},
"uuid" : {
"type" : "keyword",
"index":"false"
},
"mobile" : {
"type" : "keyword",
"null_value":"NULL"
}
}
}
}
mapping 数组类型
Es中不提供专门的数组类型。但是任何字段,都可以包含多个相同类型的数值。
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
index Template / Dynamic Template
- index Template :帮助你设定Mappings 和 Settings,并按照一定的规则自动匹配到新创建的索引之上
- 模板仅在一个索引被新创建时,才会产生作用。修改模板不会影响已创建的索引。
- 你可以设定多个索引模板,这些设置会被"merge"在一起
- 你可以指定"order"的数值,控制"merging"的过程
index Template 的工作方式
- 当一个索引被新创建时
- 应用Es默认的settings 和 mappings
- 应用order数值低的 index Template 中的设定
- 应用order高的 Index Template中的设定,之前的设定会被覆盖
- 应用创建索引时,用户所有的settings 和 mappings ,并覆盖之前模板中的设定
Dynamic Template
- Dynamic Template :根据Es识别的数据类型,结合字段名称,来动态设定字段类型
- 所有的字符串类型都设定成Keyword,或者关闭keyword字段
- is开头的字段都设置成boolean
- long_开头的设置成long类型
ElasticSearch 聚合分析简介
- Es除搜索以外,提供的针对Es数据进行统计分析的功能
- 通过聚合,我们会得到一个数据的概览,是分析和总结全套的数据,而不是寻找单个文档
- 高性能,只需要一条语句,就可以从Es得到分析结果
集合的分类
- Bucket 一些列满足特定条件的文档的集合
- Metric 一些数学运算,可以对文档字段进行统计分析
- Pipeline 对其他的聚合结果进行二次聚合
- Matrix 支持对多个字段的操作并提供一个结果矩阵