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

分享

宜信技術(shù)實(shí)踐|海量數(shù)據(jù)搜索

 昵稱16619343 2019-06-17

在我們平常的生活工作中,百度、谷歌這些搜索網(wǎng)站已經(jīng)成為了我們受教解惑的學(xué)校,俗話說(shuō)得好,“有問(wèn)題找度娘”。那么百度是如何在海量數(shù)據(jù)中找到自己需要的數(shù)據(jù)呢?為什么它搜索的速度如此之快?我們都知道是因?yàn)榘俣鹊乃阉饕?,那么搜索引擎到底是個(gè)什么東西呢?可能有的程序員會(huì)想到es,但是es并不能代表搜索引擎,它只是其中的一種工具,不過(guò)這種工具確實(shí)好用,效率很高。

本文會(huì)向大家講述搜索引擎的基本知識(shí)以及中文分詞的一些方法、然后會(huì)做一個(gè)小的demo來(lái)嘗試數(shù)據(jù)檢索。讓大家初步了解搜索引擎的實(shí)現(xiàn)。

一、搜索引擎介紹

1.1 搜索引擎是什么

這里引用百度百科的介紹:

搜索引擎(Search Engine)是指根據(jù)一定的策略、運(yùn)用特定的計(jì)算機(jī)程序從互聯(lián)網(wǎng)上搜集信息,在對(duì)信息進(jìn)行組織和處理后,為用戶提供檢索服務(wù),將用戶檢索相關(guān)的信息展示給用戶的系統(tǒng)。

1.2 搜索引擎分類

搜索引擎包括全文索引、目錄索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、門(mén)戶搜索引擎與免費(fèi)鏈接列表等。

本文主要介紹全文索引,即百度使用的搜索引擎分類。

全文索引

首先是數(shù)據(jù)庫(kù)中數(shù)據(jù)的搜集,搜索引擎的自動(dòng)信息搜集功能分兩種:

一種是定期搜索,即每隔一段時(shí)間(比如Google一般是28天),搜索引擎主動(dòng)派出“蜘蛛”程序,對(duì)一定IP地址范圍內(nèi)的互聯(lián)網(wǎng)網(wǎng)站進(jìn)行檢索,一旦發(fā)現(xiàn)新的網(wǎng)站,它會(huì)自動(dòng)提取網(wǎng)站的信息和網(wǎng)址加入自己的數(shù)據(jù)庫(kù)。

另一種是提交網(wǎng)站搜索,即網(wǎng)站擁有者主動(dòng)向搜索引擎提交網(wǎng)址,它在一定時(shí)間內(nèi)(2天到數(shù)月不等)定向向你的網(wǎng)站派出“蜘蛛”程序,掃描你的網(wǎng)站并將有關(guān)信息存入數(shù)據(jù)庫(kù),以備用戶查詢。

當(dāng)用戶以關(guān)鍵詞查找信息時(shí),搜索引擎會(huì)在數(shù)據(jù)庫(kù)中進(jìn)行搜尋,如果找到與用戶要求內(nèi)容相符的網(wǎng)站,便采用特殊的算法——通常根據(jù)網(wǎng)頁(yè)中關(guān)鍵詞的匹配程度、出現(xiàn)的位置、頻次、鏈接質(zhì)量——計(jì)算出各網(wǎng)頁(yè)的相關(guān)度及排名等級(jí),然后根據(jù)關(guān)聯(lián)度高低,按順序?qū)⑦@些網(wǎng)頁(yè)鏈接返回給用戶。這種引擎的特點(diǎn)是搜全率比較高。

1.3 搜索引擎能解決什么問(wèn)題

高效查詢數(shù)據(jù)(運(yùn)用多種算法查詢數(shù)據(jù),查詢速率是毫秒級(jí)別,無(wú)論是千萬(wàn)條數(shù)據(jù)還是上億的數(shù)據(jù))

