ToB企服应用市场:ToB评测及商务社交产业平台

标题: Elasticsearch 基础入门详文 [打印本页]

作者: 吴旭华    时间: 2023-2-3 01:33
标题: Elasticsearch 基础入门详文

Elasticsearch(简称:ES)功能强大,其背后有很多默认值,或者默认操作。这些操作优劣并存,优势在于我们可以迅速上手使用 ES,劣势在于,其实这些默认值的背后涉及到很多底层原理,怎么做更合适,只有数据使用者知道。用 ES 的话来说,你比 ES 更懂你的数据,但一些配置信息、限制信息,还是需要在了解了 ES 的功能之后进行人工限制。
你是否遇到:在使用了一段时间 ES 之后,期望使用 ES 的其他功能,例如聚合、排序,但因为字段类型受限,无奈只能进行reindex等一系列问题?
题主在遇到一些问题后,发现用 ES 很简单,但是会用 ES 很难。这让我下定决心一定好好了解 ES,也就出现了本文。
 
前言

ES(全称 Elastic Search)是一款开源、近实时、高性能的分布式搜索引擎。在近 3 年的热门搜索引擎类数据统计中,ES 都霸居榜首(数据来源:DBRaking),可见的其深受大家的喜爱。
随着 ES 的功能越来越强大,其和数据库的边界也越来越小,除了进行全文检索,ES 也支持聚合/排序。ES 底层基于Lucene开发,针对Lucene的局限性,ES 提供了 RESTful API 风格的接口、支持分布式、可水平扩展,同时它可以被多种编程语言调用。
ES 很多基础概念以及底层实现其本质是 Lucene 的概念。
ps:本文所有的 dsl 查询、结果展示均基于 ES v7.7
 
历史背景

Lucene 的历史背景

下图这个人叫Doug Cutting,他是 Hadoop 语言和 Lucene 工具包的创始人。Doug Cutting 毕业于斯坦福大学,在 Xerox 积累了一定的工作经验后,从 1997 年开始,利用业余时间开发出了 Lucene。Lucene 面世于 1999 年,并于 2005 年成为 Apache 顶级开源项目。
Lucene的特点:
Lucene的局限性:
ES 的历史背景

ElasticSearch创始人-Shay Banon
ES 多个版本可能出现破坏性变更,例如,在 6.x,ES 不允许一个 Index 中出现多个Type。在 ES 的官网,每个版本都对应着一个使用文档。
在使用 ES 之前,最好先了解 ES 的版本历史。下面列出一些比较重大的更新版本,可以在了解了基本概念之后再看。
 
基础概念介绍

下图简单概述了 index、type、document 之间的关系,type 在新版本中废弃,所以画图时特殊标识了一下。
index

Index 翻译过来是索引的意思。在 ES 里,索引有两个含义:
type

在 6.x 之前, index 可以被理解为关系型数据库中的【数据库】,而 type 则可以被认为是【数据库中的表】。使用 type 允许我们在一个 index 里存储多种类型的数据,数据筛选时可以指定 type 。type 的存在从某种程度上可以减少 index 的数量,但是 type 存在以下限制:
以上限制要求我们,只有同一个 index 的中的 type 都有类似的映射 (mapping) 时,才勉强适用 type 。否则,使用多个 type 可能比使用多个 index 消耗的资源更多。
这大概也是为什么 ES 决定废弃 type 这个概念,个人感觉 type 的存在,就像是一个语法糖,但是并未带来太大的收益,反而增加了复杂度。
document

index 中的单条记录称为 document (文档),可以理解为表中的一行数据。多条 document 组成了一个 index 。
  1. "hits" : {
  2.     "total" : {
  3.       "value" : 3563,
  4.       "relation" : "eq"
  5.     },
  6.     "max_score" : 1.0,
  7.     "hits" : [
  8.       {
  9.         "_index" : "test",
  10.         "_type" : "_doc",
  11.         "_id" : "3073",
  12.         "_score" : 1.0,
  13.         "_source" : {
  14.    ...
  15.    }
  16.   }
  17. ]
复制代码
上图为 ES 一条文档数据,其中:
field

一个 document 会由一个或多个 field 组成,field 是 ES 中数据索引的最小定义单位,下面仅列举部分常用的类型。
⚠️ 在 ES 中,没有数组类型,任何字段都可以变成数组。
string

text

  1. PUT my_index
  2. {
  3.   "mappings": {
  4.     "properties": {
  5.       "city": {
  6.         "type": "text",
  7.         "fields": {
  8.           "raw": {
  9.             "type":  "keyword"
  10.           }
  11.         }
  12.       }
  13.     }
  14.   }
  15. }
复制代码
keyword

numeric

long, integer, short, byte, double, float, half_float, scaled_float...
  1. "price": {
  2.         "type": "scaled_float",
  3.         "scaling_factor": 100
  4.       }
复制代码
mapping

mapping 是一个定义 document 结构的过程, mapping 中定义了一个文档所包含的所有 field 信息。
定义字段索引过多会导致爆炸的映射,这可能会导致内存不足错误和难以恢复的情况, mapping 提供了一些配置对 field 进行限制,下面列举几个可能会比较常见的:
dynamic mapping

在索引 document 时,ES 的动态 mapping 会将新增内容中不存在的字段,自动的加入到映射关系中。ES 会自动检测新增字段的逻辑,并赋予其默认值。
截取了部分 ES 官方文档中的话术,ES 认为一些自动化的操作会让新手上手更容易。但是同时,又提出,你肯定比 ES 更了解你的数据,可能刚开始使用起来觉得比较方便,但是最好还是自己明确定义映射关系。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4