第一步:搞清楚这个框架(技术)是干什么的,解决了什么问题和痛点,同类“竞品”还有哪些
第二步:怎么用
第三步:了解原理
Elasticsearch
WHAT
Elasticsearch
是一个基于 Lucene
的 搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web
接口。
Elasticsearch
是用 Java
语言开发的,是一种流行的企业级搜索引擎。
Elasticsearch
的底层是开源库Lucene
。我们没有办法直接使用Lucene
,必须自己写代码去调用它的接口。
Elasticsearch
是Lucene
的封装,提供了RESTful API
的操作接口,开箱即用。
WHY
使用数据库 来做搜索业务,不能很好的满足需求。
虽然某一程度上也可以视为数据库,但是它更主要的身份还是一个优秀的全文搜索引擎。它的出现解决了一部分传统关系型数据库和NoSQL非关系型数据库所没有办法高效完成的一些工作,比如高效的全文检索,结构化检索,甚至是数据分析。
响应时间
eg
:数据库在做模糊查询时,如LIKE
语句,它会遍历整张表,同时进行字符串匹配。
而 es
是基于 倒叙索引 的 ,检索速度非常快。
分词
Elasticsearch
支持中文分词插件
相关性
Elasticsearch
支持全文搜索和相关度评分。这样在返回结果就会根据分数由高到低排列。分数越高,意味着和查询语句越相关。
可视化界面
MySQL的Navicat
Elasticsearch
的 Kibana
HOW
基础知识
Elasticsearch
Java API
Java客户端是通过 9300端口 并使用Elasticsearch 的原生传输协议和集群交互。
集群中的节点通过端口 9300彼此通信。如果这个端口没有打开,节点将无法形成一个集群。
RESTful API with Json over HTTP
基于HTTP的 Json RESTful API
所有其它语言可以使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信,
也可以使用 curl
命令来和 Elasticsearch 交互。
curl 是常用的命令行工具,用来请求 web服务器。它的名字就是客户端(client)的URL工具的意思。
面向文档
Elasticsearch 是面向文档的,意味着它存储整个对象或 文档。
Elasticsearch 不仅存储文档,而且索引每个文档的内容,使之可以被检索。
(比如说,存储员工文档,一个文档代表一个员工,存储数据到Elasticsearch的行为叫做索引。)
在Elasticsearch中,我们对文档进行索引、检索、排序和过滤,而不是对行列数据。
这是一种完全不同的思考数据方式,也是Elasticsearch能支持复杂全文检索的原因。
Elasticsearch 使用 JSON(JavaScript Object Notation)作为文档的序列化格式。
索引
- 名词:一个 索引 类似于传统关系型数据库中的一个 数据库,是一个存储关系型文档的地方
- 动词:索引一个文档,就是存储一个文档到一个 索引(名词)中,以便被检索和查询,这非常类似于SQL语句中的
INSERT
关键字
倒排索引
关系型数据库通过增加一个索引,比如一个B-Tree索引 到指定的列上,以便提升数据检索的速度。
Elasticsearch 和 Lucene 使用一个叫做 倒排索引的结构来达到相同的目的。
默认的,一个文档中的每一个属性都是 被索引的 (有一个倒排索引) 和可搜索的。
一个没有倒排索引的属性是不能被搜索到的。
搜索
检索全部数据
GET _search
{
"query": {
"match_all": {}
}
}
检索指定索引数据
GET /indexName/_search{}
检索指定索引的指定字段
GET /indexName/_search
{
"query": {
"match": {
"field":"text"
//"title": "elasticsearch"
}
}
}
短语搜索
精确查询一个短语 “Time is money”
//使用 match_phrase
GET /indexName/_search
{
"query": {
"match_phrase": {
"field": "Time is money"
}
}
}
高亮搜索
新增 highlight
参数,组合查询
GET /indexName/_search
{
"query": {
"match": {
"field": "text"
}
},
"highlight": {
"fields": {
"field": {}
}
}
}
//高亮部分 以 HTML 标签 封装
分析
Elasticsearch 有一个功能叫做聚合
(aggregations),允许我们基于数据生成一些精细的分析结果。
聚合与SQL中的GROUP BY
类似但更强大。
GET /indexName/_search
{
"aggs": {
"NAME": {
"AGG_TYPE": {}
}
}
}
Elasticsearch天生分布式,并且在设计时,屏蔽了分布式的复杂性。
Hbase
WHTA
Hadoop Database
HBase
是Apache的 Hadoop
项目的子项目。
HBase
是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。
HBase
不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库, HBase
基于列的而不是基于行的模式.
HBase
的原型是Google的BigTable
论文。
WHY
MySQL
无法满足海量的数据存储,
MySQL
-> 面向行存储
HBase
-> 面向行存储
HOW
HBase概念视图
图
表名:webtable
两行:com.cnn.www
和 com.example.www
三个列族:contents
、anchor
、people
对于第一行com.cnn.www
anchor
列族包含两列:anchor:cssnsi.com
和 anchor:my.look.ca
{
"com.cnn.www": {
contents: {
t6: contents:html: "<html>..."
t5: contents:html: "<html>..."
t3: contents:html: "<html>..."
}
anchor: {
t9: anchor:cnnsi.com = "CNN"
t8: anchor:my.look.ca = "CNN.com"
}
people: {}
}
"com.example.www": {
contents: {
t5: contents:html: "<html>..."
}
anchor: {}
people: {
t5: people:author: "John Doe"
}
}
}
HBase物理视图
图
HBase
概念视图中显示的空单元根本不存储。
HBase表、行与列族
表
创建一个HBase
表:
create ‘<table name>’,’<column family>’
行
HBase
中的行是逻辑上的行,物理模型上行时按列族(column family
)分别存取的。
列族
Hbase
表中的每个列都归属于某个列族,
列名由其 列族前缀 和 限定符 组成,
列的限定符是列族中数据的索引。
eg
:
列族:course
列名:course:math
,course:english
…
cell
由行和列的坐标交叉决定;
单元格是有版本的;
单元格的内容是未解析的字节数组
单元格是由行、列族、列限定符、值和代表值版本的时间戳组成的,({row key,column( =<family>+<qualifier>),version})唯一确定单元格。cell中的数据是没有类型的,全部是字节码形式存储。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。