比較容易,將普通的數(shù)據(jù)庫(kù)切換成搜索引擎比較容易。

大數(shù)據(jù)量、時(shí)效性、高并發(fā)等等。

1.4 搜索引擎的應(yīng)用場(chǎng)景

數(shù)據(jù)庫(kù)達(dá)到百萬(wàn)數(shù)據(jù)級(jí)別的時(shí)候

要求檢索時(shí)效性、性能要求高,Ms級(jí)響應(yīng)

1.5 Solr

接下來(lái)看在平常的互聯(lián)網(wǎng)中搜索引擎的應(yīng)用Solr。那么什么是Solr呢?它和es相比有什么優(yōu)點(diǎn)和不足呢?

我們先來(lái)簡(jiǎn)單地介紹一下solr:

Solr是一個(gè)基于Lucene的全文搜索服務(wù)器。同時(shí)對(duì)其進(jìn)行了擴(kuò)展,提供了比Lucene更為豐富的面向使用的查詢語(yǔ)言,同時(shí)實(shí)現(xiàn)了可配置、可擴(kuò)展并對(duì)查詢性能進(jìn)行了優(yōu)化,并且提供了一個(gè)完善的功能管理界面。它支持Xml/Http協(xié)議,支持JSONAPI接口。

它具有如下特點(diǎn):

可擴(kuò)展性:Solr可以把建立索引和查詢處理的運(yùn)算分布到一個(gè)集群內(nèi)的多臺(tái)服務(wù)器上。

快速部署:Solr是開(kāi)源軟件,安裝和配置都很方便,可以根據(jù)安裝包內(nèi)的Sample配置直接上手,可分為單機(jī)和集群模式。

海量數(shù)據(jù):Solr是針對(duì)億級(jí)以上的海量數(shù)據(jù)處理而設(shè)計(jì)的,可以很好地處理海量數(shù)據(jù)檢索。

優(yōu)化的搜索功能:Solr搜索速度夠快,對(duì)于復(fù)雜的搜索查詢Solr可以做到毫秒級(jí)的處理,通常,幾十毫秒就能處理完一次復(fù)雜查詢。

二、分詞介紹

接下來(lái),我們將了解分詞是如何實(shí)現(xiàn)的。那么,我們?yōu)槭裁匆シ衷~呢,這和搜索引擎有什么關(guān)系呢?我們?cè)谒阉骺蚶镙斎氲膸讉€(gè)詞或者一段話是如何拆成多個(gè)關(guān)鍵字的呢?

大家聽(tīng)說(shuō)過(guò)哪些分詞器嗎?比如lucene自帶的中文分詞器smartcn,還有最常用的IK分詞器等等,今天我們主要講一下IK分詞器。

2.1 IK分詞器

IK分詞器首先會(huì)維護(hù)幾個(gè)詞典來(lái)記錄一些常用的詞,如主詞表:main2012.dic、量詞表quantifier.dic、停用詞stopword.dic。

Dictionary為字典管理類中,分別加載了這個(gè)詞典到內(nèi)存結(jié)構(gòu)中。具體的字典代碼,位于org.wltea.analyzer.dic.DictSegment。 這個(gè)類實(shí)現(xiàn)了一個(gè)分詞器的一個(gè)核心數(shù)據(jù)結(jié)構(gòu),即Tire Tree。

Tire Tree(字典樹(shù))是一種結(jié)構(gòu)相當(dāng)簡(jiǎn)單的樹(shù)型結(jié)構(gòu),用于構(gòu)建詞典,通過(guò)前綴字符逐一比較對(duì)方式,快速查找詞,所以有時(shí)也稱為前綴樹(shù)。具體的例子如下。

舉例

比如:我是北京海淀區(qū)中關(guān)村的中國(guó)人民。

我們?cè)O(shè)置的詞典是:北京、海淀區(qū)、中關(guān)村、中國(guó)、中國(guó)人民,那么根據(jù)詞典組成的字典樹(shù)如圖所示:

