ElasticSearch安裝于部署
搜索

就是在任何場景下,找尋你想要的信息,這個時候,會輸入一段你要搜索的關鍵字,然后就期望找到這個關鍵字相關的有些信息
垂直搜索
站內搜索
互聯網搜索
電商網站,招聘網站,新聞網站,各種app
IT系統的搜索
OA軟件,辦公自動化軟件,會議管理,日程管理,項目管理,員工管理,搜索“張三”,“張三兒”,“張小三”;有個電商網站,賣家,后臺管理系統,搜索“牙膏”,訂單,“牙膏相關的訂單”
數據都是存儲在數據庫里面的,比如說電商網站的商品信息,招聘網站的職位信息,新聞網站的新聞信息,如果說從技術的角度去考慮,如何實現如說,電商網站內部的搜索功能的話,就可以考慮,去使用數據庫去進行搜索。
1、每條記錄的指定字段的文本,可能會很長,比如說“商品描述”字段的長度,有長達數千個,甚至數萬個字符,這個時候,每次都要對每條記錄的所有文本進行掃描,來判斷說,你包不包含我指定的這個關鍵詞(比如說“牙膏”) 2、還不能將搜索詞拆分開來,盡可能去搜索更多的符合你的期望的結果,比如輸入“生化機”,就搜索不出來“生化危機”
用數據庫來實現搜索,是不太靠譜的。通常來說,性能會很差的。
Lucene
Lucene是Apache軟件基金會中一個開放源代碼的全文搜索引擎工具包,是一個全文搜索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是為軟件開發人員提供一個簡單易用的工具包,以方便在目標系統中實現全文檢索的功能,或者是以此為基礎建立起完整的全文搜索引擎。
全文檢索是指計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程序就根據事先建立的索引進行查找,并將查找的結果反饋給用戶的檢索方式。這個過程類似于通過字典中的檢索字表查字的過程。全文搜索搜索引擎數據庫中的數據。
評分公式
文檔得分:它是一個刻畫文檔與査詢匹配程度的參數。Apache Lucene的默認評分機制:TF/IDF (詞頻/逆文檔頻率)算法
當一個文檔經Lucene返回,則意味著該文檔與用戶提交的查詢是匹配的。在這種情況下,每個返回的文檔都有一個得分。得分越高,文檔相關度更高,同一個文檔針對不同查詢的得分是不同的,比較某文檔在不同查詢中的得分是沒有意義的。同一文檔在不同查詢中的得分不具備可比較性,不同查詢返回文檔中的最高得分也不具備可比較性。這是因為文檔得分依賴多個因子,除了權重和查詢本身的結構,還包括匹配的詞項數目,詞項所在字段,以及用于查詢規范化的匹配類型等。在一些比較極端的情況下,同一個文檔在相似查詢中的得分非常懸殊,僅僅是因為使用了自定義得分查詢或者命中詞項數發生了急劇變化。
文檔權重(document boost):索引期賦予某個文檔的權重值。
字段權重(field boost):查詢期賦予某個字段的權重值。
協調因子(coord):基于文檔中詞項命中個數的協調因子,一個文檔命中了查詢中的詞項越多,得分越高。
逆文檔頻率(inverse document frequency): —個基于詞項的因子,用來告訴評分公式該詞項有多么罕見。逆文檔頻率越低,詞項越罕見。評分公式利用該因子為包含罕見詞項的文檔加權。
長度范數(length nomi):每個字段的基于詞項個數的歸一化因子(在索引期計算出來并存儲在索引中)。一個字段包含的詞項數越多,該因子的權重越低,這意味著 Apache Lucene評分公式更“喜歡”包含更少詞項的字段。
詞頻(term frequency): —個基于詞項的因子,用來表示一個詞項在某個文檔中出現了多少次。詞頻越高,文檔得分越高。
查詢范數(query norm): —個基于查詢的歸一化因子,它等于查詢中詞項的權重平方和。查詢范數使不同查詢的得分能相互比較,盡管這種比較通常是困難且不可行的。
上面公式糅合了布爾檢索模型和向量空間檢索模型。想了解更多請百度。
得分公式是一個關于査詢q和文檔d的函數,有兩個因子coord和queryNorm并不直接依賴查詢詞項,而是與查詢詞項的一個求和公式相乘。求和公式中每個加數由以下因子連乘所得:詞頻、逆文檔頻率、詞項權重、范數。范數就是之前提到的長度范數。
基本規則:
越多罕見的詞項被匹配上,文檔得分越高。
文檔字段越短(包含更少的詞項),文檔得分越高。
權重越高(不論是索引期還是査詢期賦予的權重值),文檔得分越高。
elasticsearch (ES)是一個基于Lucene構建的開源、分布式、RESTful接口全文搜索引擎Elasticsearch還是一個分布式文檔數據庫,其中每個字段均是被索引的數據且可被搜索,它能夠擴展至數以百計的服務器存儲以及處理PB級的數據。它可以在很短的時間內存儲、搜索和分析大量的數據。它通常作為具有復雜搜索場景情況下的核心發動機。Elasticsearch就是為高可用和可擴展而生的。可以通過購置性能更強的服務器來完成,稱為垂直擴展或者向上擴展(Vertical Scale/Scaling Up),或增加更多的服務器來完成,稱為水平擴展或者向外擴展(Horizontal Scale/Scaling Out)盡管ES能夠利用更強勁的硬件,垂直擴展畢竟還是有它的極限。真正的可擴展性來自于水平擴展,通過向集群中添加更多的節點來分擔負載,增加可靠性。在大多數數據庫中,水平擴展通常都需要你對應用進行一次大的重構來利用更多的節點。而ES天生就是分布式的:它知道如何管理多個節點來完成擴展和實現高可用性。這也意味著你的應用不需要做任何的改動。
評分規則
是ElasticSearch使用了Lucene的評分功能,但好在我們可以替換默認的評分算法,ElasticSearch使用了Lucene的評分功 能但不僅限于Lucene的評分功能。用戶可以使用各種不同的查詢類型以精確控制文檔評分的計算(custom_boost_factor 查詢、constant_score 査詢、custom_score 查詢等),還可以通過使用腳本(scripting)來改變文檔得分,還可以使用ElasticSearch 0.90中岀現的二次評分功能,通過在返回文檔集之上執行另外一個查詢,重新計算前N個文檔的文檔得分。
Okapi BM25模型:這是一種基于概率模型的相似度模型,可用于估算文檔與給定査詢匹配的概率。為了在ElasticSearch中使用它,你需要使用該模型的名字,BM25。一般來說,Okapi BM25模型在短文本文檔上的效果最好,因為這種場景中重復詞項對文檔的總體得分損害較大。
隨機偏離(Divergence from randomness)模型:這是一種基于同名概率模型的相似度模型。為了在ElasticSearch中使用它,你需要使用該模型的名字,DFR。一般來說,隨機偏離模型在類似自然語言的文本上效果較好。
基于信息的(Information based)模型:這是最后一個新引人的相似度模型,與隨機偏離模型類似。為了在ElasticSearch中使用它,你需要使用該模型的名字,IB。同樣,IB模型也在類似自然語言的文本上擁有較好的效果。
用途
分布式實時文件存儲,并將每一個字段都編入索引,使其可以被搜索。
實時分析的分布式搜索引擎。
可以擴展到上百臺服務器,處理PB級別的結構化或非結構化數據。
應用場景
維基百科,類似百度百科,牙膏,牙膏的維基百科,全文檢索,高亮,搜索推薦
Stack Overflow(國外的程序異常討論論壇),IT問題,程序的報錯,提交上去,有人會跟你討論和回答,全文檢索,搜索相關問題和答案,程序報錯了,就會將報錯信息粘貼到里面去,搜索有沒有對應的答案
GitHub(開源代碼管理),搜索上千億行代碼
電商網站,檢索商品
日志數據分析,logstash采集日志,ES進行復雜的數據分析(ELK技術,elasticsearch+logstash+kibana)
商品價格監控網站,用戶設定某商品的價格閾值,當低于該閾值的時候,發送通知消息給用戶,比如說訂閱牙膏的監控,如果高露潔牙膏的家庭套裝低于50塊錢,就通知我,我就去買
BI系統,商業智能,Business Intelligence。比如說有個大型商場集團,BI,分析一下某某區域最近3年的用戶消費金額的趨勢以及用戶群體的組成構成,產出相關的數張報表,**區,最近3年,每年消費金額呈現100%的增長,而且用戶群體85%是高級白領,開一個新商場。ES執行數據分析和挖掘,Kibana進行數據可視化
國內:站內搜索(電商,招聘,門戶,等等),IT系統搜索(OA,CRM,ERP,等等),數據分析(ES熱門的一個使用場景)
特點
可以作為一個大型分布式集群(數百臺服務器)技術,處理PB級數據,服務大公司;也可以運行在單機上,服務小公司
Elasticsearch不是什么新技術,主要是將全文檢索、數據分析以及分布式技術,合并在了一起,才形成了獨一無二的ES;lucene(全文檢索),商用的數據分析軟件(BI),分布式數據庫(mycat)
對用戶而言,是開箱即用的,非常簡單,作為中小型的應用,直接3分鐘部署一下ES,就可以作為生產環境的系統來使用了,數據量不大,操作不是太復雜
數據庫的功能面對很多領域是不夠用的(事務,還有各種聯機事務型的操作);特殊的功能,比如全文檢索,同義詞處理,相關度排名,復雜數據分析,海量數據的近實時處理;Elasticsearch作為傳統數據庫的一個補充,提供了數據庫所不不能提供的很多功能
核心概念
(1)Near Realtime(NRT):近實時,兩個意思,從寫入數據到數據可以被搜索到有一個小延遲(大概1秒);基于es執行搜索和分析可以達到秒級
(2)Cluster:集群,包含多個節點,每個節點屬于哪個集群是通過一個配置(集群名稱,默認是elasticsearch)來決定的,對于中小型應用來說,剛開始一個集群就一個節點很正常 (3)Node:節點,集群中的一個節點,節點也有一個名稱(默認是隨機分配的),節點名稱很重要(在執行運維管理操作的時候),默認節點會去加入一個名稱為“elasticsearch”的集群,如果直接啟動一堆節點,那么它們會自動組成一個elasticsearch集群,當然一個節點也可以組成一個elasticsearch集群
(4)Document&field:文檔,es中的最小數據單元,一個document可以是一條客戶數據,一條商品分類數據,一條訂單數據,通常用JSON數據結構表示,每個index下的type中,都可以去存儲多個document。一個document里面有多個field,每個field就是一個數據字段。
#product document
{
"product_id": "1",
"product_name": "高露潔牙膏",
"product_desc": "高效美白",
"category_id": "2",
"category_name": "日化用品"
}
(5)Index:索引,包含一堆有相似結構的文檔數據,比如可以有一個客戶索引,商品分類索引,訂單索引,索引有一個名稱。一個index包含很多document,一個index就代表了一類類似的或者相同的document。比如說建立一個product index,商品索引,里面可能就存放了所有的商品數據,所有的商品document。 (6)Type:類型,每個索引里都可以有一個或多個type,type是index中的一個邏輯數據分類,一個type下的document,都有相同的field,比如博客系統,有一個索引,可以定義用戶數據type,博客數據type,評論數據type。
商品index,里面存放了所有的商品數據,商品document
但是商品分很多種類,每個種類的document的field可能不太一樣,比如說電器商品,可能還包含一些諸如售后時間范圍這樣的特殊field;生鮮商品,還包含一些諸如生鮮保質期之類的特殊field
type,日化商品type,電器商品type,生鮮商品type
日化商品type:product_id,product_name,product_desc,category_id,category_name 電器商品type:product_id,product_name,product_desc,category_id,category_name,service_period 生鮮商品type:product_id,product_name,product_desc,category_id,category_name,eat_period
#每一個type里面,都會包含一堆document
{
"product_id": "2",
"product_name": "長虹電視機",
"product_desc": "4k高清",
"category_id": "3",
"category_name": "電器",
"service_period": "1年"
}
{
"product_id": "3",
"product_name": "基圍蝦",
"product_desc": "純天然,冰島產",
"category_id": "4",
"category_name": "生鮮",
"eat_period": "7天"
}
(7)shard:單臺機器無法存儲大量數據,es可以將一個索引中的數據切分為多個shard,分布在多臺服務器上存儲。有了shard就可以橫向擴展,存儲更多數據,讓搜索和分析等操作分布到多臺服務器上去執行,提升吞吐量和性能。每個shard都是一個lucene index。 (8)replica:任何一個服務器隨時可能故障或宕機,此時shard可能就會丟失,因此可以為每個shard創建多個replica副本。replica可以在shard故障時提供備用服務,保證數據不丟失,多個replica還可以提升搜索操作的吞吐量和性能。primary shard(建立索引時一次設置,不能修改,默認5個),replica shard(隨時修改數量,默認1個),默認每個索引10個shard,5個primary shard,5個replica shard,最小的高可用配置,是2臺服務器。
對比
ES安裝
Elasticsearch官網: https://www.elastic.co/products/elasticsearch
1)解壓elasticsearch-5.2.2.tar.gz到/opt/module目錄下
tar -zxvf elasticsearch-5.2.2.tar.gz -C /opt/module/
2)在/opt/module/elasticsearch-5.2.2路徑下創建data和logs文件夾
mkdir data
mkdir logs
3)修改配置文件/opt/module/elasticsearch-5.2.2/config/elasticsearch.yml
# ---------------------------------- Cluster -----------------------------------
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
node.name: node-102
# ----------------------------------- Paths ------------------------------------
path.data: /opt/module/elasticsearch-5.2.2/data
path.logs: /opt/module/elasticsearch-5.2.2/logs
# ----------------------------------- Memory -----------------------------------
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# ---------------------------------- Network -----------------------------------
network.host: 192.168.1.11 ? #自己ip
# --------------------------------- Discovery ----------------------------------
discovery.zen.ping.unicast.hosts: ["elasticsearch"] #自己主機名
#注意
(1)cluster.name如果要配置集群需要兩個節點上的elasticsearch配置的cluster.name相同,都啟動可以自動組成集群,這里如果不改cluster.name則默認是cluster.name=my-application,
(2)nodename隨意取但是集群內的各節點不能相同
(3)修改后的每行前面不能有空格,修改后的“:”后面必須有一個空格
4)配置Linux系統
切換到root用戶,
#編輯/etc/security/limits.conf添加類似如下內容
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
#編輯 /etc/security/limits.d/90-nproc.conf
* soft nproc 1024
#修改為
* soft nproc 4096
#編輯 vi /etc/sysctl.conf
vm.max_map_count=655360
fs.file-max=655360
sysctl -p
重新啟動elasticsearch,即可啟動成功。
#測試集群
curl http://elasticsearch:9200
{
"name" : "node-1",
"cluster_name" : "my-application",
"cluster_uuid" : "mdLmu1rOS7qPNfToNOXzKA",
"version" : {
"number" : "5.2.2",
"build_hash" : "f9d9b74",
"build_date" : "2017-02-24T17:26:45.835Z",
"build_snapshot" : false,
"lucene_version" : "6.4.1"
},
"tagline" : "You Know, for Search"
}
插件安裝
下載插件
https://github.com/mobz/elasticsearch-head ? ? ? ? ? ? ? ? ?elasticsearch-head-master.zip
https://nodejs.org/dist/ ? ? ? ? ? ?node-v6.9.2-linux-x64.tar.xz
安裝環境
tar -zxvf node-v6.9.2-linux-x64.tar.gz -C ? ? /opt/module/
vi /etc/profile
export NODE_HOME=/opt/module/node-v6.9.2-linux-x64
export PATH=$PATH:$NODE_HOME/bin
source /etc/profile
node和npm
node -v
v6.9.2
npm -v
3.10.9
插件配置
unzip elasticsearch-head-master.zip -d /opt/module/
換源
npm config set registry https://registry.npm.taobao.org
npm config list / npm config get registery ?#檢查是否替換成功
安裝插件
npm install -g cnpm --registry=https://registry.npm.taobao.org
安裝grunt:
npm install -g grunt-cli
編輯Gruntfile.js
#文件93行添加hostname:'0.0.0.0'
options: {
hostname:'0.0.0.0',
port: 9100,
base: '.',
keepalive: true
}
檢查
#檢查head根目錄下是否存在base文件夾
#沒有:將 _site下的base文件夾及其內容復制到head根目錄下
mkdir base
cp base/* ../base/
啟動grunt server:
grunt server -d
#如果提示grunt的模塊沒有安裝:
Local Npm module “grunt-contrib-clean” not found. Is it installed?
Local Npm module “grunt-contrib-concat” not found. Is it installed?
Local Npm module “grunt-contrib-watch” not found. Is it installed?
Local Npm module “grunt-contrib-connect” not found. Is it installed?
Local Npm module “grunt-contrib-copy” not found. Is it installed?
Local Npm module “grunt-contrib-jasmine” not found. Is it installed?
Warning: Task “connect:server” not found. Use –force to continue.
#執行以下命令:
npm install grunt-contrib-clean -registry=https://registry.npm.taobao.org
npm install grunt-contrib-concat -registry=https://registry.npm.taobao.org
npm install grunt-contrib-watch -registry=https://registry.npm.taobao.org
npm install grunt-contrib-connect -registry=https://registry.npm.taobao.org
npm install grunt-contrib-copy -registry=https://registry.npm.taobao.org
npm install grunt-contrib-jasmine -registry=https://registry.npm.taobao.org
#最后一個模塊可能安裝不成功,但是不影響使用。
Web訪問
集群無法訪問
在/opt/module/elasticsearch-5.2.2/config路徑下修改配置文件elasticsearch.yml,在文件末尾增加
http.cors.enabled: true
http.cors.allow-origin: "*"
#重啟ElasticSearch
#重啟插件
云搜索服務 CSS Elasticsearch
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。