開源搜尋引擎solr介紹

2021-01-09 新鈦雲服

1 什麼是solr?

「內事不決問百度,外事不決問谷歌」,相信大家對百度、谷歌等搜尋引擎都很熟悉了。網上信息浩瀚萬千,而且毫無秩序,所以搜尋引擎對用戶的作用就體現出來了。

不過,因為商業原因,百度、谷歌等搜尋引擎都不是開源的。但是,大家不用擔心,有閉源的,當然也有開源的搜尋引擎。優秀的開源搜尋引擎有Apache Solr、Elastic Search、Index Tank等等,今天我們主要介紹Apache Solr。

Apache Solr是一個高性能,基於Lucene的全文搜索伺服器。做為一款搜尋引擎,solr不具備爬蟲一樣採集信息的能力,而是專注於信息的存儲和檢索。許多朋友誤認為solr是資料庫,從廣義上講也可認為是資料庫,但是它和傳統意義上的資料庫還是有些區別的。

相信使用過關係型資料庫的朋友們一定都做過搜索的功能,比如:有100條記錄,我想搜索記錄中含有「雲計算」欄位的記錄,可以使用關係型資料庫提供的「模糊搜索」的功能。「模糊搜索」能不能滿足你的要求呢?如果記錄數小,100條、1000條記錄當然沒問題。但是,如果有100萬條、1000萬條甚至上億,那麼「模糊搜索」的效果就會大大折扣。而這時,我們就需要用到solr等搜尋引擎了。

Solr是基於lucene的倒排索引技術(也叫全文索引,mysql等關係型資料庫也有這個概念,但是「術業有專攻」,solr實現的更好),什麼是倒排索引,下面我會做具體介紹。

1.1倒排索引

傳統意義的資料庫,做索引時,都是一個文檔id對應一個或者多個內容欄位。而倒排索引則是一個內容欄位對應多個文檔id。什麼意思呢?舉個例子,假設分別把下面三句話存儲到mysql和solr中:

I like sportsI like readingI like reading books

在mysql中,一個文檔id對應一條記錄,一條記錄中就會有一個或多個內容欄位。比如:文檔id為1,對應「I like sports」;文檔id為2,對應「I like reading」。而在搜索時,就會一條記錄一條記錄的去檢索,比如:我想搜索「books」欄位,就會先從文檔1找起,文檔1沒有,文檔2也沒有,文檔3找到了,好,返回數據。相對來說,這樣效率有點低。

而在solr中,倒排索引就相反了。它會這樣做索引,「I」內容欄位,對應文檔id為1和2;「like」內容欄位,對應文檔id為1和2;「sports」內容欄位,對應文檔id為1;「reading」內容欄位,對應文檔id為2和3;「books」內容欄位,對應文檔id為3,等等。這樣做的好處在哪呢?

比如:我想搜索「like reading books」這句話,我會把這句話分成三個單詞「like」、「reading」、「books」(這在solr中叫分詞,後面會詳細講),這時我開始通過內容欄位查找文檔id。比如我找「like」,文檔id為1、2、3,那麼這三個文檔都可以取出來。然後,我接著找「reading」,這時,文檔id為1的沒有,只剩下2和3了。最後,我找「books」,只剩下文檔id為3的存在了。根據一定的算法,這次搜索結果,會給三個文檔打分,從高到低:文檔3、文檔2、文檔1。返還給用戶優先級,也是3、2、1。

這樣做的好處是:不用按照文檔id,一個一個的遍歷內容欄位了,而是根據多個內容欄位,去找交叉最多的文檔id(當然了,匹配文檔id不止內容欄位交叉,還有時間、權重等因素,方便理解,省略了),這樣做的話,搜索速度立馬上升。

1.2基本操作

Solr是基於Java語言開發的開源搜尋引擎,內部嵌入了jetty,提供了web界面,用戶可以很方便的在web上操作。當然,考慮到穩定性,我沒有使用solr自帶的jetty,而是選擇了tomcat。

1.2.1 下載solr和tomcat

從Apache官網上下載solr和tomcat並解壓到你希望保存的文件夾(我是都保存在「/usr」中的)。然後把「/usr/solr/server/solr-webapp/」下的「webapp」目錄,複製到「/usr/tomcat/server/webapps/」中並改名為「solr」。

在「/usr/tomcat/server/webapps/solr/WEB-INF/」中創建「classes」目錄,並複製「/usr/solr/server/resources/」下的「log4j.properties」文件到「classes」文件夾中;把「/usr/solr/server/lib/ext/」下的所有jar包複製一份到「/usr/tomcat/server/webapps/lib/」目錄中。

