究竟什么是搜索引擎?正式介紹XunSearch啥?還要單獨(dú)講一下啥是搜索引擎?不就是百度、Google嘛,這玩意天天用,還輪的到你來說? 額,好吧,雖然大家天天都在用,但是我發(fā)現(xiàn),其實(shí)很多人對(duì)搜索引擎并不是特別了解,更別提搜索引擎開發(fā)了。不信?那么咱們就一步一步來看。 搜索引擎上來先官方,看看百科中對(duì)搜索引擎的定義。
嗯,一堆沒啥用的概念。但我們能從中看到,搜索引擎是根據(jù)策略,也就是根據(jù)我們的搜索關(guān)鍵詞,以最快的速度返回匹配度最高的信息。然后包括全文檢索、垂直搜索這兩個(gè)重要的類型,我們?nèi)粘i_發(fā)中,需要開發(fā)的也正是這類搜索引擎。 通常來說,在數(shù)據(jù)庫中,如果數(shù)據(jù)量不大,其實(shí)通過 like 就可以實(shí)現(xiàn)模糊匹配。這就是一種搜索實(shí)現(xiàn),只不過,like 如果是前后都有 % 的,就走不了索引,數(shù)據(jù)庫引擎需要對(duì)每一條數(shù)據(jù)的每一個(gè)字段里面的內(nèi)容進(jìn)行全部的單詞匹配。如果數(shù)據(jù)量大了,那么效果可想而知。特別是如果是針對(duì)大型的文章、文獻(xiàn),本身字段的內(nèi)容也非常長(zhǎng),這樣匹配就更費(fèi)勁了。 而搜索引擎,一般會(huì)采用倒排索引,能夠大大提升詞組的匹配效率,進(jìn)而提升查詢速度。關(guān)于倒排索引的概念我們會(huì)在后面再說。 既然提到了倒排索引,那么就要牽涉出另一個(gè)詞匯,那就是分詞。很多人會(huì)把搜索引擎的搜索功能和 like 混淆,這一點(diǎn)一定要搞清楚,如果不搞清楚,就會(huì)出現(xiàn)一個(gè)很大的誤區(qū)。劃重點(diǎn)了,分詞+倒排索引,和 like 匹配,完全不是一個(gè)東西。 搜索引擎概念在學(xué)習(xí)搜索引擎開發(fā)前,我們需要了解一些概念性的內(nèi)容。
雖說不全面,但上面幾點(diǎn)內(nèi)容應(yīng)該是比較重要的方面。其中索引、分詞、排序、評(píng)分等內(nèi)容我們后面還會(huì)有更詳細(xì)的學(xué)習(xí)。今天我們先來了解一下引擎和框架。 XunSearch 和 XapianXunSearch 中文名是 迅搜 ,國人大佬開發(fā),提供完整的 PHP SDK 組件。 不是說好了是學(xué)習(xí) XunSearch 嘛?Xapian 是什么鬼?這個(gè)呀,其實(shí)用 ElasticSearch 和 Lucene 來解釋就很清楚了。要說搜索引擎組件中的老大,ElasticSearch 可謂是一騎絕塵。如果你之前學(xué)習(xí)過 ES 相關(guān)的內(nèi)容,那么 XS (后面我們就都用 XS 來指代 XunSearch 啦,就和 ES 一樣)的內(nèi)容學(xué)習(xí)就非常輕松了。如果你沒有學(xué)習(xí)過 ES ,那也沒關(guān)系,但希望你學(xué)習(xí)完我的 XS 系列之后,再去好好學(xué)習(xí)一下 ES ,因?yàn)橛行〇|西 XS 真的是沒有的,而且有些有的東西和 ES 也是沒法比的。但搜索引擎的基本概念都是相通的,而且 XS 也有自身的優(yōu)勢(shì)。我們下一節(jié)也會(huì)說這些搜索引擎的選型以及優(yōu)劣。 好了,話說回來。Lucene 是 Java 實(shí)現(xiàn)的一個(gè)搜索引擎,非常強(qiáng)大,也非常出名,但是呢,不好用。就是比較偏底層,就像是一個(gè) JDK 或者說是原生寫法去開發(fā) PHP 應(yīng)用。而 ES 則是構(gòu)建在 Lucene 之上的,提供了各種方便使用的功能以及強(qiáng)大的 RESTFul 接口,能夠方便地使用,就像是 Java 語言或者說是使用框架來開發(fā) PHP 應(yīng)用。Lucene 和 ES 的作者是同一個(gè)人。 同理,Xapian 正是我們 XS 的底層框架,XS 是建立在其之上的,通過封裝提供了現(xiàn)成的 PHP SDK 能夠讓我們非常方便地使用。除了 Xapian 之外,XS 還一道封裝好了 hightman 大佬開發(fā)的中文 SCWS 分詞器。相當(dāng)于一個(gè) XS 就是 Xapina+SCWS+PHP SDK 的組合。是的,你沒猜錯(cuò),XS 也是 hightman 大佬開發(fā)的,而且到現(xiàn)在也一直在更新,最重要的是,這是咱們國人的,面向中文的優(yōu)秀搜索引擎解決方案哦,感謝大神前輩的努力和奉獻(xiàn)。 那么 ES 上有分詞器嘛?老外開發(fā)的肯定是英文分詞沒問題啦。如果要使用中文的話,需要自己安裝 IK 分詞器或者其它分詞器插件,不過 ES 的插件安裝非常簡(jiǎn)單,其實(shí)也沒啥難度。這里還需要注意的是一點(diǎn)是,即使是英文,所有的搜索引擎也會(huì)統(tǒng)一以小寫建立索引,也就是說,搜索引擎是不區(qū)分大小寫的,統(tǒng)一都是小寫。 好了,這下應(yīng)該清楚了吧,我們要學(xué)習(xí)的核心內(nèi)容都有哪些。
現(xiàn)在知道為什么上篇文章中我會(huì)說咱們這一套文章和視頻可能會(huì)是全網(wǎng)唯一了,因?yàn)樵蹅儾恢恢v XS 的使用,還要簡(jiǎn)單地學(xué)習(xí)一下 SCWS 和 Xapian ,并且通過這些再順道一起學(xué)習(xí)搜索引擎相關(guān)的一些基礎(chǔ)知識(shí)。當(dāng)然,重點(diǎn)的核心內(nèi)容肯定還是 XS 的使用咯,也就是我最擅長(zhǎng)的帶著大家一起刷文檔啦! 搜索引擎選型搜索引擎工具非常多,比如在 DBEngines 上,就能看到很多很多種。 ES 一騎絕塵這說法沒毛病吧,所以我說,如果你之前學(xué)習(xí)過一點(diǎn) ES ,那么看這個(gè)系列沒啥壓力,如果你沒有學(xué)習(xí)過,那么學(xué)完 XS 后也最好再去看看。ES 最強(qiáng)大的部分在于天然分布式、性能強(qiáng)悍,現(xiàn)在也是大數(shù)據(jù)的標(biāo)配了,上億數(shù)據(jù)量輕松拿捏,更重要的是,它的生態(tài)好,社區(qū)活躍,這一點(diǎn)很重要。 除了 ES 之外,我略微了解過的還有 Solr 和 Sphinx ,其它的就不太清楚了。因此,我就主要對(duì)比這四個(gè),大部分資料也是網(wǎng)上找到的。
好了,這些對(duì)比是不是客觀全面我也不知道,反正也是網(wǎng)絡(luò)上收集來的,不過大部分的對(duì)比文章都會(huì)提到這些。我們?cè)倌?XS 和 ES 來總結(jié)一下,因?yàn)槲腋扑]的,就是只學(xué)這兩個(gè)就可以了。 XS:簡(jiǎn)單好上手,中文分詞友好,國人開發(fā),文檔齊備,部署方便,快速上線。唯一缺憾,沒有地理空間索引,O2O相關(guān)的項(xiàng)目就不要考慮了。 ES:強(qiáng)大,排名無人可匹敵,天然分布式支持,能玩大數(shù)據(jù)的,知識(shí)體系更為龐大,除了搜索之外還有聚合計(jì)算以及分析能力,生態(tài)健全也更活躍。 為什么只推薦學(xué)習(xí)這兩個(gè)呢?
怎么感覺說完這一節(jié),更想去學(xué) ES 了,哈哈哈哈! 好吧,咱們還是要以 XS 為主哦,不過在學(xué)習(xí)過程中,我們?cè)谛枰鰧?duì)比的時(shí)候,也會(huì)直接使用 ES 來進(jìn)行對(duì)比。比如馬上我們就會(huì)說一下問題。 搜索引擎真的不是 like上一篇文章中,我們搭起了應(yīng)用環(huán)境,也插入了一些測(cè)試數(shù)據(jù),不知道大家有沒有測(cè)試給出的那些查詢語句的結(jié)果。其中有一條是這樣的。 小伙伴們測(cè)了沒?是不是查不出東西呀! 跟你說,查不出來就對(duì)了,用 ES 也查不出來。如果你學(xué)過 ES ,那么在 Kibana 中使用下面的 ES 命令建立索引并插入數(shù)據(jù)來進(jìn)行測(cè)試。(如果沒學(xué)過的話就等視頻哈,在視頻里我也會(huì)演示) 第一個(gè) mappings 就是 ES 中的索引映射,就相當(dāng)于表結(jié)構(gòu)。我們針對(duì) subject 和 message 使用了 IK 分詞器來作為分詞器。在 XS 中我們沒有這個(gè)呀?不不不,有的,我們后面會(huì)看到,XS 自帶的測(cè)試 demo 的結(jié)構(gòu)就是和這個(gè)一樣的。然后插入同樣的三條數(shù)據(jù)。接下來進(jìn)行查詢測(cè)試。 不出意外的話,第一個(gè)查詢和我們?cè)?XS 中的查詢結(jié)果是一樣的,第二條則也同樣查不到任何數(shù)據(jù)。 為什么呢?因?yàn)榉衷~,重點(diǎn)說三遍,分詞分詞分詞,索引索引索引?!绊?xiàng)”按正常的分詞器,不管是 IK 還是 SCWS ,都不會(huì)當(dāng)成一個(gè)單詞,也就不會(huì)為它建立倒排索引,這樣就無法查詢到。 而 like 語句的原理,是針對(duì)字段里的值逐一匹配,ES 中有類似的 wildcard 功能,但如果數(shù)據(jù)量非常大的情況下,使用 非前綴匹配的 wildcard 也會(huì)同樣帶來性能問題,因?yàn)樗秃?MySQL 中使用 like 一樣了,沒法用到索引。XS 中沒有類似的功能,XS 是完全的全文分詞檢索。 為啥要單獨(dú)說這個(gè)?因?yàn)楹芏嗳耍谘杆训墓倬W(wǎng)以及 Github 的 issue 中,都會(huì)不分青紅皂白的上來就是說搜得不準(zhǔn),啥都搜不出來什么的。說實(shí)話,沒有系統(tǒng)學(xué)習(xí)搜索引擎相關(guān)的知識(shí)前,我也不知道,我也以為它就是和 like 一樣。為啥一個(gè)“項(xiàng)”字就搜不出來東西了?真是垃圾。 照這么說的話,ES 可能也得劃到垃圾的范圍中了。那么可以像類似于 like 一樣去搜索嗎?可以,但是不推薦,等到后面學(xué)習(xí)分詞相關(guān)的知識(shí)時(shí),我們會(huì)回來解決這個(gè)問題。 今天,我們先拋出問題,接下來的文章中咱們就一一學(xué)習(xí)全文檢索、倒排索引、分詞、文檔、詞頻排序等等這一大堆的概念。 總結(jié)今天的內(nèi)容還好吧,比較概念,后面也還有一篇概念性的內(nèi)容,主要就是倒排索引和分詞的概念。完了之后才會(huì)開始正式的 XS 的應(yīng)用學(xué)習(xí),并在其中再穿插其它概念性的內(nèi)容。沒辦法,我也想直接全部都在 XS 的學(xué)習(xí)過程中穿插概念性的內(nèi)容,但是在搜索引擎中,索引和分詞的概念確實(shí)是要提前說明的,就像上面的例子一樣,否則大家就會(huì)一直在疑惑為啥總是搜索不到想要的東西。 不過反過來說,概念掌握了之后,其實(shí)不管是 XS 還是 ES ,或者其它任何搜索引擎工具,那都只是形式上的不同而已了。學(xué)習(xí),在道、法、術(shù)三個(gè)層次中,最終要掌握的還是道,法是經(jīng)驗(yàn)的積累,而術(shù)真的只是照著文檔敲的事了。 另外做個(gè)小約定,從今天開始,全部使用 XunSearch 的簡(jiǎn)稱 XS 了哦,有的地方可能我也會(huì)用中文名稱 迅搜 ,但不再打完整的 XunSearch 這個(gè)詞了哦。同樣的,在需要對(duì)比的地方,我也會(huì)用 ES 來表示 ElasticSearch 。 |
|
|