ES学习之初步认识

匿名 (未验证) 提交于 2019-12-03 00:19:01
本文主要内容: 1、ES的特点 2、索引文档、检索文档、轻量级查询、表达式查询、结构化搜索、全文检索    短语检索、高亮搜索、分析聚合 3、ES分布式特性  

ES和关系型数据库差别:
在应用程序中对象很少只是一个简单的键和值的列表。通常,它们拥有更复杂的数据结构,可能包括日期、地理信息、其他对象或者数组等。

ES特征:
Elasticsearch 是 面向文档 的,意味着它存储整个对象或 文档。Elasticsearch 不仅存储文档,而且
Elasticsearch 使用 JavaScript Object Notation 或者 JSON 作为文档的序列化格式。JSON 序列化被大多数编程语言所支持,并且已经成为 NoSQL 领域的标准格式。 它简单、简洁、易于阅读。

=============================================================================
索引(名词):
一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。
索引(动词):
索引一个文档 就是存储一个文档到一个 索引 (名词)中以便它可以被检索和查询到。这非常类似于 SQL 语句中的 INSERT 关键词,除了文档已存在时新文档会替换旧文档情况之外。
倒排索引:
关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。
一个文档中的每一个属性都是被索引的(有一个倒排索引)和可搜索的。一个没有倒排索引的属性是不能被搜索到的。

=================================================================================

为了对 Elasticsearch 能实现什么及其上手容易程度有一个基本印象,让我们从一个简单的教程开始并介绍索引、搜索及聚合等基础概念。

我们受雇于 Megacorp 公司,作为 HR 部门新的 “热爱无人机” (“We love our drones!”)激励项目的一部分,我们的任务是为此创建一个雇员目录。该目录应当能培养雇员认同感及支持实时、高效、动态协作,因此有一些业务需求:

  • 支持包含多值标签、数值、以及全文本的数据
  • 检索任一雇员的完整信息
  • 允许结构化搜索,比如查询 30 岁以上的员工
  • 允许简单的全文搜索以及较复杂的短语搜索
  • 支持在匹配文档内容中高亮显示搜索片段
  • 支持基于数据创建和管理分析仪表盘

1、索引文档:

PUT /megacorp/employee/1 {     "first_name" : "John",     "last_name" :  "Smith",     "age" :        25,     "about" :      "I love to go rock climbing",     "interests": [ "sports", "music" ] } PUT /megacorp/employee/2 {     "first_name" :  "Jane",     "last_name" :   "Smith",     "age" :         32,     "about" :       "I like to collect rock albums",     "interests":  [ "music" ] }  PUT /megacorp/employee/3 {     "first_name" :  "Douglas",     "last_name" :   "Fir",     "age" :         35,     "about":        "I like to build cabinets",     "interests":  [ "forestry" ] }

2、检索文档:

GET /megacorp/employee/1

3、轻量级查询:

//查询所有文档 GET /megacorp/employee/_search  //查询姓为Smith的文档 GET /megacorp/employee/_search?q=last_name:Smith

4、使用查询表达式:

GET /megacorp/employee/_search {     "query" : {         "match" : {             "last_name" : "Smith"         }     } }

5、结构化搜索:

//年龄>30且姓smith GET /megacorp/employee/_search {     "query" : {         "bool": {             "must": {                 "match" : {                     "last_name" : "smith"                  }             },             "filter": {                 "range" : {                     "age" : { "gt" : 30 }                  }             }         }     } }

6、全文搜索:

//喜欢攀岩 GET /megacorp/employee/_search {     "query" : {         "match" : {             "about" : "rock climbing"         }     } }

该笔搜索结果如下:

{    ...    "hits": {       "total":      2,       "max_score":  0.16273327,       "hits": [          {             ...             "_score":         0.16273327,              "_source": {                "first_name":  "John",                "last_name":   "Smith",                "age":         25,                "about":       "I love to go rock climbing",                "interests": [ "sports", "music" ]             }          },          {             ...             "_score":         0.016878016,              "_source": {                "first_name":  "Jane",                "last_name":   "Smith",                "age":         32,                "about":       "I like to collect rock albums",                "interests": [ "music" ]             }          }       ]    } }

Elasticsearch 默认按照相关性得分排序,即每个文档跟查询的匹配程度。第一个最高得分的结果很明显:John Smith 的 about 属性清楚地写着 “rock climbing”

但为什么 Jane Smith 也作为结果返回了呢?原因是她的 about 属性里提到了 “rock” 。因为只有 “rock” 而没有 “climbing” ,所以她的相关性得分低于 John 的。

这是一个很好的案例,阐明了 Elasticsearch 如何 在 全文属性上搜索并返回相关性最强的结果。Elasticsearch中的 相关性 概念非常重要,也是完全区别于传统关系型数据库的一个概念,数据库中的一条记录要么匹配要么不匹配。

7、短语搜索:

GET /megacorp/employee/_search {     "query" : {         "match_phrase" : {             "about" : "rock climbing"         }     } }

该笔返回结果如下:

{    ...    "hits": {       "total":      1,       "max_score":  0.23013961,       "hits": [          {             ...             "_score":         0.23013961,             "_source": {                "first_name":  "John",                "last_name":   "Smith",                "age":         25,                "about":       "I love to go rock climbing",                "interests": [ "sports", "music" ]             }          }       ]    } }

8、高亮搜索:

GET /megacorp/employee/_search {     "query" : {         "match_phrase" : {             "about" : "rock climbing"         }     },     "highlight": {         "fields" : {             "about" : {}         }     } }

当执行该查询时,返回结果与之前一样,与此同时结果中还多了一个叫做 highlight 的部分。这个部分包含了 about 属性匹配的文本片段,并以 HTML 标签 <em></em> 封装:

{    ...    "hits": {       "total":      1,       "max_score":  0.23013961,       "hits": [          {             ...             "_score":         0.23013961,             "_source": {                "first_name":  "John",                "last_name":   "Smith",                "age":         25,                "about":       "I love to go rock climbing",                "interests": [ "sports", "music" ]             },             "highlight": {                "about": [                   "I love to go <em>rock</em> <em>climbing</em>"                 ]             }          }       ]    } }

9、分析聚合:
lasticsearch 有一个功能叫聚合(aggregations),允许我们基于数据生成一些精细的分析结果。聚合与 SQL 中的 GROUP BY 类似但更强大。

我们提到过 Elasticsearch 可以横向扩展至数百(甚至数千)的服务器节点,同时可以处理PB级数据。我们的教程给出了一些使用 Elasticsearch 的示例,但并不涉及任何内部机制。Elasticsearch 天生就是分布式的,并且在设计时屏蔽了分布式的复杂性。

Elasticsearch 在分布式方面几乎是透明的。教程中并不要求了解分布式系统、分片、集群发现或其他的各种分布式概念。可以使用笔记本上的单节点轻松地运行教程里的程序,但如果你想要在 100 个节点的集群上运行程序,一切依然顺畅。

Elasticsearch 尽可能地屏蔽了分布式系统的复杂性。这里列举了一些在后台自动执行的操作:

  • 分配文档到不同的容器 或 分片 中,文档可以储存在一个或多个节点中
  • 按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡
  • 复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失
  • 将集群中任一节点的请求路由到存有相关数据的节点
  • 集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!