1.2.2 配置tomcat的web.xml

該配置文件指定了solr的具體位置,好為tomcat控制solr做準備。文件在「/usr/tomcat/server/webapps/solr/WEB-INF」目錄下:

1.2.3 配置tomcat的log4j.properties

該配置文件在「/usr/tomcat/server/webapps/solr/WEB-INF/classes」目錄下,指定了solr的日誌保存地址:

1.2.4 啟動tomcat

因為我是用tomcat做solr的web容器,所以啟動tomcat,自然也就會把solr也啟動了。啟動tomcat的命令,在tomcat的二進位命令目錄中。進入「/usr/tomcat/server/bin」,執行「./startup.sh」。Tomcat啟動後,在瀏覽器輸入「http://solr伺服器ip:8080/solr/index.html#/」後,就會顯示下圖所示的畫面,表示solr啟動成功。

1.3中文分詞

Solr與mysql一樣,查詢數據之前,需要先插入數據做成索引。做成索引的方式之前已經有過介紹,下面我開始著重講述solr的分詞部分。

Solr提供了許多的方式用來充當索引的數據源,比如傳遞xml數據、json數據給solr,mysql等關係型資料庫,甚至solr還提供了許多程式語言的擴展給用戶,用戶可以直接使用php、python等語言的solr擴展給solr伺服器傳遞數據。這部分solr官網比較詳細,不再細述。

分詞是solr在做索引和查詢的時候,非常重要的一個步驟。比如說,「I like reading books」,這句英文,我們就可以分成四個單詞(內容欄位),「I」、「like」、「reading」、「books」,這很容易,根據空格就能分詞了。我們搜索「books」單詞,可以把solr中的這句話搜索出來。

但是,solr對於中文分詞就不友好了。再舉個例子:「我喜歡讀書」,這句話怎麼分詞,我們人類可以很容易區分,把它分成「我」、「喜歡」、「讀書」或者「我」、「喜歡讀書」;但是,電腦怎麼做,它可不懂怎麼區分中文。上面這句話,它極有可能分成「我喜」、「歡讀」、「書」,或者更離譜的分詞都有可能,但是這樣做就沒意義了。

下面我們就需要引入一款優秀的關於solr的中文分詞器了:IKAnalyzer。它也是java開發的,大致原理:導入一定數量的中文詞語,然後通過詞庫的詞語分詞。比如:我們從一開始,就把「我」、「喜歡」、「讀書」這樣的中文詞語導入到IKAnalyzer中,然後分詞的時候,按照一定的邏輯,遇到「喜歡」就分一個詞,遇到「讀書」就再分一個詞等等。每次產生新的詞語,就重新導入詞庫一次。這樣,中文分詞的問題就大致解決了。

下面簡單說下IKAnalyzer的使用:

在「/usr/tomcat/server/webapps/solr/WEB-INF/classes」下創建「IKAnalyzer.cfg.xml」配置文件:

2. 在同目錄下創建「dict.txt」和「stopword.dic」文件,「dict.txt」是擴展詞庫,「stopword.dic」是停用詞詞庫。

3. 從IKAnalyzer網站下載「ik-analyzer-solr-6.3.0.jar」,並把它放到tomcat的「/usr/tomcat/server/webapps/solr/WEB-INF/lib」,重新啟動tomcat,就可以使用它了。

2 Solrcloud?

Solrcloud是solr的分布式版本,如果要求不高,我們可以只使用solr就足夠了。但是,如果訪問量或者信息量比較大的話,可能就需要升級成solrcloud了。

不過,如果solr想做成分布式的solrcloud,需要有一組件來對不同的solr節點進行控制和保證配置文件一致性。在原有的基礎上,我們需要藉助zookeeper。

Zookeeper是一個開源的分布式協調服務,提供配置維護、域名服務、分布式同步、組服務等功能,非常強大和方便。在solrcloud中通常充當配置維護和分布式同步的功能。整體架構如下圖所示:

2.1 zookeeper配置

在zookeeper的配置文件目錄中,zoo.cfg為其主要配置文件。裡面主要配置了zookeeper的數據文件夾、日誌文件夾以及全部節點的ip和通信埠。另外需要注意的是:如果你修改好zoo.cfg文件,重啟zookeeper之後,zoo.cfg文件會被初始化,之前的zoo.cfg會備份成zoo.cfg.bak。所以,在你關閉zookeeper之後,想要重啟zookeeper之前,你需要刪除zoo.cfg,並且把zoo.cfg.bak改名為zoo.cfg。

