1.聚合操作
2.高亮查询和过滤操作
3.mapping之.dynamic
4. es的mapping之ignore_above
一、聚合操作
聚合操作用到了 agg关键字
可以先用match关键字确定一个大范围 列如搜索男性的平均年龄,可以先设置match为gender;male在使用aggs进行关键词的聚合查询
1.列如查询男性的平均年龄
GET s1/_search
{
"query": {
"match":{
"gender": "male"
}
},
"aggs": {
"my_sum": {
"sum": {
"field": "age"
}
}
}
}
2.查询所有人年龄总和
GET s1/_search
{
"aggs":{
"my_sum":{
"sum": {
"field": "age"
}
}
}
}
3.查询年龄最大值
GET s1/_search
{
"aggs":{
"my_max":{
"max": {
"field": "age"
}
}
}
}
4.将年龄进行分组用到range字段函数
4.1对男性年龄进行分段 10-20 20-30 30-100
GET s1/_search
{
"query": {
"match": {
"gender": "male"
}
},
"aggs": {
"my_group":{
"range": {
"field": "age",
"ranges": [
{
"from": 10,
"to": 20
},
{
"from": 20,
"to": 30
},
{
"from": 30,
"to":100
}
]
}
}
}
}
4.2将年龄进行分组,并求每一个分组中年龄的最大值
GET s1/_search
{
"query": {
"match": {
"gender": "male"
}
},
"aggs": {
"my_group": {
"range": {
"field": "age",
"ranges": [
{
"from": 10,
"to": 20
},
{
"from": 20,
"to": 30
},
{
"from": 30,
"to": 100
}
]
},
"aggs": {
"age_max": {
"max": {
"field": "age"
}
}
}
}
}
}
二、高亮查询和过滤操作
Elasticsearch如果为搜索引擎服务的时候,会有一部分的网址被颜色渲染,因此需要通过命令来添加高亮操作
在命令中添加highlight关键字
1.最基础的高亮操作
GET s1/_search
{
"query": {
"match": {
"name": "LISI"
}
},
"highlight": {
"fields": {
"name": {}
}
}
结果会给指定的数据增加一个标签
2.为指定的数据增加属性 列如添加颜色和大小
GET s1/_search
{
"query": {
"match": {
"name": "LISI"
}
},
"highlight": {
"pre_tags": "<b style='color:red;fontsize:20px'>",
"post_tags": "</b>",
"fields": {
"name": {}
}
}
}
3.如果只是给指定的数据一部分添加颜色 则可以在Match关键词处只写要高亮的数据
GET s1/_search
{
"query": {
"match": {
"tags": "沉着"
}
},
"highlight": {
"pre_tags": "<b style='color:red;fontsize:20px'>",
"post_tags": "</b>",
"fields": {
"tags": {}
}
}
}
4.过滤操作
使用source关键字 ,列如查出的文档只想他要里面的个别字段就可以使用source关键字进行查询 查询多个字段可以加中括号
GET s1/_search
{
"query": {
"match": {
"name": "housi"
}
},
"_source": ["name","age"]
}
三、mapping之.dynamic
1.映射(mapping的基本概念)
映射mapping是用来定义一个文档及其包含的字段如何存储和索引的过程。列如我们可以使用映射来定义
哪些字符串应该被视为全文字段
哪些字段包含数字、日期或者地理位置
定义日期格式
自定义规则,用来控制动态添加字段的映射
2.字段的数据类型
简单类型 如文本(text),关键字(keyword),日期(date),整形(long)、双精度(double)、布尔(boolean)
可以是json类型的层次结构性质的类型,如对象和嵌套
特殊类型 如get_point get_shape completion(建议,提示)
大多数数据类型通过field参数支持多字段
3.映射约束
Index.mapping.total_fields.limit 索引的最大子段数目,字段和对象映射以及字段别名都计入此限制,默认值为1000
Index.mapping.depth.limit 字段最大深度,以内部对象的数量来衡量,列如如果所有字段都在根对象级别定义,则深度为1,如果有一个子对象映射,则深度为2默认为20
Index.mapping.nested_fields.limit索引中嵌套字段最大数量默认是50,索引1个包含100个嵌套字段的文档实际上索引101个文档,因为每个嵌套文档都被索引为单独的隐藏文档
4.查询一个文档的映射
GET s1/_mapping
5.创建一个映射关系并插入数据
直接查询一个索引的映射关系,然后创建一个索引将上一个索引的映射复制粘贴
PUT s2
{
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"gender" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"tags" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
PUT s2/_doc/1
{
"name":"guoailuo",
"age":24,
"gender":"famale"
}
6.设置字段类型之后当向索引中多添加一个之后,仍然会增加,不会受到限制
引出以下dynamic有三种状态
1.第一种dynamic=True 会在新增一个字段后建立映射关系,在查询时也可以当作主查询条件查询
PUT s3
{
"mappings": {
"dynamic":true,
"properties": {
"name":{
"type": "text"
}
}
}
}
7…当dynamic=false时可以插入一个新的字段但是不会自动为其创建映射,也不能作为主查询来查,只能作为伴随被查询
PUT s4
{
"mappings": {
"dynamic":false,
"properties": {
"name":{
"type": "text"
}
}
}
}
8.当dynamic为strict时 是严格映射模式,创建字段后不允许在插入数据时新增字段不然会报错
PUT s5
{
"mappings": {
"dynamic":"strict",
"properties": {
"name":{
"type": "text"
}
}
}
}
四、es的mapping之ignore_above
Ignore_above这个参数可以理解为设置的最大插入数据的字节数,如果超过这个最大值,则被不会被索引和查询当作主查询时 但是这个参数只对keyword字段有效
原因如下
text类型:会分词,先把对象进行分词处理,然后再再存入到es中。
当使用多个单词进行查询的时候,当然查不到已经分词过的内容!
keyword:不分词,没有把es中的对象进行分词处理,而是存入了整个对象!
这时候当然可以进行完整地查询!默认是256个字符!
##mapping-ignore_above设置的字段长度
PUT s6
{
"mappings": {
"properties": {
"title":{
"type": "keyword",
"ignore_above": 10
}
}
}
}
PUT s6/_doc/1
{
"title":"专业买手团队全球原产地直采,只为把新鲜送到您的身边"
}
GET s6/_search
{
"query": {
"match": {
"title": "专业买手团队全球原产地直采,只为把新鲜送到您的身边"
}
}
}