Elasticsearch 如何设计表结构

这篇具有很好参考价值的文章主要介绍了Elasticsearch 如何设计表结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 引言

全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。

它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。

Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。

Elasticsearch 在分布式开源搜索和分析引擎中处于领先地位,能在短时间内搜索、分析大量数据,并作为查询数据的存储系统。不过,在使用Elasticsearch的时候,我们需要注意避开以下坑点。

二、如何使用Elasticsearch设计表结构

ES是基于索引(倒排索引)的设计,因此没法像MySQL一样使用join查询,因此使用ES查询数据的时候需要把每条主数据及关联子表的数据全部整合在一条记录中。

比如,MySQL中有一个订单数据,使用ES查询的时候,我们会把每条主数据及关联的数据全部整合在下表中:
Elasticsearch 如何设计表结构
从上表可以看到,使用ES存储数据时并不会设计多个表,而是将所有表的相关字段汇聚在一个Document中,即一个完整的文档结构,类似这样(这里使用json),代码示例:

{
    "order_id": {
        "order_id": "O2020103115214521",
        "order_invoice": {
            
        },
        "user": {
            "user_id": "U1099",
            "user_name": "李大侠"
        },
        "order_product_item": [
            {
                "product_name": "乒乓球拍",
                "product_count": 1,
                "product_price": 149
            },
            {
                "product_name": "纸巾",
                "product_count": 2,
                "product_price": 1.4
            }
        ],
        "total_amount": 20
    }
}

你可能会问,为什么所有表汇聚在一个Document中,而不是设计成多个表?为什么ES不需要关联查询?

要解答这个问题,我们现在需要了解ES的存储结构原理。

ES的存储结构
ES 是一个分布式的查询系统,每一个节点都是一个基于Lucene的查询引擎。

1)索引(Index)

Elasticsearch数据管理的顶层单位叫做Index(索引),相当于关系型数据库的数据库的概念。每个Index的名字必须是小写。

2)文档(Document)

Index里面单条的记录称为Document(文档)。许多Document构成了一个Index。Document使用JSON格式表示。同一个Index里面的Document,不要有有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。

3)类型(Type)

Document 可以分组,比如employee这个 Index 里面,可以按部门分组,也可以按职级分组。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document,类似关系型数据库中的数据表。

不同的 Type 应该有相似的结构(Schema),性质完全不同的数据(比如 products 和 logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。

4)文档元数据(Document metadata)

文档元数据为_index, _type, _id, 这三者可以唯一表示一个文档,_index表示文档在哪存放,_type表示文档的对象类别,_id为文档的唯一标识。

5)字段(Fields)

每个Document都类似一个JSON结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了一个 Document,可以类比关系型数据库数据表中的字段。

|| Lucene与MySQL的概念比对

Lucene是一个索引系统,通过从易到难的方式,把Lucene与MySQL的一些概念简单做映射:
Elasticsearch 如何设计表结构

|| 无结构文档的倒排索引(Index)

Lucene使用的是倒排索引的结构。举个例子:
Elasticsearch 如何设计表结构
倒排索引后,显示结果如下:
Elasticsearch 如何设计表结构
我们发现:无结构的文档经过简单的倒排索引后,字典表主要存放关键字,而倒排表存放该关键字所在的文档ID。

通过上面简单的例子,我们已经明白倒排索引的结构,但是表数据往往是有结构的,并不是一篇篇文章。如果一个文档有结构呢,该怎么办?

|| 有结构文档的倒排索引(Index)

举例:每个Doc 都有Field,Field有不同的值(包含不同的Term),倒排索引的结构参考如下图所示:
Elasticsearch 如何设计表结构
也就是说:有结构的文档经过倒排索引后,字段中的每个值都是一个关键字,存放在左边的 Term Dictionary(词汇表)中,且每个关键字都有对应地址指向所在文档。

|| ES的Document怎么定义结构体和字段格式

由于ES是基于索引的设计,并不需要像MySQL关联表,而是把所有相关数据汇聚在1个Document中。例子:

我们直接将刚刚order的Json文档转成一个ES定义文档命令(注意:SQL的子表数据,在ES中需要以嵌入式对象的格式存储),代码示例:

{
    "mappings":{
        "doc":{
            "properties":{
                "order_id":{
                    "type":"text"
                },
                "order_invoice":{
                    "type":"nested"
                },
                "order_product_item":{
                    "type":"nested",
                    "properties":{
                        "product_count":{
                            "type":"long"
                        },
                        "product_name":{
                            "type":"text"
                        },
                        "product_price":{
                            "type":"float"
                        }
                    }
                },
                "total_amount":{
                    "type":"long"
                },
                "user":{
                    "properties":{
                        "user_id":{
                            "type":"text"
                        },
                        "user_name":{
                            "type":"text"
                        }
                    }
                }
            }
        }
    }
}

三、Elasticsearch如何修改表结构

实际业务中,ES支持直接增加新的字段,但ES不支持修改原来的字段类型。需要注意,修改字段的类型会导致索引失效

如果你想修改字段的映射,首先需要新建一个索引,然后使用ES的reindex功能将旧索引拷贝到新索引中。

reindex是ES自带的API:

POST _reIndex
{
  "source": {
    "Index": "my-Index-000001"
  },

  "dest": {
    "Index": "my-new-Index-000001"
  }
}