然后我們根據(jù)這個(gè)字典樹(shù)來(lái)對(duì)這段話進(jìn)行詞語(yǔ)切分。IK分詞器中,基本可以分為兩種模式:一種是smart模式、一種是非smart模式,可以在代碼中初始化的時(shí)候去配置。

我們其實(shí)不用解釋這兩種模式的字面含義,直接打印兩種模式的結(jié)果就可以看出來(lái):

原句:我是北京海淀區(qū)中關(guān)村的中國(guó)人民

smart模式:北京、海淀區(qū)、中關(guān)村、中國(guó)人民

非smart模式:北京、海淀區(qū)、中關(guān)村、中國(guó)、中國(guó)人民

顯而易見(jiàn),非smart模式是將能夠分出來(lái)的詞全部輸出;smart模式是根據(jù)內(nèi)在的方法輸出一個(gè)合理的分詞結(jié)果,這就涉及到了歧義判斷。

舉例

舉個(gè)更有代表性的例子:張三說(shuō)的確實(shí)在理。

根據(jù)正向匹配可能的詞元鏈:

L1:{張三,張,三}

L2:{說(shuō)}

L3:{的確,的,確實(shí),確,實(shí)在,實(shí),在理,在,理}

首來(lái)看一下最基本的一些元素結(jié)構(gòu)類:

public class Lexeme implements Comparable{ …… //詞元的起始位移 private int offset; //詞元的相對(duì)起始位置 private int begin; //詞元的長(zhǎng)度 private int length; //詞元文本 private String lexemeText; //詞元類型 private int lexemeType; …… }

這里的Lexeme(詞元),可以理解為是一個(gè)詞語(yǔ)或單詞。其中的begin,是指其在輸入文本中的位置。注意,它是實(shí)現(xiàn)Comparable的,起始位置靠前的優(yōu)先,長(zhǎng)度較長(zhǎng)的優(yōu)先,這可以用來(lái)決定一個(gè)詞在一條分詞結(jié)果的詞元鏈中的位置,可以用于得到上面例子中分詞結(jié)果中的各個(gè)詞的順序。

/* * 詞元在排序集合中的比較算法 * @see java.lang.Comparable#compareTo(java.lang.Object) */ public int compareTo(Lexeme other) { //起始位置優(yōu)先 if(this.begin < other.getBegin){ return -1; }else if(this.begin == other.getBegin){ //詞元長(zhǎng)度優(yōu)先 if(this.length > other.getLength){ return -1; }else if(this.length == other.getLength){ return 0; }else {//this.length < other.getLength return 1; } }else{//this.begin > other.getBegin return 1; } }

smart模式歧義消除算法:

詞元位置權(quán)重比較(詞元長(zhǎng)度積),含義是選取長(zhǎng)的詞元位置在后的集合

L31:{的,確實(shí),在理}1*1+2*2+3*2=11

L32:{的確,實(shí),在理} 1*2+2*1+3*2=10

L33:{的確,實(shí)在,理} 1*2+2*2+3*1=9

最后的分詞結(jié)果:張三,說(shuō),的,確實(shí),在理

分詞就介紹這么多,大家可以去讀一下IK分詞器的源碼,深入地了解一下,源碼地址:https://github.com/quentinxxz/Search/tree/master/IKAnalyzer2012FF_hf1_source/

三、倒排索引算法

3.1 介紹

我們可以把倒排索引算法想象成查字典時(shí)的目錄一樣,我們知道需要查的字的目錄后,就會(huì)很快地查找到。如果用專業(yè)的語(yǔ)言解釋的話就是:

倒排索引源于實(shí)際應(yīng)用中需要根據(jù)屬性的值來(lái)查找記錄。這種索引表中的每一項(xiàng)都包括一個(gè)屬性值和具有該屬性值的各記錄的地址。由于不是由記錄來(lái)確定屬性值,而是由屬性值來(lái)確定記錄的位置,因而稱為倒排索引(inverted index)。帶有倒排索引的文件我們稱為倒排索引文件,簡(jiǎn)稱倒排文件(inverted file)。

倒排文件(倒排索引),索引對(duì)象是文檔或者文檔集合中的單詞等,用來(lái)存儲(chǔ)這些單詞在一個(gè)文檔或者一組文檔中的存儲(chǔ)位置,是對(duì)文檔或者文檔集合的一種最常用的索引機(jī)制。

搜索引擎的關(guān)鍵步驟就是建立倒排索引,倒排索引一般表示為一個(gè)關(guān)鍵詞,然后是它的頻度(出現(xiàn)的次數(shù)),位置(出現(xiàn)在哪一篇文章或網(wǎng)頁(yè)中,及有關(guān)的日期,作者等信息),它相當(dāng)于為互聯(lián)網(wǎng)上幾千億頁(yè)網(wǎng)頁(yè)做了一個(gè)索引,好比一本書(shū)的目錄、標(biāo)簽一般。讀者想看哪一個(gè)主題相關(guān)的章節(jié),直接根據(jù)目錄即可找到相關(guān)的頁(yè)面。不必再?gòu)臅?shū)的第一頁(yè)到最后一頁(yè),一頁(yè)一頁(yè)地查找。

