Elastic Stack之搜索引擎基礎
前端
做者:尹正傑 git
版權聲明:原創做品,謝絕轉載!不然將追究法律責任。github
一.搜索引擎概述web
1>.什麼是搜索引擎數據庫
搜索引擎(Search Engine)是指根據必定的策略、運用特定的計算機程序從互聯網上搜集信息,在對信息進行組織和處理後,爲用戶提供檢索服務,將用戶檢索相關的信息展現給用戶的系統。搜索引擎包括全文索引、目錄索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、門戶搜索引擎與免費連接列表等。目前在全球比較出名的2款搜索引擎莫過於Google和baidu啦!同時,咱們站點內部也須要搜索引擎,最多見的好比日誌分析系統。搜索引擎是咱們常見並且通用的需求。apache
簡單的說,搜索引擎是由索引組件和搜索組件兩部分組成。瀏覽器
索引組件是面向數據存儲和索引構建,搜索組件是面向用戶提供搜索功能以及將用戶提供的搜索請求轉換成可用的查詢語句並經過索引完成查詢過程(或搜索過程)。對於搜索引擎來說,有一個著名的索引類型叫作倒排索引。倒排索引的做用主要是經過關鍵詞去查對應文檔的。不像咱們有一個表去找某一行數據。ruby
在索引組件比較出名就是Lucene,對於搜索組件比較出名的就是ElasticSearch,Solr,Nutch,(後二者更偏向於數據獲取組件,尤爲是Nutch,一開始只是網絡爬蟲)。服務器
2>.優秀的開源搜索引擎網絡
在開源領域中,優秀的搜索引擎表明就是Lucene和Sphinx。
Lucene: Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是爲軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此爲基礎創建起完整的全文檢索引擎。 Lucene是一套用於全文檢索和搜尋的開源程式庫,由Apache軟件基金會支持和提供。Lucene提供了一個簡單卻強大的應用程式接口,可以作全文索引和搜尋。在Java開發環境裏Lucene是一個成熟的免費開源工具。就其自己而言,Lucene是當前以及最近幾年最受歡迎的免費Java信息檢索程序庫。人們常常提到信息檢索程序庫,雖然與搜索引擎有關,但不該該將信息檢索程序庫與搜索引擎相混淆。 Sphinx: Sphinx是一個基於SQL的全文檢索引擎,能夠結合MySQL,PostgreSQL作全文搜索,它能夠提供比數據庫自己更專業的搜索功能,使得應用程序更容易實現專業化的全文檢索。Sphinx特別爲一些腳本語言設計搜索API接口,如PHP,Python,Perl,Ruby等,同時爲MySQL也設計了一個存儲引擎插件。Sphinx 單一索引最大可包含1億條記錄,在1千萬條記錄狀況下的查詢速度爲0.x秒(毫秒級)。Sphinx建立索引的速度爲:建立100萬條記錄的索引只需 3~4分鐘,建立1000萬條記錄的索引能夠在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。 Sphinx的主要特性包括:高速索引 (在新款CPU上,近10 MB/秒); 高速搜索 (2-4G的文本量中平均查詢速度不到0.1秒); 高可用性 (單CPU上最大可支持100 GB的文本,100M文檔); 提供良好的相關性排名 支持分佈式搜索; 提供文檔摘要生成; 提供從MySQL內部的插件式存儲引擎上搜索 支持布爾,短語, 和近義詞查詢; 支持每一個文檔多個全文檢索域(默認最大32個); 支持每一個文檔多屬性; 支持斷詞; 支持單字節編碼與UTF-8編碼。
3>.Solr
Lucene本身只是一個庫,不能單獨拿來使用,若要使用它須要對它進行二次開發。若你想使用一套完整的搜索引擎解決方案能夠考慮使用Solr。Solr是爲非開發人員提供的一套解決方案!
Solr是一個獨立的企業級搜索應用服務器,它對外提供相似於Web-service的API接口。用戶能夠經過http請求,向搜索引擎服務器提交必定格式的XML文件,生成索引;也能夠經過Http Get操做提出查找請求,並獲得XML格式的返回結果。可是巧婦難爲無米之炊啊!咱們只有Solr是沒法幫用戶搜索數據的,要想搜索那就得有數據,也就是說你得爲Solr提供數據信息以供搜索。
二.Lucene相關概念
1>.什麼是Lucene
Apache開元項目Lucene,Lucene只是一個索引鏈,它沒有提供任何前端的可用界面。以下圖所示,它能夠幫咱們把獲取到的原始內容構建成文檔,還能作文檔分析,並且還能建立出索引來。換句話說,它自身不獲取文檔且不提供搜索界面。因此咱們能夠所Lucene只是一個開發庫。所以咱們能夠利用Lucene來進行二次開發,咱們只須要把前端頁面寫出來,讓用戶鍵入須要搜索的關鍵字,底層經過Lucene實現文檔搜索,將搜索的結果在經過咱們本身開發的web界面返回給前端用戶,而搜索組件須要構建查詢,進行切詞以便對用戶鍵入的關鍵字進行分析並運行查詢,最終搜索引擎將查詢結果返回給用戶,這個功能已經有開源組件幫咱們實現了,他就是著名的ElasticSearch工具。
Lucene提供了相似傳統關係型數據庫的存儲和查詢能力,可是Lucene沒有肯定的全局模式。換句話說,luncene不像SQL數據庫中的表同樣,須要定義好表才能存儲數據,它的內部文檔存儲無需提早定義好任何結構(咱們稱之爲沒有全局模式的)。
2>.Lucene的基本概念
一.文檔(Document):
文檔是索引和搜索的最原子單位,它包含了一個或者多個域的容器。一個文檔能夠包含一個鍵值對,也能夠包含N個鍵值對,而真正搜索時是搜索的value。
二.域(field):
文檔中包含了大量的鍵值對,那個鍵咱們稱之爲域,沿用了SQL中的叫法,也能夠稱之爲字段。建立域的時候,咱們能夠爲域指定多個選項(索引選項,存儲選項,項向量使用選項)來控制Lucene將文檔添加進域索引後對改域能夠執行哪些操做,這個過程咱們一般稱爲域的分析過程。
索引選項用於經過倒排索引來控制文本是否被搜索:
Index.ANYLYZED:分析(切詞)並單獨做爲索引項(表示要使用分析器將域中的值分解成各個獨立的分詞,而且使得各個分詞都可以被搜索)。
Index.Not_ANYLYZED:和ANYYZED相反,表示不分析(不切詞),把整個內容當作一個索引項。
Index.ANYLYZED_NORMS:相似於Index.ANYLYZED,但不存儲token和Norm(加權基準)信息。
Index.Not_ANYLYZED_NORMS:相似於Index.Not_ANYLYZED,但不存儲值Norm(加權基準)信息。
存儲選項,是否存儲域的真實值:
store.YES:存儲真實值。
store.NO:不存儲真實值。
域向量使用選項:
域向量選項用於在搜索期間該文檔全部的惟一項都能徹底從文檔中檢索時使用。
三.文檔和域的加權操做
須要定義加權計算標準。
3>.Lucene如何執行搜索
查詢Lucene索引時,它返回的是一個有序的scoreDoc對象,查詢時,Luncen會爲每一個文檔計算出其score,然後根據score進行排序。Lucene想要完成查詢功能,它對外提供了大量的API,接下來咱們簡單的瞭解一下:
IndexSearcher:搜索索引入口。
Query及其子類。
QueryParser :查詢分析器。
TopDocs:保存某一次查詢操做當中,分值較高的前10個scoreDoc對象。
scoreDoc:指的是搜索結果。
4>.Lucene的多樣化查詢
咱們知道Lucene的查詢操做最終都是經過調用IndexSearcher來完成搜索的。而IndexSearcher中有一個叫search方法完成搜索。同時完成搜索時還要傳入Query實例做爲參數來進行。 TermQuery: 對索引中的特定域進行搜索。Term是索引中的最小索引片斷,每一個Term包含了一個域名和一個文本值。 TermRangeQuery: 能夠指明域方位能夠在索引中的特定域中進行搜索,能搜索指定的多個域名。 NumericRangeQuery: 作數值範圍搜索。 PrefixQuery: 用來搜索以指定字符串開頭的項。 BooleanQuery: 用來實現組合搜索。組合邏輯有:AND,OR,NOT。 PhraseQuery: 根據位置信息來定位對應文檔的。 WildcardQuery: 能夠結合?或者*來完成通配查詢。 FuzzyQuery: 模糊查詢,Lenvenshtein。
三.ElasticSearch基本概念
1>.什麼是ElasticSearch
ElasticSearch就是基於Lucene的API封裝成了一個搜索組件。可是除了搜索功能之外,ElasticSearch還提供了一些更強大的功能。ElasticSearch在Lucene所提供的API基礎之上又額外新增了把本身構建爲分佈式。換句話說,ElasticSearch可以分佈式的將Lucene所提供的索引組建成Shards的形式,分片分佈於多個節點上,從而構建成分佈式實時查詢組件。
上面咱們用本身的話說了一下ES的概念,接下來咱們用比較官方的話在來講一下ES的概念。ES是一個基於Lucene實現的開源,分佈式,Restful的全文搜索引擎;此外,它仍是一個分佈式實時文檔存儲,其中每一個文檔的每一個field均是被索引的數據,且可被搜索,也是一個帶實時分析功能的分佈式搜索引擎,可以擴展至數以百計的節點實時處理PB級別的數據。
2>.ES的基本組件
索引(index):
文檔容器,換句話說,索引是具備相似屬性的文檔的集合(索引就是一個擁有幾分類似特徵的文檔的集合。)。相似於關係型數據庫中的表。索引名必須使用小寫字母。一個ES能夠建立任意個索引。
類型(type):
類型是索引內部的邏輯分區,其意義徹底取決於用戶需求,一個索引內部可定義一個或多個類型。通常來講,類型就是擁有相同域的文檔的預約義。
文檔(Document):
文檔是Lucene索引和搜索的原子單位(一個文檔是能夠被索引的基礎信息單元。),它包含了一個或多個域(每一個域的組成部分:一個名字,一個或多個值,擁有多個值的域,一般稱爲多值域),是域的容器,基於JSON格式表示。
映射(mapping):
原始內容存儲爲文檔以前須要事先進行分析,例如:切詞,過濾掉某些詞等;映射用於定義此分析機制該如何實現。除此以外,ES還爲映射提供了諸如將域中的內容排序等功能。
3>.ES集羣組件
Cluster: ES的集羣標識爲集羣名稱,早期版本(ES1.x版本)默認是「elasticsearch」,本篇博客安裝的是ES6.5,默認的名稱爲"my-application"。節點就是靠此名字來決定加入到哪一個集羣中。一個節點只能屬於一個集羣。 Node: 運行了單個ES實例的主機即節點。用於存儲數據,參與集羣索引即搜索操做。節點的標識靠節點名。 Shard: 將索引切割成爲物理存儲組件,但每個shard都是一個獨立且完整的索引,建立索引時,ES默認將其分割爲5個shard。固然,用戶也能夠按需自定義。建立完成以後不可修改。shard有兩種類型,即primary shard(主)和replica shard(從) primary shard(主): primary shard用於文檔存儲,每一個新的索引都會自動建立出5個主shard(默認),每一個primary shard都應該有一個副本(replica shard)。另外,到底有幾個副本,用戶是能夠自定義的,能夠支持動態改變。 replica shard(從): replica shard是primary shard的副本,用於冗餘數據及查詢時的負載均衡。
4>.ES Cluster工做過程
啓動是,經過多播(默認)或單播方式在9300/tcp查找同一集羣中的其餘節點(依靠咱們定義的集羣名稱),並與之創建通訊。
集羣中的全部節點會選舉出一個主節點負責管理整個集羣狀態,以及在集羣範圍內決定各shards的分佈式,站在用戶角度而言,每一個都可接受相應用戶的各種需求。
集羣有三種狀態:green,red,yellow。
yellow狀態:
集羣處於修復狀態,一旦啓動修復過程,主節點能夠檢查全部可用shard,並肯定primary shard(若是沒有發現可用的primary shard,就會把replica shard提高爲primary shard,此時replica shard的數量會減小一個,副本不夠時會自動添加)。因此咱們會說,在yellow狀態時,各replica shard均處於未分配模式(也就是說,此時由primary shard負責寫入和讀取,並無讀寫分離,吞吐能力相對較低!)。primary shard將會查找全部的replica shard並將其配置爲副本。當primary shard發現找到可用replica shard少於用於定義的副本數量時,它會自動找一個節點並啓動複製過程直到知足用於定義的副本數量。
red狀態:
集羣處於不可用狀態
green狀態:
集羣處於正常狀態。
5>.ElasticSearch官網 (https://www.elastic.co/)
Elastic官方products鏈接地址:https://www.elastic.co/cn/products。
四.Elastic Stack基本概念
1>.Logstash
咱們知道 ElasticSearch只能完成數據的搜索和存儲功能,而它沒法直接收取數據,所以ElasticSearch一開始收購Logstash這塊產品用來作日誌收集。Logstash是一個開源數據收集引擎,具備實時管道功能。Logstash能夠動態地未來自不一樣數據源的數據統一塊兒來,並將數據標準化到你所選擇的目的地。
Logstash是使用jruby進行開發的。它在使用的時候會很吃內存!爲了分析日誌它可能會用到幾個G的大小,是一個很是重量級的產品。所以,各個公司開始紛紛本身研發日誌收集工具。由於它太笨重了。若是公司的開發人力有限的話一開始就只能使用ELK工具來完成日誌收集分析操做。
2>.beats
剛剛咱們提到了Logstash是很吃內存的,是一個重量級的,所以不少有能力的公司都在開始研發本身的日誌收集工具而摒棄Logstash。如Scribe是facebook開源的日誌收集系統等等,而Elastic 公司也不甘示弱,使用了C++和go語言研發了beats工具(其安裝大小很小!功能也相對齊全),好比收集日誌的可使用filebeat,收集網絡日誌能夠用packagebeat,從Windows事件日誌收集的能夠用eventbeat等等。
3>.kibana
Kibana是一個開源的分析和可視化平臺,設計用於和Elasticsearch一塊兒工做。你用Kibana來搜索,查看,並和存儲在Elasticsearch索引中的數據進行交互。你能夠輕鬆地執行高級數據分析,而且以各類圖標、表格和地圖的形式可視化數據。Kibana使得理解大量數據變得很容易。它簡單的、基於瀏覽器的界面使你可以快速建立和共享動態儀表板,實時顯示Elasticsearch查詢的變化。
4>.Elastic Stack功能劃分
Elasticsearch:
是一個搜索引擎和數據存儲。它可以將客戶端發來的數據進行切詞,分析,存儲並支持檢索。
logstash:
它是一個數據抽取(Extracl),轉換(Transform)和裝入(Load)的工具,簡稱ELT工具。和咱們大數據生態圈的Sqoop角色有着相似的功能。雖說logstash在日誌收集方面被你們擠兌,可是不可否定它還有其餘的優勢。
Kibana: 利用ElasticSearch的API,它能夠實現實時的數據查詢展現等功能。雖然說官方建議將logstash更換爲filebeat工具來實現ETL操做,所以咱們能夠將ELK,換名稱之爲EFK,事實上咱們應該成爲ELFK,而官方給他們起了一個名稱叫作Elastic Stack(翻譯爲:Elastic 工具鏈)。