elasticsearch - Request Body Search、Mapping

概述

这是关于elasticsearch学习的第4篇博客,本篇带大家了解一下Request Body Search 、Mapping 和 Template 的基本使用。

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 支持对多个字段的操作并提供一个结果矩阵
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stark张宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值