Elasticsearch03-Mapping和聚合

Mapping

概念
mapping就是ES数据字段field的type元数据,ES在创建索引的时候,dynamic mapping会自动为不同的数据指定相应mapping,mapping中包含了字段的类型、搜索方式(exact value或者full text)、分词器等
查看mapping
GET /product/_mapping
Dynamic mapping<动态mappring>
   插入的数据         动态生成的类型
①“Elasticsearch”=> text/keyword        
②123456            =>    long            ?为什么不是integer
③123.123        =>    doubletrue false        =>    boolean2020-05-20        =>    date

为什么price是long类型而不是integer?因为es的mapping_type是由JSON分析器检测数据类型,而Json没有隐式类型转换(integer=>long or float=> double),所以dynamic mapping会选择一个比较宽的数据类型。
搜索方式
1. exact value 精确匹配:在倒排索引过程中,分词器会将field作为一个整体创建到索引中。keyword
2. full text   全文检索:分词、近义词同义词、混淆词、大小写、词性、过滤、时态转换等
ES数据类型
1.数字类型:
        a. long, integer, shortbytedoublefloat, half_float, scaled_float
        b. 在满足需求的情况下,尽可能选择范围小的数据类型。
        
2.字符串 :keyword、text
        a.keyword:适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值(exact value)搜索到。Id应该用keyword
        b.当一个字段是要被全文搜索的,比如Email内容、产品描述,这些字段应该使用text类型。text不会被倒排索引,会被分词。
        c.在同一字段中同时具有全文本(text)和关键字(keyword)版本会很有用:一个用于全文本搜索,另一个用于聚合和排序。
        
3.时间类型:
        a.date
        b.exact value精确匹配
        
4.布尔类型 : boolean
5.二进制  : binary
6.range  : integer_range、float_range、long_range、double_range、date_range
7.复杂类型 :
        a.Object:用于单个JSON对象
        b.Nested:用于JSON对象数组
8.地理位置:
        a.Geo-point:纬度/经度积分
        b.Geo-shape:用于多边形等复杂形状
9.特有类型:
        a.IP地址:ip 用于IPv4和IPv6地址
        b. Alias: 为现有字段定义别名
10.数组类型:
        a.数组中的所有值都必须具有相同的数据类型
手工创建mapping
PUT /product3     #这是第一次创建,和创建索引一样
{
  "mappings": {
    "properties": {
      "parameter_value2":{ #自己起的字段名称
        "type": "text" #字段类型<ES数据类型>
      }
    }
  }
}

#创建索引
PUT /product3
向mapping中添加字段
PUT /product3/_mapping
{
  "properties":{
    "parameter_value2":{
      "type": "text"
    }
  }
}
查询所有mapping
GET /product3/_mapping
Mapping parameters
1.index 是否对创建对当前字段创建索引,默认true,如果不创建索引,该字段不会通过索引被搜索到
2.analyzer:指定分析器(character filter、tokenizer、Token filters)
3.boost:对当前字段相关度的评分权重,默认1
4.coerce:是否允许强制类型转换  true false 插入数据不能转换了
5.copy_to: 
        a.别的字段查询的内容可以在该字段查询
        b."field": {"type": "text","copy_to": "other_field_name"}
        
6.doc_values:为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间(不支持text和annotated_text)
7.dynamic:控制是否可以动态添加新字段 true false
8.eager_global_ordinals:用于聚合的字段上,优化聚合性能。
        a.Frozen indices(冻结索引) 聚合使用少的时候配置,使数据不保存在内存中,防止占用内存
        
9.enable:是否创建倒排索引,可以对字段操作,也可以对索引操作。谨慎使用,该状态无法修改。
10.fielddata:默认关闭,正排索引做聚合索引的时候开启,开始数据保存在JVM内存中
11.fields:给field创建多字段,用于不同目的(全文检索或者聚合分析排序)
12.format:格式化
    "date": {
      "type":   "date",
      "format": "yyyy-MM-dd"
     }
13.ignore_above:超过长度将被忽略
14.ignore_malformed:忽略类型错误 错误类型可以正常插入
15.null_value:为null值设置默认值
16.search_analyzer:设置单独的查询时分析器
聚合
#每个tag产品的数量   "size":0, 不显示原始结果
GET /product/_search
{
  "aggs": {
    "tag_agg_group": { #自己起的名字
      "terms": {
        "field": "tags.keyword"
      }
    }
  },
  "size":0
}

#将字段tags第一次查询出来的数据放进内存中
PUT /product/_mapping
{
  "properties": {
    "tags": {
      "type": "text",
      "fielddata": true #将字段tags第一次查询出来的数据放进内存中
    }
  }
}

#价格大于1999的每个tag产品的数量
GET /product/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {"price": {"gt": 1999}}
        }
      ]
    }
  }, # 价格大于1999
  "aggs": {
    "tag_agg_group": {
      "terms": {
        "field": "tags.keyword"
      }
    }
  }, #对字段tags进行分组
  "size": 0 # "size":0, 不显示原始结果
}


结果:
      "buckets" : [
        {
          "key" : "fashao",
          "doc_count" : 2
        },
        {
          "key" : "xingjiabi",
          "doc_count" : 2
        },
        {
          "key" : "gongjiaoka",
          "doc_count" : 1
        },
        {
          "key" : "menjinka",
          "doc_count" : 1
        }
      ]
      


#平均价格
GET /product/_search
{
  "aggs": {
    "tag_agg_avg": {
      "terms": {
        "field": "tags.keyword",
        "order": {
          "avg_price": "desc"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  },
  "size":0
}



#按照千元机 1000以下  中端机[2000-3000) 高端机 [3000,∞)
GET /product/_search
{
  "aggs": {
    "tag_agg_group": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 100,
            "to": 1000
          },
          {
            "from": 1000,
            "to": 3000
          },
          {
            "from": 3000
          }
        ]
      },
      "aggs": {
        "price_agg": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  },
  "size": 0
}
原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/15231922.html