Elasticsearch簡介與安裝

搜索

就是在任何場景下,找尋你想要的信息,這個時候,會輸入一段你要搜索的關鍵字,而後就指望找到這個關鍵字相關的有些信息html

垂直搜索

站內搜索node

互聯網搜索

電商網站,招聘網站,新聞網站,各類apppython

IT系統的搜索

OA軟件,辦公自動化軟件,會議管理,日程管理,項目管理,員工管理,搜索「張三」,「張三兒」,「張小三」;有個電商網站,賣家,後臺管理系統,搜索「牙膏」,訂單,「牙膏相關的訂單」linux

數據都是存儲在數據庫裏面的,好比說電商網站的商品信息,招聘網站的職位信息,新聞網站的新聞信息,若是說從技術的角度去考慮,如何實現如說,電商網站內部的搜索功能的話,就能夠考慮,去使用數據庫去進行搜索。git

一、每條記錄的指定字段的文本,可能會很長,好比說「商品描述」字段的長度,有長達數千個,甚至數萬個字符,這個時候,每次都要對每條記錄的全部文本進行掃描,來判斷說,你包不包含我指定的這個關鍵詞(好比說「牙膏」)
二、還不能將搜索詞拆分開來,儘量去搜索更多的符合你的指望的結果,好比輸入「生化機」,就搜索不出來「生化危機」github

用數據庫來實現搜索,是不太靠譜的。一般來講,性能會不好的。算法

Lucene

Lucene是Apache軟件基金會中一個開放源代碼的全文搜索引擎工具包,是一個全文搜索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是爲軟件開發人員提供一個簡單易用的工具包,以方便在目標系統中實現全文檢索的功能,或者是以此爲基礎創建起完整的全文搜索引擎。sql

全文檢索是指計算機索引程序經過掃描文章中的每個詞,對每個詞創建一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程序就根據事先創建的索引進行查找,並將查找的結果反饋給用戶的檢索方式。這個過程相似於經過字典中的檢索字表查字的過程。全文搜索搜索引擎數據庫中的數據。數據庫

倒排索引源於實際應用中須要根據屬性的值來查找記錄。這種索引表中的每一項都包括一個屬性值和具備該屬性值的各記錄的地址因爲不是由記錄來肯定屬性值,而是由屬性值來肯定記錄的位置,於是稱爲倒排索引(inverted index)。帶有倒排索引的文件咱們稱爲倒排索引文件,簡稱倒排文件(inverted file)。倒排索引中的索引對象是文檔或者文檔集合中的單詞等,用來存儲這些單詞在一個文檔或者一組文檔中的存儲位置,是對文檔或者文檔集合的一種最經常使用的索引機制。搜索引擎的關鍵步驟就是創建倒排索引,倒排索引通常表示爲一個關鍵詞,而後是它的頻度(岀現的次數)、位置(出如今哪一篇文章或網頁中,及有關的日期,做者等信息),比如一本書的目錄、標籤通常。讀者想看哪個主題相關的章節,直接根據目錄便可找到相關的頁面。沒必要再從書的第一頁到最後一頁,一頁一頁地查找。npm

評分公式

文檔得分:它是一個刻畫文檔與査詢匹配程度的參數。Apache Lucene的默認評分機制:TF/IDF (詞頻/逆文檔頻率)算法

當一個文檔經Lucene返回,則意味着該文檔與用戶提交的查詢是匹配的。在這種狀況下,每一個返回的文檔都有一個得分。得分越高,文檔相關度更高,同一個文檔針對不一樣查詢的得分是不一樣的,比較某文檔在不一樣查詢中的得分是沒有意義的。同一文檔在不一樣查詢中的得分不具有可比較性,不一樣查詢返回文檔中的最高得分也不具有可比較性。這是由於文檔得分依賴多個因子,除了權重和查詢自己的結構,還包括匹配的詞項數目,詞項所在字段,以及用於查詢規範化的匹配類型等。在一些比較極端的狀況下,同一個文檔在類似查詢中的得分很是懸殊,僅僅是由於使用了自定義得分查詢或者命中詞項數發生了急劇變化。

