第一步:搞清楚这个框架(技术)是干什么的,解决了什么问题和痛点,同类“竞品”还有哪些

第二步:怎么用

第三步:了解原理

Elasticsearch

WHAT

Elasticsearch 是一个基于 Lucene搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。

Elasticsearch 是用 Java 语言开发的,是一种流行的企业级搜索引擎。

Elasticsearch 的底层是开源库 Lucene。我们没有办法直接使用 Lucene ,必须自己写代码去调用它的接口。

ElasticsearchLucene 的封装,提供了 RESTful API 的操作接口,开箱即用。

WHY

使用数据库 来做搜索业务,不能很好的满足需求。

虽然某一程度上也可以视为数据库,但是它更主要的身份还是一个优秀的全文搜索引擎。它的出现解决了一部分传统关系型数据库和NoSQL非关系型数据库所没有办法高效完成的一些工作,比如高效的全文检索,结构化检索,甚至是数据分析。

响应时间

eg:数据库在做模糊查询时,如LIKE 语句,它会遍历整张表,同时进行字符串匹配。

es 是基于 倒叙索引 的 ,检索速度非常快。

分词

Elasticsearch支持中文分词插件

相关性

Elasticsearch 支持全文搜索和相关度评分。这样在返回结果就会根据分数由高到低排列。分数越高,意味着和查询语句越相关。

可视化界面

MySQL的Navicat

ElasticsearchKibana

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.wwwcom.example.www

三个列族:contentsanchorpeople

对于第一行com.cnn.www

anchor列族包含两列:anchor:cssnsi.comanchor: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:mathcourse:english

cell

由行和列的坐标交叉决定;

单元格是有版本的;

单元格的内容是未解析的字节数组

单元格是由行、列族、列限定符、值和代表值版本的时间戳组成的,({row key,column( =<family>+<qualifier>),version})唯一确定单元格。cell中的数据是没有类型的,全部是字节码形式存储。


Z2Min_
7 声望0 粉丝

引用和评论

0 条评论