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
}

 

posted @ 2020-09-15 15:54  showMeTheCodes  阅读(205)  评论(0编辑  收藏  举报