zoukankan      html  css  js  c++  java
  • 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
    }
  • 相关阅读:
    Maven使用教程
    [转载]DIV CSS设计时IE6、IE7、FF 与兼容性有关的特性
    ASP.NET MVC 开篇
    基于WebForm+EasyUI的业务管理系统形成之旅 -- ParamQueryGrid行、列合并(Ⅸ)
    基于WebForm+EasyUI的业务管理系统形成之旅 -- 施工计划查询(Ⅷ)
    浅析WCF与WebService、WPF与Silverlight 区别
    LeetCode-3Sum Smaller
    LeetCode-Different Ways to Add Parentheses
    LeetCode-Count Univalue Subtrees
    LeetCode-Decode String
  • 原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/15231922.html
Copyright © 2011-2022 走看看