用戶訪問咱們的首頁,通常都會直接搜索來尋找本身想要購買的商品。
而商品的數量很是多,並且分類繁雜。如何能正確的顯示出用戶想要的商品,並進行合理的過濾,儘快促成交易,是搜索系統要研究的核心。
面對這樣複雜的搜索業務和數據量,使用傳統數據庫搜索就顯得力不從心,通常咱們都會使用全文檢索技術,好比以前你們學習過的Solr。
不過今天,咱們要講的是另外一個全文檢索技術:Elasticsearch。html
1.簡介前端
node
Elastic有一條完整的產品線及解決方案:Elasticsearch、Kibana、Logstash等,前面說的三個就是你們常說的ELK技術棧。 git
1.1 github
算法
Elasticsearch和MongoDB/Redis/Memcache同樣,是非關係型數據庫。是一個接近實時的搜索平臺,從索引這個文檔到這個文檔可以被搜索到只有一個輕微的延遲,企業應用定位:採用Restful API標準的可擴展和高可用的實時數據分析的全文搜索工具。
可拓展:支持一主多從且擴容簡易,只要cluster.name一致且在同一個網絡中就能自動加入當前集羣;自己就是開源軟件,也支持不少開源的第三方插件。
高可用:在一個集羣的多個節點中進行分佈式存儲,索引支持shards和複製,即便部分節點down掉,也能自動進行數據恢復和主從切換。
採用RestfulAPI標準:經過http接口使用JSON格式進行操做數據。sql
數據存儲的最小單位是文檔,本質上是一個JSON 文本:docker
數據庫
分佈式,無需人工搭建集羣(solr就須要人爲配置,使用Zookeeper做爲註冊中心)npm
Restful風格,一切API都遵循Rest原則,容易上手
1.2 爲什麼使用elasticSearch
實際項目開發中,幾乎每一個系統都會有一個搜索的功能,數據量少時能夠直接從主數據庫中好比Mysql搜索,但當搜索作到必定程度時,好比系統數據量上了10億、100億條的時候,傳統的關係型數據庫的I/O性能和統計分析性能就難以知足用戶須要了。因此不少公司都會把搜索單獨作成一個獨立的模塊,用ElasticSearch等來實現。雖然內存緩存數據庫的讀寫性能很高,但徹底把數據放在內存中是不太現實的,好比到PB級別的數據,按照每一個節點96G內存計算,在內存徹底裝滿的數據狀況下,須要的機器是:1PB=1024T=1048576G ,節點數就是1048576/96=10922個 ,再考慮到數據備份,節點數還須要翻倍,成本巨大決定了其不現實。
1.3 市場現狀
2013年初,GitHub拋棄了Solr,採起ElasticSearch來作PB級的搜索,包括13億文件和1300億行代碼」。
百度目前普遍使用ElasticSearch做爲文本數據分析,採集百度全部服務器上的各種指標數據及用戶自定義數據,經過對各類數據進行多維分析展現,輔助定位分析實例異常或業務層面異常。目前覆蓋百度內部20多個業務線(包括casio、雲分析、網盟、預測、文庫、直達號、錢包、風控等),單集羣最大100臺機器,200個ES節點,天天導入30TB+數據。
1.4 索引結構
下圖是ElasticSearch的索引結構,下邊黑色部分是物理結構,上邊黃色部分是邏輯結構,邏輯結構也是爲了更好的去描述ElasticSearch的工做原理及去使用物理結構中的索引文件。
邏輯結構部分是一個倒排索引表(根據詞找文章):
一、將要搜索的文檔內容分詞,全部不重複的詞組成分詞列表。
二、將搜索的文檔最終以Document方式存儲起來。
三、每一個詞和docment都有關聯。
注意:正排索引(從文章中找詞)
如今,若是咱們想搜索 quick brown ,咱們只須要查找包含每一個詞條的文檔:
兩個文檔都匹配,可是第一個文檔比第二個匹配度更高。若是咱們使用僅計算匹配詞條數量的簡單類似性算法 ,那麼,咱們能夠說,對於咱們查詢的相關性來說,第一個文檔比第二個文檔更佳。
1.5 RESTful應用方法
Elasticsearch提供 RESTful Api接口進行索引、搜索,而且支持多種客戶端。
下圖是es在項目中的應用方式:
1)用戶在前端搜索關鍵字
2)項目前端經過http方式請求項目服務端
3)項目服務端經過Http RESTful方式請求ES集羣進行搜索
4)ES集羣從索引庫檢索數據。
2.ElasticSearch安裝與配置
(1)安裝配置:
下載ES: Elasticsearch 6.2.1,解壓 elasticsearch-6.2.1.zip
注意:當解壓完成後,文件目錄中是沒有data文件夾的,咱們應該本身手動添加。
bin:腳本目錄,包括:啓動、中止等可執行腳本
config:配置文件目錄
data:索引目錄,存放索引文件的地方
logs:日誌目錄
modules:模塊目錄,包括了es的功能模塊
plugins :插件目錄,es支持插件機制
(2)配置文件
<1>3個配置文件
ES的配置文件的地址根據安裝形式的不一樣而不一樣:
使用zip、tar安裝,配置文件的地址在安裝目錄的config下。
使用RPM安裝,配置文件在/etc/elasticsearch下。
使用MSI安裝,配置文件的地址在安裝目錄的config下,而且會自動將config目錄地址寫入環境變量ES_PATH_CONF。
本教程使用的zip包安裝,配置文件在ES安裝目錄的config下。
配置文件以下:
elasticsearch.yml : 用於配置Elasticsearch運行參數
jvm.options : 用於配置Elasticsearch JVM設置
log4j2.properties: 用於配置Elasticsearch日誌
elasticsearch.yml 配置實例:
cluster.name: leyou
node.name: ly_node_1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
discovery.zen.minimum_master_nodes: 1
node.ingest: true
bootstrap.memory_lock: false
node.max_local_storage_nodes: 2
path.data: E:\toolsoftware\elasticsearch-6.2.1\data
path.logs: E:\toolsoftware\elasticsearch-6.2.1\logs
http.cors.enabled: true
http.cors.allow-origin: /.*/
注意:根據實際安裝目錄,修改path.data和path.logs路徑配置
經常使用的配置項以下:
(3)啓動ElasticSearch
進入bin目錄,在cmd下運行:elasticsearch.bat
能夠打開bin目錄,雙擊elasticSearch.bat文件,啓動ElasticSearch
啓動完成後,訪問http://localhost:9200/
可見以下內容:
(4)head插件安裝
head插件是ES的一個可視化管理插件,用來監視ES的狀態,並經過head客戶端和ES服務進行交互,好比建立映
射、建立索引等,head的項目地址在https://github.com/mobz/elasticsearch-head 。
從ES6.0開始,head插件支持使得node.js運行
安裝步驟:
此時,訪問http://localhost:9100/
注意:若出現問題首先考慮
打開瀏覽器調試工具發現報錯:
Origin null is not allowed by Access-Control-Allow-Origin.
緣由是:head插件做爲客戶端要鏈接ES服務(localhost:9200),此時存在跨域問題,elasticsearch默認不容許跨
域訪問。
解決方案:
設置elasticsearch容許跨域訪問。
在config/elasticsearch.yml 後面增長如下參數:
#開啓cors跨域訪問支持,默認爲false http.cors.enabled: true #跨域訪問容許的域名地址,(容許全部域名)以上使
用正則 http.cors.allow-origin: /.*/
注意:將config/elasticsearch.yml另存爲utf-8編碼格式。
elasticsearch原理介紹:https://www.cnblogs.com/dreamroute/p/8484457.html
Elasticsearch數據庫:https://blog.csdn.net/aisemi/article/details/80212836(首先查看,最有價值)
大白話ElasticSearch是什麼以及應用場景:https://blog.csdn.net/paicmis/article/details/82535018(次推薦瀏覽)
ElasticSearch從入門到精通,史上最全:https://blog.csdn.net/JENREY/article/details/81290535