1.概念
ES即為了解決原生Lucene使用的不足,優化Lucene的調用方式,並實現了高可用的分布式集群的搜索方案,其第一個版本於2010年2月出現在GitHub上並迅速成為最受歡迎的項目之一。
首先,ES的索引庫管理支持依然是基於Apache Lucene(TM)的開源搜索引擎。
ES也使用Java開發並使用Lucene作為其核心來實現所有索引和搜索的功能,但是它的目的是通過簡單的 RESTful API來隱藏Lucene的復雜性,從而讓全文搜索變得簡單。
ES的核心不在於Lucene,其特點更多的體現為:
分布式的實時文件存儲,每個字段都被索引並可被搜索
分布式的實時分析搜索引擎
可以擴展到上百台服務器,處理PB級結構化或非結構化數據
高度集成化的服務,你的應用可以通過簡單的 RESTful API、各種語言的客戶端甚至命令行與之交互。
2.es區別於lucene
Lucene和ES聯系,區別:項目中為啥使用ES而不用Lucene.
聯系:ElasticSearch封裝了Lucene,讓使用變得更簡單,在高可用上面做得更好。
區別:ElasticSearch除了擁有Lucene所有優點以外,還擁有自己優點.
可用性:支持集群沒有單點故障
擴展性:支持集群擴展
在集群環境使用:
ElasticSearch
搜索引擎服務器,所有項目都統一訪問索引服務器,可以支持在集群環境使用.
Lucene 搜索引擎工具包,必須集成到項目中使用,而在集群環境下,多個服務器都有自己Lucene文件,所以不統一. 不支持在集群環境使用
支持多種語言:ElasticSearch支持很多語言,Lucene支持java
簡單性:ElasticSearch簡單,都是http請求而Lucene復雜,都要調用API執行一大堆操作
一般lucene在中小型項目中使用(但是也能使用es),而ES在大型項目中使用.因為ES支持在集群環境使用,並且自身也支持集群.
3.三大全文
luncene/es/solr
Solr和ES比較:
Solr 利用 Zookeeper 進行分布式管理,支持更多格式的數據(HTML/PDF/CSV),官方提供的功能更多在傳統的搜索應用中表現好於 ES,但實時搜索效率低。
ES自身帶有分布式協調管理功能,但僅支持json文件格式,本身更注重於核心功能,高級功能多有第三方插件提供,在處理實時搜索應用時效率明顯高於 Solr。
4.es的安裝
官方下載地址:https://www.elastic.co/downloads/elasticsearch
安裝運行
修改jvm.options
運行
訪問測試
ES集群已經啟動並且正常運行.
5.客戶端
客戶端可以分為圖形界面客戶端,和代碼客戶端.
輔助管理工具Kibana5
① Kibana5.2.2下載地址:https://www.elastic.co/downloads/kibana
② 解壓並編輯config/kibana.yml,設置elasticsearch.url的值為已啟動的ES
③ 啟動Kibana5 : bin\kibana.bat
④ 默認訪問地址:http://localhost:5601
Discover:可視化查詢分析器
Visualize:統計分析圖表
Dashboard:自定義主面板(添加圖表)
Timelion:Timelion是一個kibana時間序列展示組件(暫時不用)
Dev Tools :Console(同CURL/POSTER,操作ES代碼工具,代碼提示,很方便)
Management:管理索引庫(index)、已保存的搜索和可視化結果(save objects)、設置 kibana 服務器屬性。
啟動運行訪問
6.es的數據管理
--es的文檔
ES是面向文檔(document oriented)的,這意味着它可以存儲整個對象或文檔(document)。然而它不僅僅是存儲,還會索引(index)每個文檔的內容使之可以被搜索。在ES中,你可以對文檔(而非成行成列的數據)進行索引、搜索、排序、過濾。
_index:索引庫,類似於關系型數據庫里的“數據庫”—它是我們存儲和索引關聯數據的地方。
_type:類型,類似於關系型數據庫中表.在應用中,我們使用對象表示一些“事物”,例如一個用戶、一篇博客、一個評論,或者一封郵件。可以是大寫或小寫,不能包含下划線或逗號。我們將使用 employee 做為類型名。
_id:與 _index 和 _type 組合時,就可以在ELasticsearch中唯一標識一個文檔。當創建一個文檔,你可以自定義 _id ,也可以讓Elasticsearch幫你自動生成。
另外還包括:_uid文檔唯一標識(_type#_id)
_source:文檔原始數據
_all:所有字段的連接字符串
--基本操作
添加
PUT dms/emp/1
{
"id":1,
"name":"sss",
"age":13
}
查詢
get dms/emp/_search
自定義id
POST dms/emp/
{
"id":2,
"name":"sss2",
"age":13
}
#2:修改:a:先刪除再插入
PUT crm/emp/1
{
"id":1,
"name":"ads",
"age":18
}
#2:修改:b:局部修改
POST crm/emp/AWmjggiFZPiESvqs-mqR/_update
{
"doc": {
"id":1,
"name":"xxx",
"age":17
}
}
#3:刪除:a:指定一個document刪除
DELETE dms/emp/1
#3:刪除:b:刪除整個索引,刪庫
DELETE dms
# 4:查詢:a:指定一個document的id查詢
GET dms/emp/1
# 4:查詢:b:指定一個document的id查詢,只需要返回數據:source
GET dms/emp/1/_source
# 4:查詢:c:指定一個document的id查詢,只需要返回指定key的數據:只返回source的name的值
GET dms/emp/1/_source?_source=name
#5.1不同索引不同類型的數據
GET _mget
{
"docs":[
{
"_index":"dms",
"_type":"emp",
"_id":"1"
},{
"_index":"dms",
"_type":"emp",
"_id":"2"
}
]
}
#5.2:同一個索引和類型
GET dms/emp/_mget
{
"ids":[1,2,3]
}
#6.1: 查詢所有的索引數據
GET _search
#6.2:指定索引和分類的查詢
GET dms/emp/_search
#size :每頁多少條 默認是10; from:從哪里開始,默認從0開始
GET dms/emp/_search?size=2&from=1
字符串查詢
GET dms/emp/_search?q=age:11
es的查詢:TO必須大寫;多個條件使用&拼接;排序:默認是升序asc
GET dms/emp/_search?q=age[10 TO 13]&sort=id:desc&size=2&from=0
6.dsl查詢與過濾
-- 什么是DSL查詢
由ES提供豐富且靈活的查詢語言叫做DSL查詢(Query DSL),它允許你構建更加復雜、強大的查詢。
DSL(Domain Specific Language特定領域語言)以JSON請求體的形式出現
查詢字符串模式:GET dms/emp/_search?q=name:文兵 簡單查詢
DSL模式: 復雜查詢
GET dms/emp/_search
{
"query" : {
"match" : {
"name" : "sss"
}
}
}
7.分詞與映射
1) 集成合適分詞器-ik
在服務端通過插件集成分詞器
2) 要設置字段的分詞器
通過客戶端告訴es某個字段要使用某個分詞
ES的IK分詞器插件源碼地址:https://github.com/medcl/elasticsearch-analysis-ik