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