修改好zookeeper的配置文件後,去到zookeeper下的bin目錄,啟動zookeeper:「./zkServer.sh start」。

2.2 tomcat引入zookeeper相關信息

進入tomcat的bin目錄,修改「catalina.sh」文件。在「cygwin=false」前面加上以下代碼,這是指定zookeeper的ip和埠號,tomcat開啟前,需要知道zookeeper節點的信息,為solrcloud做準備。再次啟動成功tomcat,整個solrcloud就算啟動成功了。

3總結

由於篇幅有限,對於solr的介紹還只是冰山一角。主要是希望能夠起到拋磚引玉的作用,solr的功能點比如:權重設置、分面查詢、結果高亮、數據導入、各種程式語言的solr擴展等都沒有介紹,以後有機會的話,再與大家一一探討。

相關焦點

  • Apache Solr Velocity模板注入遠程命令執行漏洞
    0x00 前言今天在群裡看到有人說GitHub上公布了一個關於solr的RCE漏洞,於是立馬復現了一波!確定該poc是真實有效的。solr簡介Solr是一個獨立的企業級搜索應用伺服器,它對外提供類似於Web-service的API接口。
  • Java程式設計師必看:Solr vip競價排名
    功能介紹本文將使用solr完成vip等級排名,這裡並不是簡單的按照vip等級排序。而是在使用solr條件查詢(不使用排 序)的時候將符合條件並且具有vip等級的數據顯示在前面,這個時候咱們就要使用solr底層提供的自定義評分 機制來完成。
  • Centos6.5 solr4.5 主從部署文檔
    實現solr主,輔伺服器索引更新同步,每次客戶端COMMIT請求都會及時應用在輔伺服器上。2. 實現multicore,實際生產環境中往往會有多個搜索應用實例。步驟:一、準備條件伺服器準備準備兩臺伺服器:一臺用作主伺服器(192.168.1.243),負責分發索另一臺負責輔伺服器(192.168.1.242),負責承載搜索服務。2.
  • Solr的部署模式詳解
    前言本文介紹的Solr版本:solr-7.7.3部署環境:windowsSolr的兩種部署模式:Solr程序包安裝好後,可以以兩種模式來啟動solr伺服器:Standalone Server 獨立伺服器模式適用於數據規模不大的場景SolrCloud 分布式集群模式
  • Apache Solr 爆遠程執行漏洞,請立即限制對外埠
    漏洞介紹:Velocity Java 模板引擎: Velocity是一個基於Java的模板引擎。它允許任何人使用簡單但功能強大的模板語言來引用Java代碼中定義的對象。該模板引擎用java代碼執行,其基本語法如下:// 變量定義#set($name ="velocity")// 變量賦值#set($foo = $bar)// 函數調用#set($foo ="hello") #set(foo.name=bar.name) #set(foo.name=bar.getName($arg)
  • 搜尋引擎原理介紹-seo網站運營技術
    2、過濾蜘蛛將網頁進行抓取後會將其存入一個原始頁面資料庫中,在這裡搜尋引擎會進行過濾,將欺騙用戶的頁面(文不對題)、死連結頁面(打不開的頁面)、空白頁面(頁面沒內容)、毫無價值的頁面過濾,將這些頁面全部都摒棄掉。而將能夠滿足用戶需求的高質量頁面保留下來。
  • 在開源技術棧,我該如何對大數據查詢引擎做選型?雷達簡圖揭答案
    伴隨著開源軟體的深化發展,今天的查詢系統如果僅支持SQL引擎那就太OUT了,因為數據的膨脹、查詢的複雜度、查詢響應時間、系統訪問並發量等諸多因素,致使我們在查詢引擎的技術選型上必須長遠考慮,構建一個能夠支撐混合查詢負載的生態環境是必須的。
  • 最全的資料庫分類及實例介紹
    下面本文將簡單介紹一下各種類型的數據。關係型資料庫: 這種類型的資料庫是最古老的資料庫類型,關係型資料庫模型是把複雜的數據結構歸結為簡單的二元關係(即二維表格形式), 如圖2是一個二維表的實例。通常該表第一行為欄位名稱,描述該欄位的作用,下面是具體的數據。在定義該表時需要指定欄位的名稱及類型。
  • 什麼是SeetaFace開源人臉識別引擎?
    可是令人尷尬的是,這個領域迄今尚無一套包括所有技術模塊的、完全開源的基準人臉識別系統!我們希望改變現狀,因此開源了SeetaFace人臉識別引擎。該引擎由中科院計算所山世光研究員帶領的人臉識別研究組研發。代碼基於C++實現,且不依賴於任何第三方的庫函數,開源協議為BSD-2,可供學術界和工業界免費使用。
  • solr之http請求查詢記錄兩點
    今天犯了兩個很傻的錯誤,特此記錄一下,避免日後再犯:(1) solr提供http請求相關API:平常通過瀏覽器直接訪問:http://192.168.133.129:8983/solr/#/test/query,輸入查詢條件即可,但是由於request
  • 建議Solr 用戶更新 Apache POI
    Apache Solr 更新 Apache POI 方法:- 下載 Apache POI 3.10.1 二進位版本: - 解壓文件- 刪除 "solr-4.X.X/contrib/extraction/lib" 文件夾的以下文檔: # poi-3.10-beta2.jar # poi-ooxml-3.10-beta2.jar # poi-ooxml-schemas
  • 「分享」國外主流搜尋引擎大全
    國外主流搜尋引擎大全-27個搜尋引擎網站介紹:跟大家說一說有代表性的國外搜尋引擎,小編介紹的下面這些國外搜尋引擎網站大部分不被屏蔽,希望這份搜尋引擎排名對你有用,快來看看你都知道哪些吧!1、Yahoo!
  • 華為全面啟動數據基礎設施戰略,開源數據虛擬化引擎HetuEngine
    11月19日,華為在深圳舉辦2019全球數據基礎設施論壇,面向鯤鵬計算產業, 宣布全面啟動數據基礎設施戰略,並開源數據虛擬化引擎HetuEngine(河圖引擎),希望讓夥伴像使用「資料庫」一樣使用「大數據」,讓數據治理、使用更簡單。
  • 兩位專家詳解TEE聯邦學習與開源向量...
    其中富數科技首席科學家陳立峰的講解主題為《基於TEE增強的聯邦學習與多方安全計算平臺解析》,Zilliz 數據工程師李晴的講解主題為《開源向量相似搜尋引擎Milvus的框架與應用》。數據的隱私問題一直是人們所關心的焦點問題。尤其是工業界來說,隨著對數據安全的重視和隱私保護法案的出臺,以前粗放式的數據共享受到挑戰,各個數據擁有者重新回到數據孤島的狀態。
  • 華為全面啟航計算戰略:「鯤鵬+昇騰」雙引擎、硬體開放、軟體開源...
    HUAWEI CONNECT 2019第二天,華為基於「鯤鵬+昇騰」雙引擎正式全面啟航計算戰略,宣布開源伺服器作業系統、GaussDB OLTP單機版資料庫,開放鯤鵬主板,擁抱多樣性計算時代。華為通過硬體開放、軟體開源、使能合作夥伴,共同開拓萬億級的計算產業大藍海。
  • Jazz公司solriamfetol在美國監管時間表延長3個月
    Jazz製藥公司近日宣布,美國食品和藥物管理局(FDA)已延長了solriamfetol新藥申請(NDA)的審查期限,該藥用於治療成人發作性睡病(伴或不伴猝倒症)或阻塞性睡眠呼吸暫停(OSA),改善和減少白天過度嗜睡(EDS)。更新後的處方藥用戶收費法(PDUFA)目標日期為2019年3月20日。
  • Jazz公司solriamfetol在歐洲進入審查,美國或...
    2018年11月09日訊 /生物谷BIOON/ --Jazz製藥公司近日宣布,已向歐洲藥品管理局(EMA)提交了solriamfetol的上市許可申請(MAA),用於發作性睡病(伴或不伴猝倒症)或阻塞性睡眠呼吸暫停(OSA)成人患者,改善和減少白天過度嗜睡(EDS)。
  • SEO優化上首頁之搜尋引擎原理用戶需求理解
    經過前面《搜尋引擎原理SEO優化上首頁之網絡蜘蛛Spider》和《搜尋引擎原理SEO優化上首頁之內容處理與創建索引》介紹,搜尋引擎已經完成頁面抓取和分析,並把原始頁面、索引等信息存儲在搜尋引擎伺服器的資料庫裡,等待響應用戶查詢。
  • 七牛雲 Niu Talk 數據科學論壇第三期:大數據開發與開源生態
    近日,「七牛雲 Niu Talk 」 數據科學系列論壇第三期如期舉行, 三位嘉賓圍繞大數據開發與開源生態,結合自己多年行業經驗,帶來關於「大數據開發與開源生態」的精彩演講和圓桌對話。