Elasticsearch7.12搜索-索引mapping<2>

本文介绍了Elasticsearch中的动态映射特性,允许在不预先定义字段类型的情况下,根据文档内容自动识别字段类型。动态映射的规则包括:null不添加字段,布尔值为boolean,数值根据类型映射为double或long,字符串会尝试识别为date或numeric。此外,文章还讨论了如何关闭日期检测,以及介绍了元字段如_index、_id、_source等的作用。最后提到了弃用的_type和_id字段及其替代方案。
扫描关注持续好文

动态映射

概念说明

      动态映射可直接创建索引并写入文档,文档中的字段的类型是es自动识别的,不需要在创建索引的时候设置字段的类型。在实际项目中,如果遇到的业务在导入数据之前不确定有哪些字段,也不清楚字段的类型是什么,使用动态映射非常合适。es在文档文档插入时,它会利用动态映射来决定该字段的类型,并自动把该字段添加到映射中,根据字段的取值自动推测字段类型。规则如下:

JSON数据

ES中的数据类型

null

不会添加字段

true or false

boolean

floating point number

double

integer

long

object

object

array

依赖于第一个非null得值

string

如果通过了date检测,则为date

如果通过了numeric检测,则为Number

DSL实例

  • 创建索引

我们先创建一个新的索引,不指定mapping

PUT user_info_dynamic_mapping

图片

  • 查询mapping

查询该索引的mapping,可以看到mapping默认是空的

GET user_info_dynamic_mapping/_mappings

图片

  • 往索引写数据

我们往索引中写一条数据在看mappings

PUT user_info_dynamic_mapping/user_info_dynamic_mapping/1

{

   "id":1,

   "name":"张三",

   "birthdate":"1988-09-01"

}

我们看到7.0之后_doc(类型)被叫做终点名称。

图片

  • 查看mappings

再次查看该索引的mapping

GET user_info_dynamic_mapping/_mappings

图片

可以看到加入数据后产生了mapping

  • 再次写入数据

PUT user_info_dynamic_mapping/user_info_dynamic_mapping/2

{

   "id":2,

   "name":"李四",

   "birthdate":"1989-09-01",

   "sex":"男"

}

执行后mapping自动又创建了

图片

注意:当我们想关闭改功能时可在创建mapping时指定    "dynamic":"strict",

日期检测

    当索引第一条数据入库时,ElasticSearch 会自动猜测字段类型,如果该数据索引字段为日期型字符串,那么它被认为日期型,另外如果有新的字段添加第一条数据入索引也是该规则。比如:第一条数据格式为{"note":"2019-01-08"}那么改字段认定为日期型,但是实际我们想该字段为字符型,当再次添加{"note":"我是一条鱼"}这时改字段显然不是日期类型,此时会抛出异常下面我们通过设置date_detection为false来关闭日期检测

关闭日期检测

PUT  /user_info_dynamic_date

