zoukankan      html  css  js  c++  java
  • ES的文档映射

    文档映射

    把ElasticSearch的核心概念和关系数据库做了一个对比,索引(index)相当于数据库,类型(type)相当于数据表,映射(Mapping)相当于数据表的表结构。ElasticSearch中的映射(Mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器及属性等等。
    文档映射就是给文档中的字段指定字段类型、分词器。

    在Elasticsearch7以后会将type移除,自动映射,自动识别。
    映射的查询:

    ## 查询映射
    GET /laoyeye/_mapping
    
    {
      "laoyeye" : {
        "mappings" : {
          "user" : {
            "properties" : {
              "adress" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              },
              "age" : {
                "type" : "long"
              },
              "name" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              },
              "sex" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              }
            }
          }
        }
      }
    }
    
    

    可以发现int类型在es里面自动映射成了long类型。String映射成了text类型。

    映射的分类

    动态映射

    我们知道,在关系数据库中,需要事先创建数据库,然后在该数据库实例下创建数据表,然后才能在该数据表中插入数据。而ElasticSearch中不需要事先定义映射(Mapping),文档写入ElasticSearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。

    静态映射

    在ElasticSearch中也可以事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射。

    ES类型的支持

    基本类型

    字符串:string,string类型包含 text 和 keyword。
    
    text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引;允许es来检索这些词,text类型不能用来排序和聚合。
    keyword:该类型不需要进行分词,可以被用来检索过滤、排序和聚合,keyword类型自读那只能用本身来进行检索(不可用text分词后的模糊检索)。
    注意: keyword类型不能分词,Text类型可以分词查询
    数指型:long、integer、short、byte、double、float
    日期型:date
    布尔型:boolean
    二进制型:binary
    数组类型(Array datatype)
    

    复杂类型

    地理位置类型(Geo datatypes)
    地理坐标类型(Geo-point datatype):geo_point 用于经纬度坐标
    地理形状类型(Geo-Shape datatype):geo_shape 用于类似于多边形的复杂形状
    

    特定类型(Specialised datatypes)

    Pv4 类型(IPv4 datatype):ip 用于IPv4 地址
    Completion 类型(Completion datatype):completion 提供自动补全建议
    Token count 类型(Token count datatype):token_count 用于统计做子标记的字段的index数目,该值会一直增加,不会因为过滤条件而减少
    mapper-murmur3 类型:通过插件,可以通过_murmur3_来计算index的哈希值
    附加类型(Attachment datatype):采用mapper-attachments插件,可支持_attachments_索引,例如 Microsoft office 格式,Open Documnet 格式, ePub,HTML等
    

    创建文档指定类型

    还是以开头的案例为例:
    首先创建文档:

    ###创建文档 /索引名称/类型/id
    PUT /laoyeye/user/1
    {
      "name":"小卖铺的老爷爷",
      "sex":"男",
      "adress":"商户",
      "age":18
    }
    

    动态映射类型为:
    GET /laoyeye/_mapping

    {
      "laoyeye" : {
        "mappings" : {
          "user" : {
            "properties" : {
              "adress" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              },
              "age" : {
                "type" : "long"
              },
              "name" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              },
              "sex" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              }
            }
          }
        }
      }
    }
    

    这时候我有个需求,需要根据name字段做精确匹配,按照正常的逻辑,我们会写出下面的查询

    GET /laoyeye/user/_search
    {
      "query": {
        "term": {
          "name": "小卖铺的老爷爷"
        }
      }
    }
    

    然后结果并没有达到预期,没有查询的结果。
    因为name为text类型,做了分词,分词后没有这个关键词了,所以无法查询,这时候我们就需要修改映射的类型,将name修改为keyword

    注意:如果已经有数据,不能直接做映射,先删除掉,在添加映射,再添加数据
    

    如果数据已经存在,需要删除索引,在指定类型

    # 删除索引
    DELETE /laoyeye
    # 指定类型
    PUT /laoyeye
    {
      "mappings": {
        "user": {
          "properties": {
            "adress": {
              "type": "text",
              "analyzer": "ik_smart"
            },
             "age" : {
                "type" : "long"
              },
        "name" : {
                "type" : "keyword"
              }
          }
        }
      }
    }
    
  • 相关阅读:
    删除某个目录下面指定名字的文件夹的命令
    ubuntu 12.04 下面安装vmware workstation 8.0.4
    最近一段时间总结
    ejb 学习笔记HelloWorld入门实例
    状态会话bean的session周期与Web上的session周期
    ubuntu做路由器
    Heron and His Triangle 递推 高精度 打表 HDU6222
    洛谷训练赛 A.Misaka Network
    HZNU Training 1 for Zhejiang Provincial Competition 2020 Xeon第三场训练赛
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/laoyeye/p/13289153.html
Copyright © 2011-2022 走看看