|
加個(gè)“星標(biāo)”,不忘簽到哦 來(lái)源:http:///Ebgm7sn 最近項(xiàng)目組安排了一個(gè)任務(wù),項(xiàng)目中用到了全文搜索,基于全文搜索 Solr,但是該 Solr 搜索云項(xiàng)目不穩(wěn)定,經(jīng)常查詢(xún)不出來(lái)數(shù)據(jù),需要手動(dòng)全量同步,而且是其他團(tuán)隊(duì)在維護(hù),依賴(lài)性太強(qiáng),導(dǎo)致 Solr 服務(wù)一出問(wèn)題,我們的項(xiàng)目也基本癱瘓,因?yàn)樗械囊蕾?lài)查詢(xún)都無(wú)結(jié)果數(shù)據(jù)了。所以考慮開(kāi)發(fā)一個(gè)適配層,如果 Solr 搜索出問(wèn)題,自動(dòng)切換到新的搜索--ES。 其實(shí)可以通過(guò) Solr 集群或者服務(wù)容錯(cuò)等設(shè)計(jì)來(lái)解決該問(wèn)題。但是先不考慮本身設(shè)計(jì)的合理性,領(lǐng)導(dǎo)需要開(kāi)發(fā),所以我開(kāi)始踏上了搭建 ES 服務(wù)的道路,從零開(kāi)始,因?yàn)橹巴耆珱](méi)接觸過(guò) ES,所以通過(guò)本系列來(lái)記錄下自己的開(kāi)發(fā)過(guò)程。 1. 什么是全文搜索 什么是全文搜索引擎?
從定義中我們已經(jīng)可以大致了解全文檢索的思路了,為了更詳細(xì)的說(shuō)明,我們先從生活中的數(shù)據(jù)說(shuō)起。 我們生活中的數(shù)據(jù)總體分為兩種:結(jié)構(gòu)化數(shù)據(jù) 和 非結(jié)構(gòu)化數(shù)據(jù)。
當(dāng)然有的地方還會(huì)有第三種:半結(jié)構(gòu)化數(shù)據(jù),如XML,HTML等,當(dāng)根據(jù)需要可按結(jié)構(gòu)化數(shù)據(jù)來(lái)處理,也可抽取出純文本按非結(jié)構(gòu)化數(shù)據(jù)來(lái)處理。 根據(jù)兩種數(shù)據(jù)分類(lèi),搜索也相應(yīng)的分為兩種:結(jié)構(gòu)化數(shù)據(jù)搜索和非結(jié)構(gòu)化數(shù)據(jù)搜索。 對(duì)于結(jié)構(gòu)化數(shù)據(jù),我們一般都是可以通過(guò)關(guān)系型數(shù)據(jù)庫(kù)(mysql,oracle等)的 table 的方式存儲(chǔ)和搜索,也可以建立索引。對(duì)于非結(jié)構(gòu)化數(shù)據(jù),也即對(duì)全文數(shù)據(jù)的搜索主要有兩種方法:順序掃描法,全文檢索。 順序掃描:通過(guò)文字名稱(chēng)也可了解到它的大概搜索方式,即按照順序掃描的方式查詢(xún)特定的關(guān)鍵字。例如給你一張報(bào)紙,讓你找到該報(bào)紙中“RNG”的文字在哪些地方出現(xiàn)過(guò)。你肯定需要從頭到尾把報(bào)紙閱讀掃描一遍然后標(biāo)記出關(guān)鍵字在哪些版塊出現(xiàn)過(guò)以及它的出現(xiàn)位置。 這種方式無(wú)疑是最耗時(shí)的最低效的,如果報(bào)紙排版字體小,而且版塊較多甚至有多份報(bào)紙,等你掃描完你的眼睛也差不多了。 全文搜索:對(duì)非結(jié)構(gòu)化數(shù)據(jù)順序掃描很慢,我們是否可以進(jìn)行優(yōu)化?把我們的非結(jié)構(gòu)化數(shù)據(jù)想辦法弄得有一定結(jié)構(gòu)不就行了嗎?將非結(jié)構(gòu)化數(shù)據(jù)中的一部分信息提取出來(lái),重新組織,使其變得有一定結(jié)構(gòu),然后對(duì)此有一定結(jié)構(gòu)的數(shù)據(jù)進(jìn)行搜索,從而達(dá)到搜索相對(duì)較快的目的。這種方式就構(gòu)成了全文檢索的基本思路。這部分從非結(jié)構(gòu)化數(shù)據(jù)中提取出的然后重新組織的信息,我們稱(chēng)之索引。 還以讀報(bào)紙為例,我們想關(guān)注最近英雄聯(lián)盟S8全球總決賽的新聞,假如都是 RNG 的粉絲,如何快速找到 RNG 新聞的報(bào)紙和版塊呢?全文搜索的方式就是,將所有報(bào)紙中所有版塊中關(guān)鍵字進(jìn)行提取,如'EDG','RNG','FW','戰(zhàn)隊(duì)','英雄聯(lián)盟'等。然后對(duì)這些關(guān)鍵字建立索引,通過(guò)索引我們就可以對(duì)應(yīng)到該關(guān)鍵詞出現(xiàn)的報(bào)紙和版塊。注意區(qū)別目錄搜索引擎。 2. 為什么要用全文搜索搜索引擎 之前,有同事問(wèn)我,為什么要用搜索引擎?我們的所有數(shù)據(jù)在數(shù)據(jù)庫(kù)里面都有,而且 Oracle、SQL Server 等數(shù)據(jù)庫(kù)里也能提供查詢(xún)檢索或者聚類(lèi)分析功能,直接通過(guò)數(shù)據(jù)庫(kù)查詢(xún)不就可以了嗎?確實(shí),我們大部分的查詢(xún)功能都可以通過(guò)數(shù)據(jù)庫(kù)查詢(xún)獲得,如果查詢(xún)效率低下,還可以通過(guò)建數(shù)據(jù)庫(kù)索引,優(yōu)化SQL等方式進(jìn)行提升效率,甚至通過(guò)引入緩存來(lái)加快數(shù)據(jù)的返回速度。如果數(shù)據(jù)量更大,就可以分庫(kù)分表來(lái)分擔(dān)查詢(xún)壓力。 那為什么還要全文搜索引擎呢?我們主要從以下幾個(gè)原因分析:
什么時(shí)候使用全文搜索引擎:
3. Lucene,Solr, ElasticSearch ? 現(xiàn)在主流的搜索引擎大概就是:Lucene,Solr,ElasticSearch。 它們的索引建立都是根據(jù)倒排索引的方式生成索引,何謂倒排索引?
3-1 Lucene Lucene是一個(gè)Java全文搜索引擎,完全用Java編寫(xiě)。Lucene不是一個(gè)完整的應(yīng)用程序,而是一個(gè)代碼庫(kù)和API,可以很容易地用于向應(yīng)用程序添加搜索功能。 Lucene通過(guò)簡(jiǎn)單的API提供強(qiáng)大的功能: 可擴(kuò)展的高性能索引
強(qiáng)大,準(zhǔn)確,高效的搜索算法
跨平臺(tái)解決方案
Apache軟件基金會(huì)在Apache軟件基金會(huì)提供的開(kāi)源軟件項(xiàng)目的Apache社區(qū)的支持。 但是Lucene只是一個(gè)框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的學(xué)習(xí)了解,才能明白它是如何運(yùn)行的,熟練運(yùn)用Lucene確實(shí)非常復(fù)雜。 3-2 Solr Apache Solr是一個(gè)基于名為L(zhǎng)ucene的Java庫(kù)構(gòu)建的開(kāi)源搜索平臺(tái)。它以用戶(hù)友好的方式提供Apache Lucene的搜索功能。作為一個(gè)行業(yè)參與者近十年,它是一個(gè)成熟的產(chǎn)品,擁有強(qiáng)大而廣泛的用戶(hù)社區(qū)。它提供分布式索引,復(fù)制,負(fù)載平衡查詢(xún)以及自動(dòng)故障轉(zhuǎn)移和恢復(fù)。如果它被正確部署然后管理得好,它就能夠成為一個(gè)高度可靠,可擴(kuò)展且容錯(cuò)的搜索引擎。很多互聯(lián)網(wǎng)巨頭,如Netflix,eBay,Instagram和亞馬遜(CloudSearch)都使用Solr,因?yàn)樗軌蛩饕退阉鞫鄠€(gè)站點(diǎn)。 主要功能列表包括:
3-3 ElasticSearch Elasticsearch是一個(gè)開(kāi)源(Apache 2許可證),是一個(gè)基于Apache Lucene庫(kù)構(gòu)建的RESTful搜索引擎。 Elasticsearch是在Solr之后幾年推出的。它提供了一個(gè)分布式,多租戶(hù)能力的全文搜索引擎,具有HTTP Web界面(REST)和無(wú)架構(gòu)JSON文檔。Elasticsearch的官方客戶(hù)端庫(kù)提供Java,Groovy,PHP,Ruby,Perl,Python,.NET和Javascript。 分布式搜索引擎包括可以劃分為分片的索引,并且每個(gè)分片可以具有多個(gè)副本。每個(gè)Elasticsearch節(jié)點(diǎn)都可以有一個(gè)或多個(gè)分片,其引擎也可以充當(dāng)協(xié)調(diào)器,將操作委派給正確的分片。 Elasticsearch可通過(guò)近實(shí)時(shí)搜索進(jìn)行擴(kuò)展。其主要功能之一是多租戶(hù)。 主要功能列表包括:
4 Elasticsearch vs. Solr的選擇 由于Lucene的復(fù)雜性,一般很少會(huì)考慮它作為搜索的第一選擇,排除一些公司需要自研搜索框架,底層需要依賴(lài)Lucene。所以這里我們重點(diǎn)分析 Elasticsearch 和 Solr。 Elasticsearch vs. Solr。哪一個(gè)更好?他們有什么不同?你應(yīng)該使用哪一個(gè)? 4-1 歷史比較 Apache Solr是一個(gè)成熟的項(xiàng)目,擁有龐大而活躍的開(kāi)發(fā)和用戶(hù)社區(qū),以及Apache品牌。Solr于2006年首次發(fā)布到開(kāi)源,長(zhǎng)期以來(lái)一直占據(jù)著搜索引擎領(lǐng)域,并且是任何需要搜索功能的人的首選引擎。它的成熟轉(zhuǎn)化為豐富的功能,而不僅僅是簡(jiǎn)單的文本索引和搜索; 如分面,分組,強(qiáng)大的過(guò)濾,可插入的文檔處理,可插入的搜索鏈組件,語(yǔ)言檢測(cè)等。 Solr 在搜索領(lǐng)域占據(jù)了多年的主導(dǎo)地位。然后,在2010年左右,Elasticsearch成為市場(chǎng)上的另一種選擇。那時(shí)候,它遠(yuǎn)沒(méi)有Solr那么穩(wěn)定,沒(méi)有Solr的功能深度,沒(méi)有思想分享,品牌等等。 Elasticsearch雖然很年輕,但它也自己的一些優(yōu)勢(shì),Elasticsearch 建立在更現(xiàn)代的原則上,針對(duì)更現(xiàn)代的用例,并且是為了更容易處理大型索引和高查詢(xún)率而構(gòu)建的。此外,由于它太年輕,沒(méi)有社區(qū)可以合作,它可以自由地向前推進(jìn),而不需要與其他人(用戶(hù)或開(kāi)發(fā)人員)達(dá)成任何共識(shí)或合作,向后兼容,或任何其他更成熟的軟件通常必須處理。 因此,它在Solr之前就公開(kāi)了一些非常受歡迎的功能(例如,接近實(shí)時(shí)搜索,英文:Near Real-Time Search)。從技術(shù)上講,NRT搜索的能力確實(shí)來(lái)自Lucene,它是 Solr 和 Elasticsearch 使用的基礎(chǔ)搜索庫(kù)。具有諷刺意味的是,因?yàn)?nbsp;Elasticsearch 首先公開(kāi)了NRT搜索,所以人們將NRT搜索與Elasticsearch 聯(lián)系在一起,盡管 Solr 和 Lucene 都是同一個(gè) Apache 項(xiàng)目的一部分,因此,人們會(huì)首先期望 Solr 具有如此高要求的功能。 4-2 特征差異比較 這兩個(gè)搜索引擎都是流行的,先進(jìn)的的開(kāi)源搜索引擎。它們都是圍繞核心底層搜索庫(kù) - Lucene構(gòu)建的 - 但它們又是不同的。像所有東西一樣,每個(gè)都有其優(yōu)點(diǎn)和缺點(diǎn),根據(jù)您的需求和期望,每個(gè)都可能更好或更差。Solr和Elasticsearch都在快速發(fā)展,所以,話不多說(shuō),先來(lái)看下它們的差異清單:
另外,我們?cè)趶囊韵聨讉€(gè)方面來(lái)分析下:
5. 總結(jié) 那么,到底是Solr還是Elasticsearch?有時(shí)很難找到明確的答案。無(wú)論您選擇Solr還是Elasticsearch,首先需要了解正確的用例和未來(lái)需求。總結(jié)他們的每個(gè)屬性。 記?。?/span>
總之,兩者都是功能豐富的搜索引擎,只要設(shè)計(jì)和實(shí)現(xiàn)得當(dāng),它們或多或少都能提供相同的性能。本篇文章的總體內(nèi)容大致如下圖,該圖由園友ReyCG精心繪制并提供。 參考:
|
|
|
來(lái)自: liang1234_ > 《搜索引擎》