小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【迅搜02】究竟什么是搜索引擎?正式介紹XunSearch

 硬核項(xiàng)目經(jīng)理 2023-11-20 發(fā)布于湖南

究竟什么是搜索引擎?正式介紹XunSearch

啥?還要單獨(dú)講一下啥是搜索引擎?不就是百度、Google嘛,這玩意天天用,還輪的到你來說?

額,好吧,雖然大家天天都在用,但是我發(fā)現(xiàn),其實(shí)很多人對(duì)搜索引擎并不是特別了解,更別提搜索引擎開發(fā)了。不信?那么咱們就一步一步來看。

搜索引擎

上來先官方,看看百科中對(duì)搜索引擎的定義。

搜索引擎是指根據(jù)一定的策略、運(yùn)用特定的計(jì)算機(jī)程序從互聯(lián)網(wǎng)上采集信息,在對(duì)信息進(jìn)行組織和處理后,為用戶提供檢索服務(wù),將檢索的相關(guān)信息展示給用戶的系統(tǒng)。搜索引擎是工作于互聯(lián)網(wǎng)上的一門檢索技術(shù),它指在提高人們獲取搜集信息的速度,為人們提供更好的網(wǎng)絡(luò)使用環(huán)境。從功能和原理上搜索引擎大致被分為全文搜索引擎、元搜索引擎、垂直搜索引擎和目錄搜索引擎等四大類。

嗯,一堆沒啥用的概念。但我們能從中看到,搜索引擎是根據(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)容。

  • 索引:搜索引擎中的索引只有一個(gè),那就是倒排索引。后面的文章我們會(huì)詳細(xì)的說明。搜索引擎在開始使用的時(shí)候,一定都有一個(gè)建立索引的過程。
  • 分詞:針對(duì)文檔內(nèi)容,以及查詢語句,我們要將它們進(jìn)行分詞,如果不分詞,就無法快速建立倒排索引。同時(shí),中文分詞又是非常重要的內(nèi)容。
  • 引擎:百度、Google的強(qiáng)大引擎不提,我們?nèi)粘i_發(fā)中用到的主要就是 Lucene 系列的,如 ElasticSearch、Solr 等,另外還有 Sphinx 使用的基于 SQL 的搜索引擎以及我們的主角 XunSearch 所使用的 Xapian 引擎。
  • 排序/評(píng)分:我們查詢了數(shù)據(jù)之后,數(shù)據(jù)是按什么順序返回的呢?如果是數(shù)據(jù)庫,可能會(huì)指定一個(gè)排序字段,但搜索引擎一般會(huì)根據(jù)相關(guān)性評(píng)分進(jìn)行排序,也就是說,我們應(yīng)該搜索到的是最貼近搜索詞的內(nèi)容,一般也是用戶最想看到的內(nèi)容。
  • 標(biāo)點(diǎn)符號(hào):基本上所有的搜索引擎都會(huì)過濾掉標(biāo)點(diǎn)符號(hào),最開始我還在糾結(jié)為什么我單獨(dú)來個(gè)問號(hào)搜索不到內(nèi)容,其實(shí)呀,搜索引擎就是為了做語義詞組搜索的,標(biāo)點(diǎn)符號(hào)在大部分情況下是沒有太多意義的呀。當(dāng)然,百度上面是有意義的,但咱們不能跟他比。

雖說不全面,但上面幾點(diǎn)內(nèi)容應(yīng)該是比較重要的方面。其中索引、分詞、排序、評(píng)分等內(nèi)容我們后面還會(huì)有更詳細(xì)的學(xué)習(xí)。今天我們先來了解一下引擎和框架。

XunSearch 和 Xapian

XunSearch 中文名是 迅搜 ,國人大佬開發(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)容都有哪些。

  • 倒排索引、分詞的概念與原理
  • 排序、相關(guān)度評(píng)分的算法概念
  • XS 的使用(PHP SDK工具、PHP SDK全部功能使用等)
  • SCWS、Xapian 的學(xué)習(xí)

現(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)上找到的。


