0、面向文档

应用中的对象很少只是简单的键值列表,更多时候它拥有复杂的数据结构,比如包含日期、地理位置、另一个对象或者数组。

总有一天你会想到把这些对象存储到数据库中。将这些数据保存到由行和列组成的关系数据库中,就好像是把一个丰富,信息表现力强的对象拆散了放入一个非常大的表格中:你不得不拆散对象以适应表模式(通常一列表示一个字段),然后又不得不在查询的时候重建它们。

Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一。

 1、JSON

ELasticsearch使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。它简洁、简单且容易阅读。

以下使用JSON文档来表示一个用户对象:

{"email":      "john@smith.com","first_name": "John","last_name":  "Smith","info": {"bio":         "Eco-warrior and defender of the weak","age":         25,"interests": [ "dolphins", "whales" ]},"join_date": "2014/05/01"
}

尽管原始的user对象很复杂,但它的结构和对象的含义已经被完整的体现在JSON中了,在Elasticsearch中将对象转化为JSON并做索引要比在表结构中做相同的事情简单的多。

2、索引(indexing)

我们首先要做的是存储员工数据,每个文档代表一个员工。在Elasticsearch中存储数据的行为就叫做索引(indexing),不过在索引之前,我们需要明确数据应该存储在哪里。

在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

你可能已经注意到索引(index)这个词在Elasticsearch中有着不同的含义,所以有必要在此做一下区分:

  • 索引(名词) 如上文所述,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices indexes
  • 索引(动词) 「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的INSERT关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。
  • 倒排索引 传统数据库为特定列增加一个索引,例如B-Tree索引来加速检索。Elasticsearch和Lucene使用一种叫做倒排索引(inverted index)的数据结构来达到相同目的。

它不需要你做额外的管理操作,比如创建索引或者定义每个字段的数据类型。我们能够直接索引文档,Elasticsearch已经内置所有的缺省设置,所有管理操作都是透明的

3、搜索(search)

# 准备megacorp公司三个员工的数据
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" ]
}# 查询id:1的文档
GET /megacorp/employee/1# 搜索全部文档,默认情况下搜索会返回前10个结果
GET /megacorp/employee/_search# 搜索姓氏中包含“Smith”的员工
#轻量级的搜索方法,这种方法常被称作查询字符串(query string)搜索
GET /megacorp/employee/_search?q=last_name:Smith# 查询字符串搜索便于通过命令行完成特定(ad hoc)的搜索,但是它也有局限性。
# Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。
# DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。我们可以这样表示之前关于“Smith”的查询:
GET /megacorp/employee/_search
{"query" : {"match" : {"last_name" : "Smith"}}
}# 想要找到姓氏为“Smith”的员工,但是我们只想得到年龄大于30岁的员工。
# 我们的语句将添加过滤器(filter)
GET /megacorp/employee/_search
{"query" : {"bool" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"must" : {"match" : {"last_name" : "smith"}}}}
}# 全文搜索
# 搜索所有喜欢“rock climbing”的员工
# 传统数据库很难实现的功能
# 这个例子很好的解释了Elasticsearch如何在各种文本字段中进行全文搜索,并且返回相关性最大的结果集。
# 相关性(relevance)的概念在Elasticsearch中非常重要,而这个概念在传统关系型数据库中是不可想象的,
# 因为传统数据库对记录的查询只有匹配或者不匹配。
GET /megacorp/employee/_search
{"query" : {"match" : {"about" : "rock climbing"}}
}​
# 短语搜索:确切的匹配若干个单词或者短语(phrases)
# 查询同时包含"rock"和"climbing"(并且是相邻的)的员工记录
GET /megacorp/employee/_search
{"query" : {"match_phrase" : {"about" : "rock climbing"}}
}

4、聚合(aggregations)。

Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计。它很像SQL中的GROUP BY但是功能更强大。

# 找到所有职员中最大的共同点(兴趣爱好)是什么:
GET /megacorp/employee/_search
{"aggs": {"all_interests": {"terms": { "field": "interests" }}}
}

对interests分桶

Fielddata可以消耗大量的堆空间,特别是在加载高基数text字段时。一旦fielddata被加载到堆中,它将在该段的生命周期中保持在那里。此外,加载fielddata是一个昂贵的过程,可以导致用户体验延迟命中。这就是为什么fielddata默认是禁用的。如果您尝试对text 字段上的脚本进行排序,聚合或访问值,则会看到以下异常:

解决办法

