介绍elasticsearch中Mapping

2024-08-27 16:18

本文主要是介绍介绍elasticsearch中Mapping,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇文件介绍elasticsearch中mapping特性。我们会定义其关键术语,并进一步介绍mapping是什么,什么时候指定它,其结构是怎样的以及如何应用到我们的数据中。

Schema是什么

schema翻译为模式
mapping 翻译为映射

模式是一个或多个字段的描述,描述文档的类型以及如何处理文档的不同字段。

elasticsearchschema就是mapping,其用于描述在json文档中的字段和数据类型,以及它们在Lucene索引中如何进行索引。因此,在elasticsearch术语中,我们通常将该模式称为映射

在概念上,elasticsearch服务器包含零个或多个索引。一个索引包含零个或多个类型,其类型又包含零个或多个文档。换句话说:一个文档有一个标识,会属于一个类型,其又会属于一个索引。下图显示在索引my_index中,my_type类型中的文档ABXY.

Indexes,types and documents

上图将类型名为another_type和索引名为another显示出来是为了强调elasticsearch多库的,其意味着我们可以在单个服务器上存储多个索引和多个类型。

elasticsearch文档和相关资料中,我们常常看到术语mapping type, 其通常表示在索引内的type名称,例如上图中的my_typeanother_type
当我们在elasticsearch中说到类型,其通常是类型的定义。不要和每个mapping中的type关键字混淆了,该关键字决定了文档中的数据如何由elasticsearch来处理。

什么时候使用自定义的映射

elasticsearch具有无模式的能力,这意味着文档在没有明确提供模式下也能被索引。

如果你不指定映射,则在索引期间检测到文档中的新字段时,elasticsearch将默认会动态生成一个动态映射。然而,这个动态生成的映射需要注意:

  1. 检测到的类型可能不正确
  2. 可能会导致不必要的重复。(特别是_source_all字段)。
  3. 对于索引和搜索会使用默认的分词器和设置。

例如:时间戳在json中常常表示为long,但是elasticsearch可能不能将其检测为date字段,从而阻止了date过滤器和facetsthe date histogram facet)正常工作。

明确指定模式,我们可以避免上述的问题。

映射看起了像什么?

映射通常作为json提供给elasticsearch,是一种分层结构格式,root是映射应用的类型名称。

Mapping Root

在映射root级别,在类型名称下,elasticsearch支持几个特殊字段来配置如何处理不是要发布文档部分的元数据,例如:其typeidsizefallback _all field。有关支持的特殊字段的列表,请参阅Mapping Reference右侧列表中的fields

root 对象还可以有其他额外的属性,它可以为类型设置默认索引和搜索分析器,在类型中的日期会自动解析为日期的格式以及动态模板 - 我们将在以后的文章中重新讨论这些属性。除了上述领域,嵌套json文档的root基本和其他映射基本之间没有区别。

Hierarchical Levels 层次级别

每个层次通常定义一个properties设置,对层次中的文档的key进行映射。这个结构是分层的,意味着每个级别下的叶子节点可能包括其子值的properties设置。为了更好理解,思考下面的文档和其映射:
Document:

{"name": {"first": "John"}
}

Mapping:

{"my_type" : {"properties" : {"name" : {"properties" : {"first" : { "type" : "string" } }}}}
}

虽然映射比文档稍微复杂点,映射的结果清晰的遵循文档的结构,并添加了properties节点。

上面层次:
第一层:key为name这层,归属type
第二层:key为first这层,归属第一层。
所以在设置映射关系时,第一层是被my_type包裹着,第二层是被name这层包裹着,其中它们都是要用properties字段包裹着,表示设置的映射关系。

The type Key

在上面的例子中,我们看到文档字段name.first与其他结构的区别在于它定义了一个type。在叶子层次中使用的type键是为了告诉elasticsearch在文档给定(相同)的层次中如何处理该字段。如果type键被省略, 如非叶子层次类型情况,elasticsearch会假设其为object(对象)类型。

string类型是内置的核心类型之一,elasticsearch支持许多不同的类型,例如:geo_pointip,其可以分别用于有效索引和搜索地理位置和IPv4地址。使用multi_field类型,我们甚至可以将单个文档字段索引到多个虚拟字段中。我们将在未来的文章中详细说明。

如何提供Mapping

这里有两种方式来提供mappingelasticsearch
最常见的方式是在创建索引时:

curl -XPOST ...:9200/my_index -d '{"settings" : {# .. index settings},"mappings" : {"my_type" : {# mapping for my_type}}
}'

另一种方式是使用Put Mapping API

$ curl -XPUT 'http://localhost:9200/my_index/my_type/_mapping' -d '
{"my_type" : {# mapping for my_type}
}
'

注意:该类型(my_type)在请求路径和请求体中是相同的。
API使我们能够更新现有索引的映射,但是存在潜在的冲突和一些限制。新定义的映射可以添加到现有映射中,并且已有的类型可能会更新他们的配置,但是改变类型将会发生冲突并且是不可接受的。然而可以通过将ignore_conflicts=true作为参数传递给Mapping API,但这样做不能保证产生预期的结果,因为已经索引的文档在使用新映射时不会自动重新索引(类似于插入操作)文档。

因此,在大多数情况下,建议使用Put Mapping API在创建索引时,指定映射。

结束语

现在介绍在elasticsearch模式/映射,并且展示了数据类型层次定义是如何映射的。在后续文章中,我将会更详细讲解关于a workflow I use when I explore new datasets with Elasticsearch.

参考地址:
https://www.elastic.co/blog/found-elasticsearch-mapping-introduction

这篇关于介绍elasticsearch中Mapping的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1112166

相关文章

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题