XunSearchElasticSearchSolrSphinx
引擎XapianLuceneLucene不知道
引擎開發(fā)語言C/C++JavaJavaC/C++
應(yīng)用語言PHP(Xapian支持各種語言SDK,因此其實(shí) XS 也支持各種語言)各種語言各種語言各種語言
搜索功能支持1.全文 2.搜索建議 3.分面 4.拼音搜索 5.突出顯示 6.權(quán)重微調(diào) 7.拼寫檢查/糾錯(cuò) 8.突出顯示1.全文 2.自動(dòng)完成建議 3.分面 4.多場(chǎng) 5.同義詞 6.模糊 7.地理空間1.全文 2.自動(dòng)完成建議 3.分面 4.多字段 5.同義詞 6.模糊 7.突出顯示 8.地理空間 9.拼寫檢查1. 全文 2. 自動(dòng)完成建議 3. 分面 4. 多字段 5. 同義詞(稱為字形) 6. 地理空間 7. 突出顯示(稱為片段) 8. 拼寫檢查(稱為qsuggest)
擴(kuò)展與分布式支持主從復(fù)制天然分布式支持分布式支持主從復(fù)制
查詢效率中等高,數(shù)據(jù)量越大,分布分片節(jié)點(diǎn)越多,與其它相比性能就越好非常高,單索引億級(jí)也能快速搜索
增量索引支持支持支持增量支持度一般,但全量MySQL生成索引非???,與MySQL等配合緊密
中文支持自帶SCWSIK、Jieba等安裝第三方分詞器安裝第三方分詞器
資源占用
數(shù)據(jù)量級(jí)單索引百萬單索引單節(jié)點(diǎn)千萬,分布式多節(jié)點(diǎn)多分片沒上限單索引單節(jié)點(diǎn)千萬,分布式多節(jié)點(diǎn)沒上限單索引億級(jí)
開發(fā)友好極高,對(duì)我們 PHPer 來說當(dāng)然是極高了,而且確實(shí)簡(jiǎn)單

好了,這些對(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è)呢?

  • 第一,PHPer 們大部分接觸到的項(xiàng)目,說實(shí)話,XS 完全足夠。
  • 第二,如果確實(shí)有很大的數(shù)據(jù)量,直接用最熱門的,準(zhǔn)沒錯(cuò)。
  • 第三,XS 上手簡(jiǎn)單,學(xué)習(xí)應(yīng)用速度快,和 PHP 無縫對(duì)接,分分鐘上線功能。
  • 第四,ES 代表著最先進(jìn),所有的知識(shí)、插件、概念都比較新,功能齊全。
  • 第五,搜索引擎的基礎(chǔ)知識(shí)和原理是相通的,就像數(shù)據(jù)庫的原理一樣,需要使用其它的學(xué)習(xí)也很快。

怎么感覺說完這一節(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é)果。其中有一條是這樣的。

> php vendor/hightman/xunsearch/util/Quest.php demo 項(xiàng)

小伙伴們測(cè)了沒?是不是查不出東西呀!

跟你說,查不出來就對(duì)了,用 ES 也查不出來。如果你學(xué)過 ES ,那么在 Kibana 中使用下面的 ES 命令建立索引并插入數(shù)據(jù)來進(jìn)行測(cè)試。(如果沒學(xué)過的話就等視頻哈,在視頻里我也會(huì)演示)

PUT demo
{
  "mappings": {
    "properties": {
      "pid":{
        "type":"integer"
      },
      "subject":{
        "type":"text",
        "analyzer""ik_max_word"
      },
      "message":{
        "type":"text",
        "analyzer""ik_max_word"
      },
      "chrono":{
        "type":"integer"
      }
    }
  }
}

POST demo/_doc
{
  "pid":1,
  "subject":"關(guān)于 xunsearch 的 DEMO 項(xiàng)目測(cè)試",
  "message":"項(xiàng)目測(cè)試是一個(gè)很有意思的行為!",
  "chrono":1314336158
}

POST demo/_doc
{
  "pid":2,
  "subject":"測(cè)試第二篇",
  "message":"這里是第二篇文章的內(nèi)容",
  "chrono":1314336160
}

POST demo/_doc
{
  "pid":3,
  "subject":"項(xiàng)目測(cè)試第三篇",
  "message":"俗話說,無三不成禮,所以就有了第三篇",
  "chrono":1314336168
}

第一個(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è)試。

GET demo/_search
{
  "query":{
    "query_string" : {
      "query" :"項(xiàng)目"
    }
  }
}

GET demo/_search
{
  "query":{
    "query_string" : {
      "query" :"項(xiàng)"
    }
  }
}

不出意外的話,第一個(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 。

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多