# 您可以text使用PUT映射API在现有字段 上启用fielddata
PUT  megacorp/_mapping/employee
{ "properties": { "interests": {"type":"text","fielddata":true } }
}
# 我们想知道所有姓"Smith"的人最大的共同点
GET /megacorp/employee/_search
{"size": 0,"query": {"match": {"last_name": "smith"}},"aggs": {"all_interests": {"terms": {"field": "interests"}}}
}# 聚合也允许分级汇总。例如,让我们统计每种兴趣下职员的平均年龄
# all_interests,avg_age是自定义的
GET /megacorp/employee/_search
{"aggs" : {"all_interests" : {"terms" : { "field" : "interests" },"aggs" : {"avg_age" : {"avg" : { "field" : "age" }}}}}
}

分级查询结果:

分级查询结果

5、参考资料

  1. Elasticsearch 权威指南(中文版),本文内容基本来源于此网络文档;

(三)ElasticSearch的基本概念相关推荐

  1. 了解一下Elasticsearch的基本概念

    了解一下Elasticsearch的基本概念 一.前文介绍 Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene 可以 ...

  2. 有关ElasticSearch的基本概念

    本文来说下有关ElasticSearch的基本概念 文章目录 概述 ElasticSearch术语 文档(Document) 索引(Index) 类型(Type) 集群(Cluster) 节点(Nod ...

  3. ElasticSearch的基本概念和集群分布式底层实现

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:张勇 http://tech.dianwoda.com/ 深 ...

  4. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  5. lucene和elasticsearch的前世今生、elasticsearch的核心概念、elasticsearch核心概念 vs. 数据库核心概念(来自学习资料)

    1.Lucene和elasticsearch的前世今生 lucene,最先进.功能最强大的搜索库,直接基于lucene开发,非常复杂,api复杂(实现一些简单的功能,写大量的java代码),需要深入理 ...

  6. ROS有三个层级的概念,分别是:文件系统级、计算图级和开源社区级

    ROS有三个层级的概念,分别是:文件系统级.计算图级和开源社区级. 文件系统级:ROS的内部结构.文件结构和所需的核心文件都在这一层里,理解ROS文件系统是入门ROS的基础.一个ROS程序的结构,是一 ...

  7. JavaScript高级编程设计(第三版)——第三章:基本概念

    系列文章目录 第二章:在html中使用javaScript 第三章:基本概念 第四章:变量作用域和内存问题 目录 系列文章目录 前言 一.语法 1.标识符 2.关键字和保留字 二.数据类型 1.nul ...

  8. typora 公式对齐_三年级数学下册概念及公式,一篇就搞定,给孩子寒假看!

    文末有打印方法 三年级数学下册公式和概念 一.长度单位:长度单位有千米(公里).米.分米.厘米.毫米. 1厘米=10毫米   1分米=10厘米   1分米=100毫米 1米=10分米   1米=100 ...

  9. 信息化,数字化,智能化是三种不同的概念吗?

    信息化,数字化,智能化是三种不同的概念,信息化以流程为中心,数字化以业务为核心,智能化以智能技术应用为重点,下面分别阐述他们的定义与区别. 信息化是指企业以业务流程的优化和重构为基础,在一定的深度和广 ...

最新文章

  1. 一文详解单目结构光参数法
  2. table合并单元格colspan和rowspan
  3. Apache的架构师们遵循的30条设计原则
  4. 【转】以操作系统的角度述说线程与进程
  5. PL/SQL之JOB用法 (定时跑数据)
  6. Apache Camel 2.21发布–新增功能
  7. Python数据分析入门(四)
  8. Go入门之——GOROOT、GOPATH、GOBIN 、Project目录
  9. 贝壳金控赵文乐:基于 Spring Cloud 的服务治理实践
  10. mac设置python3环境变量_mac下python3的环境变量设置!
  11. 小学音乐教学和计算机的融合,【多媒体技术论文】小学音乐多媒体教学融入策略问题(共5881字)...
  12. 循环智能杨植麟:“人机耦合”将是对话语义应用的新趋势!
  13. 端到端文本检测与识别——FOTS
  14. verifycode验证码模版
  15. SOA 普元EOS 工作流开发
  16. win7 局域网共享文件
  17. 在线的棋牌类网络游戏java服务端实现
  18. android 橡皮擦 黑色,Android画板,橡皮擦为黑色痕迹的问题
  19. 【camera】手机相机系统
  20. 问题:如何查询宇视摄像机/摄像头规格参数

热门文章

  1. 第九十六期:JavaScript 中的 4 个相等比较算法的介绍
  2. 29使用QRcode方式生成二维码
  3. 数字图像与数字图像处理
  4. HTML DOM之属性的各种操作方法
  5. 比拼浮点运算速度,超算排行榜是这样“算”出来的
  6. JavaScript基础知识(Date 的方法)
  7. CodeForces 580A Kefa and First Steps
  8. js打开、关闭页面和运行代码那些事
  9. UNIX时间戳及日期的转换与计算
  10. Android学习笔记-判断手机外部存储是否可读写