首页 > 其他分享 >Elasticsearch之映射

Elasticsearch之映射

时间:2023-04-13 14:33:25浏览次数:35  
标签:name 映射 dynamic 字段 Elasticsearch PUT geo

1.1 地理坐标点数据类型

1.1.1 地理坐标点

地理坐标点是指地球表面可以用经纬度描述的一个点。 地理坐标点可以用来计算两个坐标间的距离,还可以判断一个坐标是否在一个区域中。地理坐标点需要显式声明对应字段类型为 geo_point :

1.1.2 经纬度坐标格式

如上例, location 字段被声明为 geo_point 后,我们就可以索引包含了经纬度信息的文档了。 经纬度信息的形式可以是字符串、数组或者对象

 #  增加地址坐标点

 GET  /company-locations/_mapping    //查看映射关系

增加经纬度

 # 字符串形式

PUT /company-locations/_doc/1

             {      "name":"NetEase",

 "location":"40.715,74.011"   }

# 对象形式

PUT /company-locations/_doc/2

{          "name":"Sina",

"location":{

"lat":40.722,

"lon":73.989  }}

# 数组形式

PUT /company-locations/_doc/3

{   "name":"Baidu",

"location":[73.983,40.719]  }

注意

字符串形式以半角逗号分割,如 "lat,lon"

对象形式显式命名为 lat 和 lon

数组形式表示为 [lon,lat]

通过地理坐标点过滤 有四种地理坐标点相关的过滤器 可以用来选中或者排除文档

过滤器

作用

geo_bounding_box

找出落在指定矩形框中的点

geo_distance

找出与指定位置在给定距离内的点

geo_distance_range

找出与指定点距离在给定最小距离和最大距离之间的点

geo_polygon

找出落在多边形中的点。 这个过滤器使用代价很大 。当你觉得自己需要使用它,最好先看看 geo-shapes

 

1.1.3 geo_bounding_box查询

这是目前为止最有效的地理坐标过滤器了,因为它计算起来非常简单。 你指定一个矩形的顶部 ,底部 , 左边界和右边界,然后过滤器只需判断坐标的经度是否在左右边界之间,纬度是否在上下边界之间

location这些坐标也可以用 bottom_left 和 top_right 来表示

1.1.4 geo_distance

过滤仅包含与地理位置相距特定距离内的匹配的文档。假设以下映射和索引文档然后可以使用 geo_distance 过滤器执行以下查询

GET /company-locations/_search

{      "query": {

    "bool": {

"must": {

"match_all": {}  },

"filter": {

"geo_distance": {

"distance": "200km",

"location": {

"lat": 40,

"lon": 70

} } } } } }

1.2 动态映射

Elasticsearch在遇到文档中以前未遇到的字段,可以使用dynamic mapping(动态映射机制)来确定字段的数据类型并自动把新的字段添加到类型映射。

Elastic的动态映射机制可以进行开关控制,通过设置mappings的dynamic属性,dynamic有如下设置项

true:遇到陌生字段就执行dynamic mapping处理机制

false:遇到陌生字段就忽略

strict:遇到陌生字段就报错

PUT /user

{   "settings": {

"number_of_shards": 3,   "number_of_replicas": 0   },

"mappings": {    "dynamic": "strict",    "properties": {

"name": {    "type": "text"   },

"address": {    "type": "object",  "dynamic": true  } } }    }

# 插入以下文档,将会报错

# user索引层设置dynamic是strict,在user层内设置age将报错

# 在address层设置dynamic是ture,将动态映射生成字段

PUT /user/_doc/1

    {    "name": "lisi", "age": "20",  "address": {

                                      "province": "beijing",

                                      "city": "beijing"     }   }

PUT /user

{    "settings": {

            "number_of_shards": 3, "number_of_replicas": 0    },

"mappings": {   "dynamic": true,

           "properties": {

           "name": {

      "type": "text"  },

           "address": {

      "type": "object",

      "dynamic": true   }  } }    }

1.3 自定义动态映射

如果你想在运动时增加新的字段,你可能会启用动态映射,然而有时候动态映射规则可能不太智能,幸运的是,我们可以通过设置去自定义这些规则,以便更好的适用于你的数据

当 Elasticsearch 遇到一个新的字符串字段时,它会检测这个字段是否包含一个可识别的日期,比如 2014-01-01 如果它像日期,这个字段就会被作为 date 类型添加。否则,它会被作为 string 类型添加。 有些时候这个行为可能导致一些问题。想象下,你有如下这样的一个文档:

{ "note": "2014-01-01" }

假设这是第一次识别 note 字段,它会被添加为 date 字段。但是如果下一个文档像这样:

{ "note": "Logged out" }

这显然不是一个日期,但为时已晚。这个字段已经是一个日期类型,这个 不合法的日期 将会造成一个 异常。

日期检测可以通过在根对象上设置 date_detection 为 false 来关闭

 PUT /my_index/_doc/1

{ "note": "2014-01-01" }

 PUT /my_index/_doc/1

{ "note": "Logged out" }

PUT /my_index

{     "mappings": {

"date_detection": false  }  }

使用这个映射,字符串将始终作为 string 类型。如果需要一个 date 字段,必须手动添加。

Elasticsearch 判断字符串为日期的规则可以通过 dynamic_date_formats setting 来设置。