3.2 Lucene倒排索引原理

Lucerne是一個(gè)開(kāi)放源代碼的高性能的基于java的全文檢索引擎工具包,不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引擎的架構(gòu),提供了完整的查詢引擎和索引引擎,部分文本分析引擎。目的是為軟件開(kāi)發(fā)人員提供一個(gè)簡(jiǎn)單易用的工具包,以方便在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能,或者以此為基礎(chǔ)建立起完整的全文檢索引擎。

假設(shè)有兩篇文章1和2:

文章1的內(nèi)容為: Jack lives in BeiJing,I live in BeiJing too. 文章2的內(nèi)容為: He lived in Taiyuan.

1)取得關(guān)鍵詞

首先我們要用我們之前講的方式分詞,然后由于英文的原因,我們需要將in、on、of這些沒(méi)用實(shí)際意義的詞過(guò)濾掉,然后將第三人稱單數(shù)加s或者過(guò)去式加ed這些詞還原回去,如lived變回live,lives變回live,然后把不需要的標(biāo)點(diǎn)符號(hào)也去掉。經(jīng)過(guò)上面的處理之后,剩下的關(guān)鍵字為:

文章1的所有關(guān)鍵詞為:[Jack] [live] [BeiJing] [i] [live] [BeiJing]

文章2的所有關(guān)鍵詞為:[he] [live] [Taiyuan]

2)建立倒排索引

關(guān)鍵詞 文章號(hào)[出現(xiàn)頻率] 出現(xiàn)位置 BeiJing 1[2] 3,6 he 2[1] 1 i 1[1] 4 live 1[2] 2,5, 2[1] 2 Taiyuan 2[1] 3 tom 1[1] 1

以上就是lucene索引結(jié)構(gòu)中最核心的部分。我們注意到關(guān)鍵字是按字符順序排列的(lucene沒(méi)有使用B樹(shù)結(jié)構(gòu)),因此lucene可以用二元搜索算法快速定位關(guān)鍵詞。

3.3 實(shí)現(xiàn)

實(shí)現(xiàn)時(shí),lucene將上面三列分別作為詞典文件(Term Dictionary)、頻率文件(frequencies)、位置文件 (positions)保存。其中詞典文件不僅保存有每個(gè)關(guān)鍵詞,還保留了指向頻率文件和位置文件的指針,通過(guò)指針可以找到該關(guān)鍵字的頻率信息和位置信息。

3.4 壓縮算法

