es 的來源
問題拆解
- 如果用數(shù)據(jù)庫來實現(xiàn)會怎么樣茫多?
- 什么是全文檢索绷耍?
- 什么是 Lucene吐限?
數(shù)據(jù)庫實現(xiàn)
先看第一個問題,如果我們用數(shù)據(jù)來實現(xiàn)搜索功能褂始,可能的語句就是對 string 建立索引诸典,或者直接 like
關(guān)鍵字。帶來的問題是什么崎苗?
- (字符串掃描)如果有個字段是書籍描述狐粱,有個上千、上萬字胆数,那這個是時候進行字符串掃描可以說是非常慢肌蜻,
- (分詞)另外,如果輸入 ** 連續(xù)性程 **必尼,如果是字符串匹配我們無法搜索出 ** 連續(xù)性方程 ** 這種關(guān)鍵詞
什么是全文檢索
全文檢索做的是倒排索引蒋搜,記錄了 word => doc 之間的關(guān)系
什么是 Lucene
- 全文索引,倒排索引
- Lucene 是一個 jar 包判莉,里面提供了整套的倒排索引和數(shù)據(jù)管理功能豆挽。我們用 java 開發(fā)的時候,可以引用 Lucene 包券盅,調(diào)用 Lucene 提供的 api帮哈,完成索引和數(shù)據(jù)管理功能。
什么是 ElasticSearch
ElasticSearch 就是基于 Lucene 提供了更高一級別的抽象锰镀,es 管理了好多的 Lucene但汞,每個 Lucene 都是一個實例,es 提供了集群功能互站,高可用,負載均衡等高級功能僵缺,簡單點說:ElasticSearch = (Lucene)+ 高級特性
es 的功能
- 全文檢索:建立倒排胡桃,sql 類似于:
select * from products where category_name like '% 成人用品 %
- 數(shù)據(jù)分析:說白了就是類似于下面的 sql
select category_id,count(1) from products group by category_id
,統(tǒng)計每個類別的商品數(shù)量 - 結(jié)構(gòu)化搜索:能夠像 sql 一樣根據(jù)字段進行查詢磕潮,例子:
select * from products where category_id='成人用品'
查找成人商品
es 的特點
- 分布式存儲(支持 PB 級別)
- 分布式索引(倒排)
- 分布式分析(結(jié)構(gòu)化搜索翠胰、數(shù)據(jù)分析)
es 的核心概念
- Near Realtime(NRT):近實時,為什么說是近實時自脯,因為 es 中從數(shù)據(jù)插入到能被搜索到時間大概是秒級別
- Cluster:集群之景,集群的默認名為 elasticsearch,一個集群會有多個 node膏潮,每個 node 都屬于一個集群
- Node:集群中的每個節(jié)點都會有一個默認名字锻狗,默認名字的節(jié)點都會加入 elasticsearch 的集群
- Document:文檔是 es 中的最小數(shù)據(jù)單元,每個文檔都可以用一個 json 對象來表述,每個文檔對象都有 field轻纪,每個 field 都是一個數(shù)據(jù)字段
一個例子:
book document
{
"book_id": "1",
"book_name": "es 深入淺出",
"book_desc": "通俗全市 es",
"category_id": "1",
"category_name": "數(shù)據(jù)庫"
}
- Index:索引油额,包含所有結(jié)構(gòu)相似的文檔
- Type:類型,每個索引里都可以有一個或多個 type刻帚,type 是 index 中的一個邏輯數(shù)據(jù)分類潦嘶,一個 type 下的 document,都有相同的 field崇众。最新的 es 中已經(jīng)取消了 type 概念了每個 index 都只有一個隱藏的 index
- shard:分片掂僵,es 可以將一個 index 分為好幾個分片,每個分片可以分配到不同的 node 上顷歌。每個 shard 都是一個 Lucene 實例锰蓬。
- replica:副本,為了保證高可用衙吩,每個 shard 都需要有幾個 replica 副本互妓,同時副本在保證高可用的同時,也能提供系統(tǒng)的吞吐量和性能(副本提供讀)坤塞。shard 會分為 primary shard (建立索引時一次設(shè)置冯勉,不能修改,默認 5 個)和 replica shard(隨時修改數(shù)量摹芙,默認 1 個)灼狰,默認每個索引 10 個 shard,5 個 primary shard浮禾,5 個 replica shard交胚。此時為了保證高可用,最小應該配備的 node 是 2 個盈电。
做一個和傳統(tǒng)關(guān)系型數(shù)據(jù)庫的對比:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
es的使用初步體驗
的使用初步體驗
可以說 es 使用相當簡單蝴簇,開箱即用。去官網(wǎng)下載完安裝包后匆帚,執(zhí)行 bin/elasticsearchjik 即可啟動熬词,然后訪問 http://localhost:9200/?pretty
即可返回:
{
"name": "KFKDJEu",
"cluster_name": "elasticsearch",
"cluster_uuid": "h6ZDdUy5R5qUgdpvdS6xDQ",
"version": {
"number": "5.5.0",
"build_hash": "260387d",
"build_date": "2017-06-30T23:16:05.735Z",
"build_snapshot": false,
"lucene_version": "6.6.0"
},
"tagline": "You Know, for Search"
}
去這個
name: node 名稱
cluster_name: 集群名稱(默認的集群名稱就是 elasticsearch)
version.number: 5.5.0,es 版本號
我們可以通過 config/elasticsearch.yml 來修改集群名字吸重。
我們可以下載 kibana 去操作 es互拾,第一個命令:GET _cluster/health
,此處返回的結(jié)果
{
"cluster_name": "elasticsearch",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 1,
"active_shards": 1,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 1,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 50
}
為什么是 yellow嚎幸,因為此時我們理論上應該有 2 個 shard颜矿,一個 primary,一個 replica嫉晶,但是只有一個 node骑疆,replica 和 primary 不能在一個 node 上田篇,所以只有一個 primary 分配了,狀態(tài)是 yellow封断。
幾個狀態(tài)的明確說明:
green:每個索引的 primary shard 和 replica shard 都是 active 狀態(tài)的
yellow:每個索引的 primary shard 都是 active 狀態(tài)的斯辰,但是部分 replica shard 不是 active 狀態(tài),處于不可用的狀態(tài)
red:不是所有索引的 primary shard 都是 active 狀態(tài)的坡疼,部分索引有數(shù)據(jù)丟失了
操作說明
一般操作通過 PUT彬呻,GET,POST柄瑰,DELETE 進行區(qū)分闸氮,然后操作的時候 url 按照 index/type/id 的規(guī)則解釋。
PUT:創(chuàng)建或者覆蓋
GET:查詢
POST:更新
DELETE:刪除
常見查詢說明
1教沾、query string search:直接將產(chǎn)查詢的語句放到query上蒲跨,適合一些簡單場景
2、query DSL:特定的查詢領(lǐng)域特定語言授翻,發(fā)送請求的時候或悲,通過 json body將請求發(fā)送過去,支持復雜的語法
3堪唐、query filter
4巡语、full-text search
5、phrase search
6淮菠、highlight search
更具體的可以查看:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html