zoukankan      html  css  js  c++  java
  • Mapping与聚合查询

    1、概念:mapping就是ES数据字段field的type元数据,ES在创建索引的时候,dynamic mapping会自动为不同的数据指定相应mapping,mapping中包含了字段的类型、搜索方式(exact value或者full text)、分词器等。

    2、查看mapping:GET /product/_mapping

    3、Dynamic mapping

      ① “Elasticsearch”:text/keyword

      ② 123456 => long     

      ③ 123.123 => double

      ④ true false => boolean

      ⑤ 2020-05-20 => date

      为啥price是long类型而不是integer?

      因为es的mapping_type是由JSON分析器检测数据类型,而Json没有隐式类型转(integer=>long or float=> double,所以dynamic mapping会选择一个比较宽的数据类型。

    4、搜索方式

      ① exact value 精确匹配:在倒排索引过程中,分词器会将field作为一个整体创建到索引中

      ② full text全文检索:分词、近义词同义词、混淆词、大小写、词性、过滤、时态转换等(normaliztion)

    5、ES数据类型

      ①数字类型:long, integer, short, byte, double, float, half_float, scaled_float

            在满足需求的情况下,尽可能选择范围小的数据类型

      ②字符串类型:keyword、text

            a.适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值exact value搜索到。Id应该用keyword

            b.当一个字段是要被全文搜索的,比如Email内容、产品描述这些字段应该使用text类型。

               设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项

               text类型的字段不用于排序,很少用于聚合

               解释字段数据会占用大量堆空间,尤其是在加载高基数text字段时。字段数据一旦加载到堆中,就在该段的生命周期内保持在那里。

                  同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问题。这就是默认情况下禁用字段数据的原因

    6、复杂类型:

      ①Object:用于单个JSON对象

      ②Nested:用于JSON对象数组

    7、创建mapping:

    PUT /product3
    {
      "mappings": {
        "properties": {
          "date": {
            "type": "text"
          },
          "desc": {
            "type": "text",
          },
          "name": {
            "type": "text",
          },
          "price": {
            "type": "long"
          },
          "tags": {
            "type": "text",
          },
          "parts": {
            "type": "object"
          },
          "partlist": {
            "type": "nested"
          }
        }
      }
    }

     8、Mapping parameters

      ①index:是否对创建对当前字段创建索引,默认true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在source元数据中展示

      ②analyzer:指定分析器(character filtertokenizerToken filters)。

      ③boost:对当前字段相关度的评分权重,默认1

      ④coerce:是否允许强制类型转换  true “1”=> 1   false “1”=< 1

      ⑤copy_to:

      "field": {

           "type": "text",

           "copy_to": "other_field_name"

      }

      ⑥doc_values:为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间不支持textannotated_text

    二、聚合查询

    1、 语法:

      aggs:{

        code...

      }

    GET /product/_search
    {
      "aggs": {
        "tag_agg_group": {
          "terms": {
            "field": "tags.keyword"
          }
        }
      },
      "size": 0
    }

    2、统计价格大于1999的数据

    GET /product/_search
    {
      "query": {
        "bool": {
          "filter": [
            {
              "range": {
                "price": {
                  "gt": 1999
                }
              }
            }
          ]
        }
      }, 
      "aggs": {
        "tag_agg_group": {
          "terms": {
            "field": "tags.keyword"
          }
        }
      },
      "size": 0
    }

    (4) “avg”:价格大于1999的每个tag产品的平均价格

    GET /product/_search
    {
      "aggs": {
        "avg": {
          "terms": {
            "field": "tags.keyword",
            "order": {
              "avg_price": "desc"
            }
          },
          "aggs": {
            "avg_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      },
      "size": 0
    }

    (5) 分组聚合

    按照千元机:1000以下  中端机:2000-3000 高端机:3000以上分组聚合,分别计算数量

    GET /product/_search
    {
      "aggs": {
        "tag_agg_group": {
          "range": {
            "field": "price",
            "ranges": [
              {
                "from": 100,
                "to": 1000
              },
              {
                "from": 1000,
                "to": 2000
              },
              {
                "from": 3000
              }
            ]
          },
          "aggs": {
            "price_agg": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      },
      "size": 0
    }
  • 相关阅读:
    Android数据存储之IO
    UVA
    【源代码剖析】tornado-memcached-sessions —— Tornado session 支持的实现(二)
    杀毒与免杀技术具体解释之二:特征码定位-工具及原理
    C++ 訪问控制权限图解
    新辰:传统行业进军互联网 怎样颠覆网络获得新生?
    【二】注入框架RoboGuice使用:(Your First View Injection)
    POJ 1741 Tree 树形DP(分治)
    技术单词
    活动合集 | 2017微软技术暨生态大会 英雄讲师召集令
  • 原文地址:https://www.cnblogs.com/lyc-code/p/13672291.html
Copyright © 2011-2022 走看看