{

   "mappings": {

           "date_detection":false

   }

通过这种方式映射后面日期型也会映射为字符型,如果后面需要新增date类型字段,

元字段

    mapping元字段是mapping映射中描述文档本身的字段,大致可以分为文档属性元数据、文档元数据、索引元数据、路由元数据和自定义元数据。

分类

元数据

说明

文档属性元数据

_index

文档所属的索引

_id

文档的id

_type

文档所属类型

_uid

由_type和_id字段组成

文档元数据

_source

文档的原生json字符串

_size

整个_source字段的字节数大小

索引元数据

_all

自动组合所有的字段值

_field_names

索引了每个字段的名称

路由元数据

_parent

指定文档之间父子关系,已过时

_routing

将一个文档根据路由存储到指定分片上

自定义元数据

_meta

用于自定义元数据

  • _type

   在6.0.0中弃用。此doc的mapping type名, 自动被索引,可被查询,聚合,排序使用,或者脚本里访问 。

  • _id

    doc的id,建索引时候传入 ,不被索引, 可通过_uid被查询,脚本里使用,不能参与聚合或排序。6.0之前的版本并不是这样的,因为它们支持多种类型,所以_type和_id被合并为一个名为_uid的复合主键。

  • _uid

   在6.0.0中弃用。现在,类型已被删除,文档由_id唯一标识,_uid字段仅作为查看_id字段以保持向后兼容。

  • _source

      _source字段包含在索引时间传递的原始JSON文档正文。_source字段本身没有编入索引(因此不可搜索),但它被存储,以便在执行获取请求(如get或search)时可以返回它。默认_source字段是开启的,也就是说,默认情况下存储文档的原始值。如果某个字段内容非常多(比如一篇小说),或者查询业务只需要对该字段进行搜索,返回文档id,然后通过其他途径查看文档原文,则不需要保留_source元字段。可以通过禁用_source元字段,在ElasticSearch 中只存储倒排索引,不保留字段原始值。

  • _size

    整个_source字段的字节数大小 。

  • _all

      _all可能不再为在6.0+中创建的索引启用,请使用自定义字段和映射copy_to参数

_all字段是把其它字段拼接在一起的超级字段,所有的字段用空格分开,_all字段会被解析和索引,但是不存储。当你只想返回包含某个关键字的文档但是不明确地搜某个字段的时候就需要使用_all字段。按照官方文档的说法,_all元字段默认是禁用的,如果需要使用,可以通过"_all": {"enabled": true}开启,测试如下。PUT myindex { "mappings": { "mytype": { "_all": {"enabled": true}, "properties": { "title": { "type": "text" }, "content": { "type": "text" } } } } }但是创建失败,报错:”Enabling [_all] is disabled in 6.0. As a replacement, you can use [copy_to] on mapping fields to create your own catch all field.”看来在Elasticsearch 6. 0+中_all元字段是真的不能使用了。  

  • _field_names

    _field_names字段索引文档中每个字段的名称,其中包含除null以外的任何值。存在查询使用此字段来查找对于特定字段具有或不具有任何非空值的文档。

  • _parent

   ES6.0+改为join的实现方式,使用join数据类型。

  • _routing

     使用以下公式将文档路由到索引中的特定分片:

shard_num = hash(_routing) % num_primary_shards,The default value used for _routing is the document’s _id. 

_routing的默认值是文档的_id。自定义路由模式可以通过指定每个文档的自定义路由值来实现。

扫描关注持续好文
<think>嗯,用户给了一个Log4stash的ElasticSearchAppender配置,让我帮忙看看哪里有问题并修改。首先,我需要仔细检查配置中的各个部分,看看有没有常见的错误或安全隐患。 首先看服务器地址和端口。服务器是47.122.122.95,端口9200,这看起来没问题,但得确认是不是正确的Elasticsearch地址。不过这部分用户应该自己确认,可能不需要修改。 然后是索引名称ktq_dev_logs_%{+yyyy-MM-dd},这里用了日期格式,应该是每天生成一个索引,这没问题。不过要注意Elasticsearch索引命名规则,是否小写,没有特殊字符,这里看起来符合。 接下来是认证部分。这里用了Basic认证,用户名log_writer1,密码Adn20250208。这里有个大问题,密码是明文显示,这在配置文件中是不安全的,特别是如果配置文件被提交到版本控制系统,就会泄露凭证。应该建议使用加密方式存储密码,比如Log4stash可能支持的SecureString或者环境变量。 然后是缓冲设置,Bulksize设置为1,BulkIdleTimeout也是1。Bulksize是指批量提交的大小,设为1的话每条日志都立即发送,失去了批量处理的意义,可能会影响性能。通常建议设为几百到几千,根据日志量调整。BulkIdleTimeout是等待时间,设为1秒可能太短,可以适当增加,比如10秒,这样在低流量时也能批量发送。 另外,可能缺少一些其他配置,比如是否启用SSL/TLS。如果Elasticsearch配置了HTTPS,这里可能需要设置Scheme为https,或者添加SSL相关的配置,否则可能导致连接失败。 还有,检查一下Log4stash的文档,确认配置项的正确性。比如Bulksize和BulkIdleTimeout是否正确,有些库可能用不同的参数名,比如batchSize或者bulkSize。还有认证部分的结构是否正确,比如是否需要在Basic里面嵌套Username和Password。 总结问题点:明文密码、缓冲设置不合理、可能缺少SSL配置。修改建议包括加密密码、调整缓冲参数、添加SSL设置。另外提醒用户检查服务器地址和端口,确保正确,以及索引命名是否符合规范。</think>这个配置存在以下几个问题需要改进: 1. **安全风险**: - 密码明文存储:`<Password>Adn20250208</Password>` 直接暴露了ES账户密码 - 建议修改为加密存储方式: ```xml <Password type="log4stash.Core.Cryptography.SecureString, log4stash"> <!-- 使用加密后的密文 --> <Value>加密后的字符串</Value> </Password> ``` 2. **缓冲设置不合理**: ```xml <Bulksize>1</Bulksize> <!-- 批量提交数量过低 --> <BulkIdleTimeout>1</BulkIdleTimeout> <!-- 闲等待时间过短 --> ``` 建议调整为: ```xml <Bulksize>500</Bulksize> <!-- 每积累500条日志批量提交 --> <BulkIdleTimeout>10000</BulkIdleTimeout> <!-- 闲10秒后自动提交 --> ``` 3. **缺少SSL配置**(如果ES启用了HTTPS): 需要补充SSL设置: ```xml <Scheme>https</Scheme> <!-- 默认是http --> <SSL>true</SSL> <AllowSelfSignedServerCert>true</AllowSelfSignedServerCert> <!-- 如果使用自签名证书 --> ``` 完整改进方案: ```xml <appender name="ElasticSearchAppender" type="log4stash.ElasticSearchAppender, log4stash"> <!-- 集群节点地址 --> <Server>47.122.122.95</Server> <Port>9200</Port> <Scheme>https</Scheme> <SSL>true</SSL> <!-- 索引名称(推荐小写+日期格式) --> <IndexName>ktq-dev-logs-%{+yyyy-MM-dd}</IndexName> <!-- 认证配置 --> <AuthenticationMethod> <AuthType>Basic</AuthType> <Basic> <Username>log_writer1</Username> <Password type="log4stash.Core.Cryptography.SecureString, log4stash"> <Value>ENCRYPTED_PASSWORD</Value> </Password> </Basic> </AuthenticationMethod> <!-- 优化后的缓冲设置 --> <Bulksize>500</Bulksize> <BulkIdleTimeout>10000</BulkIdleTimeout> <!-- 错误重试配置 --> <ReconnectInterval>5000</ReconnectInterval> <MaxRetry>3</MaxRetry> </appender> ``` 补充建议: 1. 索引名称建议改为全小写:`ktq-dev-logs` 2. 生产环境建议配置多个ES节点地址 3. 如果使用自签名证书,需添加证书指纹验证 4. 密码加密需要使用log4stash提供的加密工具生成密文 5. 建议添加失败重试机制配置 可以使用log4stash自带的加密工具生成密码: ```powershell SecureStringUtil.exe -e "Adn20250208" ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值