為了減小索引文件的大小,Lucene對(duì)索引還使用了壓縮技術(shù)。

首先,對(duì)詞典文件中的關(guān)鍵詞進(jìn)行了壓縮,關(guān)鍵詞壓縮為<前綴長(zhǎng)度,后綴>,例如:當(dāng)前詞為“阿拉伯語(yǔ)”,上一個(gè)詞為“阿拉伯”,那么“阿拉伯語(yǔ)”壓縮為<3,語(yǔ)>。

其次大量用到的是對(duì)數(shù)字的壓縮,數(shù)字只保存與上一個(gè)值的差值(這樣可以減小數(shù)字的長(zhǎng)度,進(jìn)而減少保存該數(shù)字需要的字節(jié)數(shù))。例如當(dāng)前文章號(hào)是16389(不壓縮要用3個(gè)字節(jié)保存),上一文章號(hào)是16382,壓縮后保存7(只用一個(gè)字節(jié))。

3.5 使用原因

假設(shè)要查詢單詞 “l(fā)ive”,lucene先對(duì)詞典二元查找、找到該詞,通過(guò)指向頻率文件的指針讀出所有文章號(hào),然后返回結(jié)果。詞典通常非常小,因而,整個(gè)過(guò)程的時(shí)間是毫秒級(jí)的。

而用普通的順序匹配算法,不建索引,而是對(duì)所有文章的內(nèi)容進(jìn)行字符串匹配,這個(gè)過(guò)程將會(huì)相當(dāng)緩慢,當(dāng)文章數(shù)目很大時(shí),時(shí)間往往是無(wú)法忍受的。

四、solr基本配置以及使用

我們?cè)趙indows系統(tǒng)中安裝solr。

下載地址 http://lucene./solr/downloads.html

解壓后:

cmd 進(jìn)入solr的bin目錄,使用命令 solr start(為了更方便,可以配置solr的環(huán)境變量,配好后可以直接在cmd中使用solr命名)

看到這個(gè)界面,說(shuō)明solr服務(wù)啟動(dòng)成功,端口號(hào)為 8983,訪問(wèn) http://localhost:8983,會(huì)自動(dòng)跳轉(zhuǎn)到http://localhost:8983/solr/#/

在這個(gè)頁(yè)面會(huì)顯示 solr的基本信息,lucene信息,Java信息等

然后我們介紹一個(gè)solr的指令: solr -h 可以看到solr的基本信息

配置solr

配置核心core

solr create -c mycore -d baisc_configs:-c參數(shù)指定定義的核心名稱,-d參數(shù)指定配置目錄

執(zhí)行該命令后,會(huì)多出一個(gè)test目錄。

訪問(wèn)Solr Admin頁(yè)面:http://localhost:8983/,查看core,多了一個(gè) test

在\solr-6.3.0\server\solr\test目錄下有conf和data目錄,分別對(duì)應(yīng)配置和數(shù)據(jù)。

給core添加數(shù)據(jù)

打開(kāi)目錄:\solr-6.3.0\server\solr\test\conf,添加一個(gè)字段:

<field name='name' type='string' indexed='false' stored='true' required='true' multiValued='false' />

然后重啟solr: solr restart -p 8983

到Solr Admin頁(yè)面,選擇core-test-document,在Document(s)中填寫(xiě)數(shù)據(jù):

{ 'id':'1', 'name':'寶馬' }

點(diǎn)擊submit,返回Status: success,則代表添加數(shù)據(jù)成功。

多加幾條后,點(diǎn)擊Query,查詢數(shù)據(jù):

查詢界面的 q,代表 查詢條件,如輸入:name:'寶馬',再次執(zhí)行查詢

也可以直接get方式訪問(wèn)url:http://localhost:8983/solr/test/select?q=name:寶馬

作者:楊亨

來(lái)源:宜信技術(shù)學(xué)院

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

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

    類似文章 更多