1. 為什么需要搜索平引擎
首先先思考下面的幾個(gè)問(wèn)題:
我們的應(yīng)用中一般用什么來(lái)存儲(chǔ)數(shù)據(jù)?
數(shù)據(jù)庫(kù)如 MySQL-
我們經(jīng)常瀏覽新聞岂贩、博客茫经、商品等,存儲(chǔ)這些數(shù)據(jù)的表都應(yīng)該有哪些字段萎津?
-
在數(shù)據(jù)庫(kù)中如何做下面的查詢卸伞? 以上面的新聞表為例
當(dāng)數(shù)據(jù)量變大時(shí),上邊3中的四個(gè)查詢都變慢了锉屈,該如何優(yōu)化荤傲?
常用的數(shù)據(jù)庫(kù)優(yōu)化方法:
建索引、分區(qū)表建索引對(duì)“查詢與釣魚(yú)島有關(guān)的新聞”有效率上邊的提升嗎颈渊?為什么遂黍?
答案是沒(méi)有的索引的原理是怎樣的?
對(duì)列值創(chuàng)建排序存儲(chǔ)俊嗽,數(shù)據(jù)結(jié)構(gòu)={列值雾家、行地址}。在有序數(shù)據(jù)列表中就可以利用二分查找快速找到要查找的行的地址绍豁,再根據(jù)地址直接取行數(shù)據(jù)芯咧。索引的排序,是怎么排的竹揍?
數(shù)值列 : 數(shù)值大小
時(shí)間列 : 轉(zhuǎn)換成long之后按照數(shù)值大小
文本列 : 按照字符集編碼-
在“新聞標(biāo)題”列上建索引后敬飒,當(dāng)我們查詢 標(biāo)題 = “釣魚(yú)島”,數(shù)據(jù)庫(kù)會(huì)怎么去查鬼佣?
而當(dāng)我們查詢 標(biāo)題 LIKE ‘%釣魚(yú)島%’驶拱,數(shù)據(jù)庫(kù)此時(shí)無(wú)法使用索引進(jìn)行查詢霜浴,所以無(wú)法提升效率晶衷,此時(shí)會(huì)全表掃描。
由以上八個(gè)問(wèn)題,我們可以得出以下的結(jié)論:
結(jié)論:
數(shù)據(jù)庫(kù)適合結(jié)構(gòu)化數(shù)據(jù)的精確查詢晌纫,而不適合半結(jié)構(gòu)化税迷、非結(jié)構(gòu)化數(shù)據(jù)的模糊查詢及靈活搜索(特別是數(shù)據(jù)量大時(shí)),無(wú)法提供想要的實(shí)時(shí)性锹漱。
- 結(jié)構(gòu)化數(shù)據(jù):用表箭养、字段表示的數(shù)據(jù)
- 半結(jié)構(gòu)化數(shù)據(jù):xml html
- 非結(jié)構(gòu)化數(shù)據(jù):文本、文檔哥牍、圖片毕泌、音頻、視頻等
2. 搜索引擎是如何做到快速查詢的
1思考:如何做才能快速查詢到與“釣魚(yú)島是中國(guó)的”有關(guān)的新聞嗅辣?
分析:我們查詢時(shí)撼泛,輸入的是“釣魚(yú)島是中國(guó)的”,想要得到標(biāo)題或內(nèi)容中包含“釣魚(yú)島是中國(guó)的”的新聞列表澡谭。
如何做愿题,可以快速找到包含“釣魚(yú)島”的文章id,包含“中國(guó)”的文章id?
- 倒排索引
2.為什么稱為倒排索引蛙奖?
英文原名Inverted index潘酗,失敗地翻譯成了倒排索引,正確翻譯為:反向索引
- 下面這兩個(gè)索引可以合并在一起嗎雁仲?
正確的合并方式
上邊的合并方式節(jié)約了存儲(chǔ)空間仔夺,提升了檢索效率。
-
反向索引的記錄數(shù)會(huì)不會(huì)很大攒砖?
正常來(lái)說(shuō)是不會(huì)的囚灼,可以查看下面的圖:
所以一般來(lái)說(shuō)最多也不會(huì)超過(guò)100W個(gè)
-
如何建立這樣一個(gè)索引?
-
如果要開(kāi)發(fā)一個(gè)中文分詞器祭衩,你覺(jué)得該怎么實(shí)現(xiàn)對(duì)一句話進(jìn)行分詞灶体?
語(yǔ)句示例:張三說(shuō)的卻是在理:
java開(kāi)源的中文分詞器有哪些?
有很多掐暮,如何選擇蝎抽?
1.準(zhǔn)確率 2.分詞效率 3.中英混合分詞支持常用的中文分詞器有:IKAnalyzer mmseg4j
-
分詞器在分詞時(shí)能不能統(tǒng)計(jì)出詞的出現(xiàn)次數(shù)、位置路克?有什么作用樟结?
可以,這樣可以方便進(jìn)行一個(gè)短語(yǔ)查詢和高亮等等精算。
你瓢宦、我、他灰羽、的驮履、地鱼辙、了、標(biāo)點(diǎn)符號(hào)…..這些需要為其創(chuàng)建索引嗎?
這種詞一般稱為停用詞玫镐,不會(huì)被索引當(dāng)出現(xiàn)了新詞了倒戏,該怎么辦?
撩妹老司機(jī)、軟妹子恐似、直男 遇到這種情況就需要允許自行添加內(nèi)容到字典
所以由以上十個(gè)點(diǎn)杜跷,可以得出結(jié)論,如果要快速查詢到指定的內(nèi)容的新聞
結(jié)論:使用分詞器對(duì)數(shù)據(jù)進(jìn)行分詞矫夷,建立反向索引葛闷。
3. 有了反向索引了,如何進(jìn)行搜索双藕?
- 步驟1: 對(duì)搜索輸入進(jìn)行分詞
釣魚(yú)島孵运、中國(guó) -
步驟2: 在反向索引中找出包含釣魚(yú)島、中國(guó)的文章列表
- 步驟3: 合并兩個(gè)列表蔓彩,排序輸出
{1,12,8,5}
由上邊的內(nèi)容治笨,引申出以下問(wèn)題:
- 問(wèn)題1:合并后列表該如何排序?我們希望最相關(guān)的排在最前面
- 問(wèn)題2:相關(guān)性如何度量?
人可以通過(guò)讀內(nèi)容判定相關(guān)性赤嚼,機(jī)器不懂人話旷赖。
得建立一套能評(píng)估相關(guān)性的模型。 - 問(wèn)題3:如何根據(jù)次數(shù)建立一個(gè)相關(guān)性評(píng)估模型?
-
規(guī)則1:統(tǒng)計(jì)出現(xiàn)次數(shù)更卒,根據(jù)次數(shù)從高到低排序
-
規(guī)則2:加入權(quán)重,標(biāo)題權(quán)重10等孵,內(nèi)容權(quán)重1,計(jì)算權(quán)重得分蹂空,按高-低排序
4. 其他的剩余議題
4.1 反向索引更新:數(shù)據(jù)更新時(shí)俯萌,索引是不是必須得更新?好更新嗎上枕?
正常來(lái)說(shuō)是不存在更新這個(gè)操作的咐熙,實(shí)現(xiàn)更新操作的方式也很簡(jiǎn)單粗暴,就是先刪除文章然后再重新索引該文章辨萍。
4.2 反向索引是存儲(chǔ)在內(nèi)存中棋恼,還是磁盤中合適?反向索引會(huì)有多大锈玉?
一般到都是寫到磁盤上爪飘,然后用buff快速寫入。
4.3 搜索引擎需要支持精確搜索嗎拉背?需要支持像數(shù)據(jù)庫(kù)一樣的多條件AND OR組合搜索嗎师崎?
必須要支持
5. Lucene
最受歡迎的java開(kāi)源全文搜索引擎開(kāi)發(fā)工具包。提供了完整的查詢引擎和索引引擎椅棺,部分文本分詞引擎犁罩。Lucene的目的是為軟件開(kāi)發(fā)人員提供一個(gè)簡(jiǎn)單易用的工具包齐蔽,以方便在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索功能,或者是以此為基礎(chǔ)建立起完整的全文檢索引擎昼汗。
是Apache的子項(xiàng)目,網(wǎng)址: http://lucene.apache.org/
- Lucene在ES中的應(yīng)用
ES將index的數(shù)據(jù)分為多份鬼雀,每份叫一個(gè)shard顷窒,為了提高數(shù)據(jù)可用性,每個(gè)shard都會(huì)有冗余副本,每個(gè)副本實(shí)際上是一個(gè)Lucene index實(shí)例.
如果覺(jué)得有收獲就點(diǎn)個(gè)贊吧源哩,更多知識(shí)鞋吉,請(qǐng)點(diǎn)擊關(guān)注查看我的主頁(yè)信息哦~