不过,直接重命名字段时,我们使用reindex功能会导致原来保存的旧字段名的索引数据失效,这种情况该如何解决?

此时我们可以使用alias索引功能,代码示例:

PUT trips
{
  "mappings": {
    "properties": {
      "distance": {
        "type": "long"
      },

      "route_length_miles": {
        "type": "alias",
        "path": "distance" 
      },

      "transit_mode": {
        "type": "keyword"
      }
    }
  }
}

MySQL使用时,不建议直接修改字段的类型、改名或者删字段。因为,更新版本后,都要做好回滚的打算,因此设计每个版本对应数据库时,尽量兼容前面版本的代码。

ES的结构基于MySQL设计,两者之间存在对应关系,因此不建议直接修改ES的表结构。

问:如果一定要有修改的需求呢?应该如何做?
答:先保留旧的字段,然后直接添加并使用新的字段,直到新版本的代码全部稳定工作后,再找时间清理旧的不用的字段。(分2个版本完成修改需求)文章来源地址https://www.toymoban.com/news/detail-419560.html

到了这里,关于Elasticsearch 如何设计表结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch【全文搜索】

    全文搜索是ES的关键特性之一,平时我们使用SQL的like语句,搜索一些文本、字符串是否包含指定的,但是如果两篇文章,都包含我们的,具体那篇文章内容的相关度更高? 这个SQL的like语句是做不到的,更别说like语句的性能问题了。 ES通过分词处理、相关度计算

    2024年02月09日
    浏览(45)
  • ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

    全文搜索两个最重要的方面是: 相关性(Relevance) 它是评价查询与其结果间的相关程度,并根据这种相关程度对结果排名的一种能力,这种计算方式可以是 TF/IDF 方法、地理位置邻近、模糊相似,或其他的某些算法。 分词(Analysis) 它是将文本块转换为有区别的、规范化的

    2024年02月06日
    浏览(46)
  • 关于Elasticsearch全文搜索引擎

    我们可以把它简称为ES,但是搜索它的资料时(例如百度)还是使用Elasticsearch进行搜索更准确, 这个软件不再是SpringCloud提供的,它也不针对微服务环境的项目来开发 Elasticsearch和redismysql一样,不仅服务于java语言,其它语言也可以使用,它的功能也类似一个数据库,能高效的从

    2024年02月05日
    浏览(61)
  • 全文搜索引擎 Elasticsearch详解

    Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的

    2023年04月22日
    浏览(43)
  • Elasticsearch的全文搜索与匹配

    Elasticsearch是一个开源的搜索和分析引擎,基于Lucene库,用于实现全文搜索和实时分析。它具有高性能、高可扩展性和高可用性,适用于大规模数据的搜索和分析。Elasticsearch的核心功能包括文档存储、搜索引擎、分析引擎和数据可视化。 Elasticsearch的全文搜索功能是其最重要的

    2024年02月22日
    浏览(45)
  • 全文搜索引擎 Elasticsearch 入门使用

    目录 1、安装 2、基本概念 2.1 Node 与 Cluster 2.2 Index 2.3 Document  2.4 Type 3、新建和删除 Index 4、中文分词设置  5、数据操作  5.1 新增记录  5.2 查看记录   5.3 删除记录 5.4 更新记录  6、数据查询 6.1 返回所有记录 6.2 全文搜索  6.3 逻辑运算 7、参考链接 本文从零开始,讲解如何

    2024年02月09日
    浏览(44)
  • 开源的全文搜索引擎Elasticsearch

    Elasticsearch是一个开源的全文搜索引擎,可以实现快速、实时的数据搜索和分析。它是基于Apache Lucene的搜索引擎库开发而来,提供了一个分布式、多租户的全文搜索引擎平台,能够支持海量数据的实时检索、聚合分析和可视化展示。 Elasticsearch 的主要特点包括: 分布式架构:

    2024年02月08日
    浏览(49)
  • Elasticsearch 全文搜索引擎 ---- IK分词器

            原理:分词的原理:二叉树                  首先讲一下为什么要出这个文章,前面我们讲过分词方法: 中文分词搜索 pscws (感兴趣的同学可以去爬楼看一下),那为什么要讲 IK分词 ?最主要的原因是:pscws分词 颗粒度 不如IK分词的颗粒度高,现在的需求

    2024年02月10日
    浏览(52)
  • Elasticsearch的全文搜索和自然语言处理

    Elasticsearch是一个开源的搜索和分析引擎,基于Lucene库,具有高性能、可扩展性和实时性。它广泛应用于企业级搜索、日志分析、实时数据处理等领域。本文将涵盖Elasticsearch的全文搜索和自然语言处理相关知识,包括核心概念、算法原理、最佳实践和实际应用场景。 2.1 Elast

    2024年02月21日
    浏览(46)
  • Spark与Elasticsearch的集成与全文搜索

    Apache Spark和Elasticsearch是在大数据处理和全文搜索领域中非常流行的工具。在本文中,将深入探讨如何在Spark中集成Elasticsearch,并演示如何进行全文搜索和数据分析。将提供丰富的示例代码,以便更好地理解这一集成过程。 在开始集成之前,首先了解一下Spark和Elasticsearch的基

    2024年02月02日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包