前言:
之前已經(jīng)說過最近正在做數(shù)據(jù)建設(shè)凫佛,爬取數(shù)據(jù)之后經(jīng)過處理,最終導入到ElasticSearch中,并編寫公共接口以提供給后臺進行檢索操作;本來想等把ElasticSearch官方API都看過一遍疟暖,形成思維導圖之后再整理出來,因為熟悉一個工具田柔,它能做到的俐巴,比你知道它能做到的要全面也重要的多,但是整理了兩章之后發(fā)現(xiàn)凯楔,內(nèi)容真的太多了窜骄,這還僅僅只2類。摆屯。所以想還是先把基礎(chǔ)用法記錄下來,先一步步來了糠亩。
ElasticSearch 簡介
Elasticsearch 是一個分布式可擴展的近實時搜索和分析引擎,一個建立在全文搜索引擎 Apache Lucene(TM) 基礎(chǔ)上的搜索引擎.當然 Elasticsearch 并不僅僅是 Lucene 那么簡單虐骑,它不僅包括了全文搜索功能,還可以進行以下工作:
- 分布式實時文件存儲赎线,并將每一個字段都編入索引廷没,使其可以被搜索。
- 實時分析的分布式搜索引擎垂寥。
- 可以擴展到上百臺服務(wù)器颠黎,處理PB級別的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)。
ElasticSearch 安裝
安裝比較簡單滞项,建議練手階段安裝Kibana狭归,安裝步驟參見之前寫的博客:ElasticSearch安裝
基本概念:
- ES是一個近實時的搜索引擎,面向文檔型數(shù)據(jù)庫文判,一條數(shù)據(jù)就對應(yīng)一個文檔过椎,以JSON格式存儲;
- 所有的操作都是通過rest接口實現(xiàn)戏仓,即每一個操作都是向ES發(fā)送要給rest請求
- 支持分布式部署疚宇,node節(jié)點跟slave集群亡鼠;
- shards分片:個人感覺類似于關(guān)系型數(shù)據(jù)庫的分區(qū)分表操作
- replicas副本:類似于傳統(tǒng)數(shù)據(jù)庫的從表了,ES里是針對每個shards而言的副本
例如:創(chuàng)建index默認為shards為5敷待,replicas為1间涵,則意味著總共有10個shards,5個主5個從; - 與傳統(tǒng)關(guān)系型數(shù)據(jù)庫術(shù)語對照表如下:
關(guān)系數(shù)據(jù)庫 ? 數(shù)據(jù)庫 ? 表 ? 行 ? 列(Columns)
Elasticsearch ? 索引(Index) ? 文檔(Docments) ? 字段(Fields)
- 6.x之后ES建議刪除type榜揖,因為按照目前理解的type=table浑厚,但實際上卻并不太一樣,ES里同一個index下的多個type字段類型必須一致根盒;但是傳統(tǒng)數(shù)據(jù)庫中钳幅,一個db里的多個table是可以不一樣的;
具體可看官網(wǎng):刪除type及替代方案
目前6.x語法上也還是支持type炎滞,7.x語法就不支持了敢艰,所以要習慣理解修改后的模式:
Elasticsearch ? 索引(Index) ? 文檔(Docments) ? 字段(Fields)
創(chuàng)建Index(索引)
既然刪除了type,感覺將Index理解為table是不是更加合理些册赛。钠导。
創(chuàng)建Index語法如下:
PUT /userinfo?pretty
{
"mappings": {
"_doc": {
"properties": {
"name": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "fields": {"raw":{"type":"keyword"}}},
"content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" },
"org_type": { "type": "keyword"},
"create_time":{"type":"date", "format": "epoch_second"}
}
}
}
}
如果理解了上面的基本概念的話,這命令看起來應(yīng)該不難理解森瘪,有幾點需要提一下:
-
analyzer牡属、search_analyzer:為該字段配置的分詞器,
- 中文一般使用ik分詞器 包括ik_max_word和ik_smart扼睬,ik_max_word:會將文本做最細粒度的拆分逮栅;盡可能多的拆分出詞語 ,ik_smart:會做最粗粒度的拆分窗宇;已被分出的詞語將不會再次被其它詞語占有
- type為text的不支持排序措伐,統(tǒng)計等操作,如有排序或統(tǒng)計需求军俊,則需在后面加上"fields": {"raw":{"type":"keyword"}}以支持該功能侥加,text 類型的字段,如不指定分詞器粪躬,ES會默認設(shè)置分詞器
- type為date可以指定轉(zhuǎn)換格式担败,epoch_second轉(zhuǎn)換為當前時間的秒數(shù)
這只是簡單常用的創(chuàng)建Index的命令,完整的請點擊Mapping API - ES會根據(jù)值自動創(chuàng)建映射镰官,例如提前,給usetinfo新增一個age字段,可以直接添加即可:
通過GET /userinfo/_mapping命令查看userinfo最新的字段朋魔,可以看到ES默認新增了一個類型為long的age字段岖研。但是一般建議關(guān)鍵字段在創(chuàng)建Index的時候進行指定字段;PUT /userinfo/_doc/1? { "name":"lctest", "age":29 }
{ "userinfo": { "mappings": { "_doc": { "properties": { "age": { "type": "long" }, "content": { "type": "text", "analyzer": "ik_max_word" }, "create_time": { "type": "date", "format": "epoch_second" }, "name": { "type": "text", "fields": { "raw": { "type": "keyword" } }, "analyzer": "ik_max_word" }, "org_type": { "type": "keyword" } } } } } }
修改Index
- ES不支持對索引中已有的字段進行修改,只能添加字段孙援,添加字段有兩種方法害淤,
- 上面提到的,直接賦值拓售,由ES去創(chuàng)建字段窥摄;
- 手動設(shè)置字段,代碼如下:
PUT /userinfo/_mapping/_doc { "properties": { "params": { "type": "nested", "properties": { "update_time":{"type":"date", "format": "epoch_second"} } } } }
刪除Index
//刪除指定索引
DELETE /userinfo
//刪除多個索引
DELETE /index1,index2 或者 DELETE /index*
//刪除所有索引
DELETE /_all 或者 DELETE /*
最基本的索引操作就到此結(jié)束础淤,基本上能滿足簡單的基本需求崭放,下面有一些擴展知識點,可以選擇性的使用
aliases別名
索引別名就像一個快捷方式或軟連接,或者是一個指向鸽凶,都是最終指的同一個東西币砂,別名 帶給我們極大的靈活性,允許我們做下面這些:
- 在運行的集群中可以無縫的從一個索引切換到另一個索引
- 給多個索引分組 (例如玻侥, last_three_months)
- 給索引的一個子集創(chuàng)建 視圖
有兩種方式管理別名: _alias用于單個操作决摧, _aliases用于執(zhí)行多個原子級操作。- 創(chuàng)建別名
POST /_aliases { "actions" : [ { "add" : { "index" : "test1", "alias" : "alias1" } } ] }
- 刪除別名
POST /_aliases { "actions" : [ { "remove" : { "index" : "test1", "alias" : "alias1" } } ] }
- 切換索引
POST /_aliases { "actions" : [ { "remove" : { "index" : "test1", "alias" : "alias1" } }, { "add" : { "index" : "test2", "alias" : "alias1" } } ] }
- 操作單個索引
PUT /{index}/_alias/{name} PUT /logs_201305/_alias/2013
以上便是Index別名的基本常用語法凑兰,完整API詳見Aliases API
常用命令
查看所有索引信息 GET /_cat/indices?v&pretty
查看某個索引信息 GET /{index}
刪除索引單個索引 DELETE /{index}
刪除所有索引 DELETE /_all 或者 DELETE /*
刪除多個索引: DELETE /index1,index2 或者 DELETE /index*
查看索引的映射 GET /{index}/_mapping
查看某個索引的某個類型的映射 GET /{index}/_mapping/{type}
映射添加新字段 PUT /{index}/_mapping/{type}
禁用通配符
為了防止誤操作 掌桩,造成刪庫跑路的情況,建議在elasticsearch.yml 做如下配置:action.destructive_requires_name: true 這個設(shè)置使刪除只限于特定名稱指向的數(shù)據(jù), 而不允許通過指定 _all 或通配符來刪除指定索引庫姑食。你同樣可以通過 Cluster State API 動態(tài)的更新這個設(shè)置波岛。
新手推薦使用Kibana工具,帶命令提示音半,很適合不熟悉命令的初學者则拷,我也一直在用,只是博客的話祟剔,命令的表現(xiàn)形式感覺更好一些