1.3.1 dynamic_templates(控制新生成字段的映射)

使用 dynamic_templates 可以完全控制新生成字段的映射,甚至可以通过字段名称或数据类型来应用不同的映射。每个模板都有一个名称,你可以用来描述这个模板的用途,一个 mapping 来指定映射应该怎样使用,以及至少一个参数 (如 match) 来定义这个模板适用于哪个字段。

模板按照顺序来检测;第一个匹配的模板会被启用。例如,我们给 string 类型字段定义两个模板:

es :以 _es 结尾的字段名需要使用 spanish 分词器。

en :所有其他字段使用 english 分词器。

我们将 es 模板放在第一位,因为它比匹配所有字符串字段的 en 模板更特殊:

PUT / my_index2

{    "mappings": {

"dynamic_templates": [{

"es": {

"match": "*_es",

"match_mapping_type": "string",

"mapping": {

"type": "text",

"analyzer": "spanish"

} }   },  {   

 "en": {

"match": "*",

"match_mapping_type": "string",

"mapping": {

"type": "text",

"analyzer": "english"

} } } ]  }   }

PUT /my_index2/_doc/1

{    "name_es":"testes",

"name":"es"   }

1)匹配字段名以 _es 结尾的字段

2)匹配其他所有字符串类型字段

match_mapping_type:允许你应用模板到特定类型的字段上,就像有标准动态映射规则检测的一样(例如string或 long)

match参数只匹配字段名称,path_match 参数匹配字段在对象上的完整路径,所以 address.*.name将匹配这样的字段

标签:name,映射,dynamic,字段,Elasticsearch,PUT,geo
From: https://www.cnblogs.com/yswsxf/p/17314715.html

相关文章

  • 《c++徒步》MFC篇——消息映射机制
    MFC消息映射机制什么是消息映射机制?MFC使用消息映射机制来处理消息,引入了消息映射表的概念,表中存消息和消息处理函数及二者对应关系。当鼠标点击事件发生时,会产生对应消息,然后去消息映射表中查找对应的消息处理函数并执行。什么是句柄?句柄相当于一个编号,Windows对于我们来说相......
  • ARM64页表映射
    1.ARMv8-A架构基于ARMv8-A架构的处理器最大可以支持到48根地址线,也就是寻址2的48次方的虚拟地址空间,即虚拟地址空间范围为0x0000_0000_0000_0000~0x0000_FFFF_FFFF_FFFF,共256TB。一个是从0x0000_0000_0000_0000到0x0000_FFFF_FFFF_FFFF,另外一个是从0xFFFF_0000_0000_0000到0xFFFF......
  • Elasticsearch(ELK)集群环境部署
    目录一、概述二、准备1)机器环境准备2)创建elsearch用户三、elasticsearch部署1)下载并安装2)修改配置文件以支持集群四、启动出现的问题及解决方案1)JDK版本过低2)配置过低3)JVM内存大小指定太大,但本机内存不够用五、安装elasticsearch-head1)下载安装2)修改服务器监听地址六、安装Kiba......
  • Docker介绍下载安装、制作镜像及容器、做目录映射、做端口映射
    在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物......
  • Mybatis-关联关系映射
    1.一对多 1.1.导入数据表--一对多--客户表(主表)createtablet_customer(customer_idintprimarykeynotnullauto_increment,customer_namevarchar(50)notnull);--多对一--订单表(从表)createtablet_order(order_idintprimarykeynotnull......
  • 在C#中使用Attributes(特性)来控制枚举成员是否应该被序列化或映射
    如果标记了[NonSerialized]特性,会防止将该字段序列化。但是,该字段仍然可以用于foreach迭代,因为它仍然是枚举的有效成员。如果要防止特定枚举成员被foreach迭代,用[NonSerialized]特性是不起作用的。相反,可以创建一个自定义的Attribute继承自System.Attribute,并将其应用到需要隐藏的......
  • Elasticsearch入门
    1、Elasticsearch的认识1.1Elasticsearch概述及其应用领域介绍当我们思考如何在海量数据中快速查找数据并获取准确结果时,Elasticsearch就起到了非常重要的作用。Elasticsearch是一种分布式的搜索引擎,可以用于全文检索、结构化检索和数据分析等领域。具体来说,它的应用领域包括......
  • SpringBoot整合ElasticSearch8.x 踩坑记录
    背景jdk版本openjdk-17springboot版本2.6.11pom.xml<!--ElasticSearch提供的依赖--><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.6.2</version>......
  • Charles:解决Charles映射本地时,option请求的跨域问题
    解决方案原因关于为什么会出现该问题,请参考:https://juejin.cn/post/7021077647417409550解决1、查看页面option接口的请求头中带『Access-Control』开头的header2、通过Charles的rewrite功能修改映射时的header3、具体配置如下:4、再次访问后,即可正常映射参考链接ht......
  • 禁用 DevTools 源映射功能, 隐藏 "DevTools failed to load SourceMap" 报错
    警告DevToolsfailedtoloadsourcemap:Couldnotloadcontentforchrome-extension://cofdbpoegempjloogbagkncekinflcnj/build/content.js.map:系统错误:net::ERR_BLOCKED_BY_CLIENT这个问题可能是因为浏览器的版本不同,所以设置的位置也会略有不同。以下是几个常见浏......