就是在任何場景下,找尋你想要的信息,這個時候,會輸入一段你要搜索的關鍵字,而後就指望找到這個關鍵字相關的有些信息html
站內搜索node
電商網站,招聘網站,新聞網站,各類apppython
OA軟件,辦公自動化軟件,會議管理,日程管理,項目管理,員工管理,搜索「張三」,「張三兒」,「張小三」;有個電商網站,賣家,後臺管理系統,搜索「牙膏」,訂單,「牙膏相關的訂單」linux
數據都是存儲在數據庫裏面的,好比說電商網站的商品信息,招聘網站的職位信息,新聞網站的新聞信息,若是說從技術的角度去考慮,如何實現如說,電商網站內部的搜索功能的話,就能夠考慮,去使用數據庫去進行搜索。git
一、每條記錄的指定字段的文本,可能會很長,好比說「商品描述」字段的長度,有長達數千個,甚至數萬個字符,這個時候,每次都要對每條記錄的全部文本進行掃描,來判斷說,你包不包含我指定的這個關鍵詞(好比說「牙膏」)
二、還不能將搜索詞拆分開來,儘量去搜索更多的符合你的指望的結果,好比輸入「生化機」,就搜索不出來「生化危機」github
用數據庫來實現搜索,是不太靠譜的。一般來講,性能會不好的。算法
Lucene是Apache軟件基金會中一個開放源代碼的全文搜索引擎工具包,是一個全文搜索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是爲軟件開發人員提供一個簡單易用的工具包,以方便在目標系統中實現全文檢索的功能,或者是以此爲基礎創建起完整的全文搜索引擎。sql
全文檢索是指計算機索引程序經過掃描文章中的每個詞,對每個詞創建一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程序就根據事先創建的索引進行查找,並將查找的結果反饋給用戶的檢索方式。這個過程相似於經過字典中的檢索字表查字的過程。全文搜索搜索引擎數據庫中的數據。數據庫
倒排索引源於實際應用中須要根據屬性的值來查找記錄。這種索引表中的每一項都包括一個屬性值和具備該屬性值的各記錄的地址因爲不是由記錄來肯定屬性值,而是由屬性值來肯定記錄的位置,於是稱爲倒排索引(inverted index)。帶有倒排索引的文件咱們稱爲倒排索引文件,簡稱倒排文件(inverted file)。倒排索引中的索引對象是文檔或者文檔集合中的單詞等,用來存儲這些單詞在一個文檔或者一組文檔中的存儲位置,是對文檔或者文檔集合的一種最經常使用的索引機制。搜索引擎的關鍵步驟就是創建倒排索引,倒排索引通常表示爲一個關鍵詞,而後是它的頻度(岀現的次數)、位置(出如今哪一篇文章或網頁中,及有關的日期,做者等信息),比如一本書的目錄、標籤通常。讀者想看哪個主題相關的章節,直接根據目錄便可找到相關的頁面。沒必要再從書的第一頁到最後一頁,一頁一頁地查找。npm
文檔得分:它是一個刻畫文檔與査詢匹配程度的參數。Apache Lucene的默認評分機制:TF/IDF (詞頻/逆文檔頻率)算法
當一個文檔經Lucene返回,則意味着該文檔與用戶提交的查詢是匹配的。在這種狀況下,每一個返回的文檔都有一個得分。得分越高,文檔相關度更高,同一個文檔針對不一樣查詢的得分是不一樣的,比較某文檔在不一樣查詢中的得分是沒有意義的。同一文檔在不一樣查詢中的得分不具有可比較性,不一樣查詢返回文檔中的最高得分也不具有可比較性。這是由於文檔得分依賴多個因子,除了權重和查詢自己的結構,還包括匹配的詞項數目,詞項所在字段,以及用於查詢規範化的匹配類型等。在一些比較極端的狀況下,同一個文檔在類似查詢中的得分很是懸殊,僅僅是由於使用了自定義得分查詢或者命中詞項數發生了急劇變化。
上面公式糅合了布爾檢索模型和向量空間檢索模型。想了解更多請百度。
得分公式是一個關於査詢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個文檔的文檔得分。
(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 | 刪除一個資源 |
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 -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
npm install -g grunt-cli
#文件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 -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 #最後一個模塊可能安裝不成功,可是不影響使用。
在/opt/module/elasticsearch-5.2.2/config路徑下修改配置文件elasticsearch.yml,在文件末尾增長 http.cors.enabled: true http.cors.allow-origin: "*" #重啓ElasticSearch #重啓插件