參考因子

  • 文檔權重(document boost):索引期賦予某個文檔的權重值。
  • 字段權重(field boost):查詢期賦予某個字段的權重值。
  • 協調因子(coord):基於文檔中詞項命中個數的協調因子,一個文檔命中了查詢中的詞項越多,得分越高。
  • 逆文檔頻率(inverse document frequency): —個基於詞項的因子,用來告訴評分公式該詞項有多麼罕見。逆文檔頻率越低,詞項越罕見。評分公式利用該因子爲包含罕見詞項的文檔加權。
  • 長度範數(length nomi):每一個字段的基於詞項個數的歸一化因子(在索引期計算出來並存儲在索引中)。一個字段包含的詞項數越多,該因子的權重越低,這意味着 Apache Lucene評分公式更「喜歡」包含更少詞項的字段。
  • 詞頻(term frequency): —個基於詞項的因子,用來表示一個詞項在某個文檔中出現了多少次。詞頻越高,文檔得分越高。
  • 查詢範數(query norm): —個基於查詢的歸一化因子,它等於查詢中詞項的權重平方和。查詢範數使不一樣查詢的得分能相互比較,儘管這種比較一般是困難且不可行的。

TF/IDF評分公式

上面公式糅合了布爾檢索模型和向量空間檢索模型。想了解更多請百度。

實際公式

得分公式是一個關於査詢q和文檔d的函數,有兩個因子coord和queryNorm並不直接依賴查詢詞項,而是與查詢詞項的一個求和公式相乘。求和公式中每一個加數由如下因子連乘所得:詞頻、逆文檔頻率、詞項權重、範數。範數就是以前提到的長度範數。

基本規則:

  • 越多罕見的詞項被匹配上,文檔得分越高。
  • 文檔字段越短(包含更少的詞項),文檔得分越高。
  • 權重越高(不管是索引期仍是査詢期賦予的權重值),文檔得分越高。

Elasticsearch

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級別的結構化或非結構化數據。

應用場景

國外

  • 維基百科,相似百度百科,牙膏,牙膏的維基百科,全文檢索,高亮,搜索推薦
  • The Guardian(國外新聞網站),相似搜狐新聞,用戶行爲日誌(點擊,瀏覽,收藏,評論)+社交網絡數據(對某某新聞的相關見解),數據分析,給到每篇新聞文章的做者,讓他知道他的文章的公衆反饋(好,壞,熱門,垃圾,鄙視,崇拜)
  • 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熱門的一個使用場景)

特色

  1. 能夠做爲一個大型分佈式集羣(數百臺服務器)技術,處理PB級數據,服務大公司;也能夠運行在單機上,服務小公司
  2. Elasticsearch不是什麼新技術,主要是將全文檢索、數據分析以及分佈式技術,合併在了一塊兒,才造成了獨一無二的ES;lucene(全文檢索),商用的數據分析軟件(BI),分佈式數據庫(mycat)
  3. 對用戶而言,是開箱即用的,很是簡單,做爲中小型的應用,直接3分鐘部署一下ES,就能夠做爲生產環境的系統來使用了,數據量不大,操做不是太複雜
  4. 數據庫的功能面對不少領域是不夠用的(事務,還有各類聯機事務型的操做);特殊的功能,好比全文檢索,同義詞處理,相關度排名,複雜數據分析,海量數據的近實時處理;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臺服務器。

對比

關係型數據庫(好比Mysql) 非關係型數據庫(Elasticsearch)
數據庫Database 索引Index
表Table 類型Type
數據行Row 文檔Document
數據列Column 字段Field
約束 Schema 映射Mapping
HTTP方法 數據處理 說明
POST Create 新增一個沒有ID的資源
GET Read 取得一個資源
PUT Update 更新一個資源。或新增一個含ID的資源(若是1D不存在)
DELETE Delete 刪除一個資源

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
#重啓插件
相關文章
相關標籤/搜索