用ElasticSearch 實現分佈式數據搜索與分析
ElasticSearch簡介
Elasticsearch 是一個開源的搜索引擎,建立在一個全文搜索引擎庫 Apache Lucene™ 基礎之上。 Lucene 可以說是當下最先進、高性能、全功能的搜索引擎庫—無論是開源還是私有。
但是 Lucene 僅僅只是一個庫。爲了充分發揮其功能,你需要使用 Java 並將 Lucene 直接集成到應用程序中。 更糟糕的是,您可能需要獲得信息檢索學位才能瞭解其工作原理。Lucene 非常複雜。
Elasticsearch 也是使用 Java 編寫的,它的內部使用 Lucene 做索引與搜索,但是它的目的是使全文檢索變得簡單, 通過隱藏 Lucene 的複雜性,取而代之的提供一套簡單一致的 RESTful API。
然而,Elasticsearch 不僅僅是 Lucene,並且也不僅僅只是一個全文搜索引擎。 它可以被下面這樣準確的形容:
- 一個分佈式的實時文檔存儲,每個字段 可以被索引與搜索
- 一個分佈式實時分析搜索引擎
- 能勝任上百個服務節點的擴展,並支持 PB 級別的結構化或者非結構化數據
Elasticsearch 將所有的功能打包成一個單獨的服務,這樣你可以通過程序與它提供的簡單的 RESTful API 進行通信, 可以使用自己喜歡的編程語言充當 web 客戶端,甚至可以使用命令行(去充當這個客戶端)。
就 Elasticsearch 而言,起步很簡單。對於初學者來說,它預設了一些適當的默認值,並隱藏了複雜的搜索理論知識。 它開箱即用 。只需最少的理解,你很快就能具有生產力。
隨着你知識的積累,你可以利用 Elasticsearch 更多的高級特性,它的整個引擎是可配置並且靈活的。 從衆多高級特性中,挑選恰當去修飾的 Elasticsearch,使它能解決你本地遇到的問題。
你可以免費下載,使用,修改 Elasticsearch。它在 Apache 2 license 協議下發布的, 這是衆多靈活的開源協議之一。Elasticsearch 的源碼被託管在 Github 上 github.com/elastic/elasticsearch。
主要代表應用案例如下:
- Wikipedia 使用 Elasticsearch 提供帶有高亮片段的全文搜索,還有 search-as-you-type 和 did-you-mean 的建議。
- 衛報 使用 Elasticsearch 將網絡社交數據結合到訪客日誌中,爲它的編輯們提供公衆對於新文章的實時反饋。
- Stack Overflow 將地理位置查詢融入全文檢索中去,並且使用 more-like-this 接口去查找相關的問題和回答。
- GitHub 使用 Elasticsearch 對1300億行代碼進行查詢。
Elasticsearch 不僅僅爲巨頭公司服務。它也幫助了很多初創公司,比如 Datadog 和 Klout, Elasticsearch 幫助他們將想法用原型實現,並轉化爲可擴展的解決方案。Elasticsearch 能運行在你的筆記本電腦上,或者擴展到數百臺服務器上來處理PB級數據。
ElasticSearch 雲上支持免費全部商業版本
目前ElasticSearch 與國內外主流雲提供商阿里雲和騰訊雲有深入合作,免費使用 Elastic 的全部商業功能!立即在阿里雲或騰訊雲上使用 Elastic 的全部商業功能
主要應用業務場景
- 【智能搜索】 智能搜索系統,按主題、專題及時空三個維度,支持專題/批量/時空檢索等能力的智能檢索服務,如網站搜索、附近搜索等
- 【日誌分析】Elasticsearch、Kafka、Logstash、Kibana日誌分析架構,提供強大的搜索、統計、分析及可視化能力。
- 【日誌審計】採集應用系統、數據庫日誌,通過日誌搜索、風險告警、分析報表服務,解決數據盜取、越權訪問、信息泄露問題。
- 【數字警務室】結構化數據檢索:車牌號、時間、經緯度、卡口;向量檢索:人體、人臉、機動車、非機動車。
ElasticSearch安裝及運行
此處將介紹在window、Mac、Linux、docker下的安裝及運行注意事項,在此之前有Elastic的一些常用組件需要了解,包括 Elasticsearch、Kibana、Beats 和 Logstash(也稱爲 ELK Stack)。能夠安全可靠地獲取任何來源、任何格式的數據,然後實時地對數據進行搜索、分析和可視化。
- ElasticSearch 是一個基於 JSON 的分佈式搜索和分析引擎本身;
- Kibana 對 Elasticsearch 數據進行可視化;
- Beats 是一個面向輕量型採集器的平臺,這些採集器可從邊緣機器發送數據。
- Logstash 是動態數據收集管道,擁有可擴展的插件生態系統。
在window下安裝 Elasticsearch及運行
window安裝都比較簡單,下載安裝包,解壓即可;配置一些環境變量ES_HOME(可選),但前提需要安裝jdk1.8及以上;因爲Elasticsearch時由Java開發的;
- 下載Elasticsearch https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.1-windows-x86_64.zip 官方下載最新版本,截止發文時爲7.7.1版本!
- 解壓安裝包後運行
進入軟件目錄bin目錄運行elasticsearch即可
bin/elasticsearch(或bin\elasticsearch.bat在Windows上)
在Mac或Linux下安裝 Elasticsearch及運行
- 下載Elasticsearch for Linux版本並解壓
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.1-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.1-linux-x86_64.tar.gz.sha512
shasum -a 512 -c elasticsearch-7.7.1-linux-x86_64.tar.gz.sha512
tar -xzf elasticsearch-7.7.1-linux-x86_64.tar.gz
cd elasticsearch-7.7.1/
注意:
- shasum 命令爲比較下載的.tar.gz檔案的SHA 和應該輸出的已發佈校驗和 elasticsearch-{version}-linux-x86_64.tar.gz: OK。
- elasticsearch-7.7.1/ 此目錄稱爲$ES_HOME,可以配置系統環境變量;
- 下載Elasticsearch for Mac版本並解壓
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.1-darwin-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.1-darwin-x86_64.tar.gz.sha512
shasum -a 512 -c elasticsearch-7.7.1-darwin-x86_64.tar.gz.sha512
tar -xzf elasticsearch-7.7.1-darwin-x86_64.tar.gz
cd elasticsearch-7.7.1/
- 使用Homebrew在macOS上安裝Elasticsearch
Elastic發佈Homebrew公式,因此您可以使用Homebrew軟件包管理器安裝Elasticsearch 。
- 要使用Homebrew進行安裝,您首先需要點擊Elastic Homebrew存儲庫:
brew tap elastic/tap
- 點擊Elastic Homebrew存儲庫後,可以brew install用來安裝Elasticsearch的默認發行版(要安裝OSS發行版,請指定elastic/tap/elasticsearch-oss):
brew install elastic/tap/elasticsearch-full
在docker下安裝 Elasticsearch及運行
當然使用docker前,你同樣需要先安裝docker服務;這裏就不介紹如何安裝docker篇幅了,請參見我docker相關的文章
- 獲取Elasticsearch鏡像
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.7.1
- docker運行單節點elasticsearch
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.7.1
- 要在Docker中啓動並運行一個三節點的Elasticsearch集羣,可以使用Docker Compose, 創建一個docker-compose.yml文件:
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
ElasticSearch測試
- Linux and macOS運行,如果是window是.\elasticsearch.bat 命令
cd elasticsearch-7.7.1/bin
./elasticsearch
按回車鍵後運行時會出現如下內容,我們由此可以看見我們默認運行的端口號爲9200:
[2020-06-17T18:15:19,148][INFO ][o.e.h.AbstractHttpServerTransport] [summerdeMacBook-Pro.local] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200}
這裏我們通過curl或者瀏覽器訪問測試是否運行成功;
summerdeMacBook-Pro:~ summer$ curl http://127.0.0.1:9200
{
"name" : "summerdeMacBook-Pro.local",
"cluster_name" : "elasticsearch_summer",
"cluster_uuid" : "91Rh9-woQ_yKMWnmNKLGrA",
"version" : {
"number" : "7.7.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
"build_date" : "2020-05-28T16:30:01.040088Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
summerdeMacBook-Pro:~ summer$ curl http://127.0.0.1:9200/_cat/health?v #檢查ES當前運行狀態
- 啓動另外兩個Elasticsearch實例,以便您可以看到典型的多節點集羣的行爲。您需要爲每個節點指定唯一的數據和日誌路徑。
./elasticsearch -Epath.data=data2 -Epath.logs=log2
./elasticsearch -Epath.data=data3 -Epath.logs=log3
常見的CURD命令操作
爲了測試方便,我們還需要安裝一個 Kibana工具,方便可視化操作;Kibana的安裝也很簡單,下載解壓運行即可;
- 下載Kibana for Mac版本
https://artifacts.elastic.co/downloads/kibana/kibana-7.7.1-darwin-x86_64.tar.gz
其他版本鏈接如下:
window版本:https://artifacts.elastic.co/downloads/kibana/kibana-7.7.1-windows-x86_64.zip
Linux版本:https://artifacts.elastic.co/downloads/kibana/kibana-7.7.1-linux-x86_64.tar.gz - 解壓運行bin/kibana即可,我們可以看到運行起來的端口號爲5601
log [11:13:37.475] [info][listening] Server running at http://localhost:5601
log [11:13:37.993] [info][server][Kibana][http] http server running at http://localhost:5601
- 訪問 http://localhost:5601就進入一個可視化界面操作,功能很多很強大,但我們熟悉ElasticSearch基本操作,用Dev Tools即可,如圖所示,可以輸入我們需要了解的命令:
創建文檔:
PUT /customer/user/1
{
"name": "summer"
}
或
PUT /customer/_doc/1
{
"name": "summer"
}
查看文檔
GET /customer/user/1 或 GET /customer/_doc/1
修改文檔
POST /customer/user/1 或 /customer/_doc/1
{
"name": "summer for update"
}
或
POST /customer/_doc/1
{
"name": "summer for update"
}
刪除文檔
DELETE /customer/user/1 或 DELETE /customer/_doc/1
注意以上操作都可以執行成功,但在最新版本中有警告
#! Deprecation: [types removal] Specifying types in document index requests is deprecated, use the typeless endpoints instead (/{index}/_doc/{id}, /{index}/_doc, or /{index}/_create/{id}).
意思是不推薦使用:[類型刪除]不推薦在文檔索引請求中指定類型,建議使用以下方式改用/{index}/_doc/{id}訪問,更多功能介紹期待下一篇,下次見!