你了解搜索引擎嗎?
什么是全文搜索引擎?
常?的搜索?站,?如百度,?歌。


數(shù)據(jù)的分類
- 結(jié)構(gòu)化數(shù)據(jù):指具有固定格式或有限?度的數(shù)據(jù),如數(shù)據(jù)庫(kù),元數(shù)據(jù)等。
 
對(duì)于結(jié)構(gòu)化數(shù)據(jù),我們?般都是可以通過(guò)關(guān)系型數(shù)據(jù)庫(kù)(mysql,oracle等)的 table 的?式存儲(chǔ)和搜索,也可以建?索引。通過(guò)b-tree等數(shù)據(jù)結(jié)構(gòu)快速搜索數(shù)據(jù)。
- ?結(jié)構(gòu)化數(shù)據(jù):全?數(shù)據(jù),指不定?或?固定格式的數(shù)據(jù),如郵件,word?檔等。
 
對(duì)于?結(jié)構(gòu)化數(shù)據(jù),也即對(duì)全?數(shù)據(jù)的搜索主要有兩種?法:順序掃描法,全?搜索法。
順序掃描
- 按字?意思,我們可以了解它的?概搜索?式,就是按照順序掃描的?式查找特定的關(guān)鍵字。?如讓你在?篇籃球新聞中,找出"科?"這個(gè)名字在哪些段落出現(xiàn)過(guò)。那你肯定需要從頭到尾把?章閱讀?遍,然后標(biāo)記出關(guān)鍵字在哪些地?出現(xiàn)過(guò)。
 - 這種?法毋庸置疑是最低效的,如果?章很?,有?萬(wàn)字,等你閱讀完這篇新聞?wù)业?科?"這個(gè)關(guān)鍵字,那得花多少時(shí)間。
 
全?搜索
- 對(duì)?結(jié)構(gòu)化數(shù)據(jù)進(jìn)?順序掃描很慢,我們是否可以進(jìn)?優(yōu)化?把我們的?結(jié)構(gòu)化數(shù)據(jù)想辦法弄得有?定結(jié)構(gòu)不就?了嗎?將?結(jié)構(gòu)化數(shù)據(jù)中的?部分信息提取出來(lái),重新組織,使其變得有?定結(jié)構(gòu),然后對(duì)這些有?定結(jié)構(gòu)的數(shù)據(jù)進(jìn)?搜索,從?達(dá)到搜索相對(duì)較快的?的。這種?式就構(gòu)成了全?搜索的基本思路。這部分從?結(jié)構(gòu)化數(shù)據(jù)中提取出的然后重新組織的信息,我們稱之索引。
 - 我們以NBA中國(guó)?站為例,假設(shè)我們都是籃球愛(ài)好者,并且我們是科密,那如何快速找到有關(guān)科?的新聞呢?全?搜索的?式就是,將所有新聞中所有的關(guān)鍵字進(jìn)?提取,?如"科?","詹姆斯","總冠軍","MVP"等關(guān)鍵字,然后對(duì)這些關(guān)鍵字建?索引,通過(guò)索引我們就可以找到對(duì)應(yīng)的該關(guān)鍵詞出現(xiàn)的新聞了。
 
什么是全?搜索引擎
根據(jù)百度百科中的定義,全?搜索引擎是?前?泛應(yīng)?的主流搜索引擎。它的?作原理是計(jì)算機(jī)索引程序通過(guò)掃描?章中的每?個(gè)詞,對(duì)每?個(gè)詞建??個(gè)索引,指明該詞在?章中出現(xiàn)的次數(shù)和位置,當(dāng)?戶查詢時(shí),檢索程序就根據(jù)事先建?的索引進(jìn)?查找,并將查找的結(jié)果反饋給?戶的。
搜索引擎
- Lucene
 - Solr
 - Elastic search
 
為什么不?mysql做全?搜索
前?
- 有?可能會(huì)問(wèn),為什么?定要?搜索引擎呢?我們的所有數(shù)據(jù)不是都可以放在數(shù)據(jù)庫(kù)?嗎?
 - ?且 Mysql,Oracle,SQL Server 等數(shù)據(jù)庫(kù)?不是也能提供查詢搜索功能,直接通過(guò)數(shù)據(jù)庫(kù)查詢不就可以了嗎?
 - 確實(shí),我們?部分的查詢功能都可以通過(guò)數(shù)據(jù)庫(kù)查詢獲得,如果查詢效率低下,還可以通過(guò)新建數(shù)據(jù)庫(kù)索引,優(yōu)化SQL等?式進(jìn)?提升效率,甚?通過(guò)引?緩存?如redis,memcache來(lái)加快數(shù)據(jù)的返回速度。如果數(shù)據(jù)量更?,還可以通過(guò)分庫(kù)分表來(lái)分擔(dān)查詢壓?。
 - 那為什么還要全?搜索引擎呢?我們從?個(gè)?度來(lái)說(shuō)
 
數(shù)據(jù)類型
全?索引搜索很好的?持?結(jié)構(gòu)化數(shù)據(jù)的搜索,可以更好地快速搜索?量存在的任何單詞?結(jié)構(gòu)化?本。例如 Google,百度類的?站搜索,它們都是根據(jù)??中的關(guān)鍵字?成索引,我們?cè)谒阉鞯臅r(shí)候輸?關(guān)鍵字,它們會(huì)將該關(guān)鍵字即索引匹配到的所有??返回;還有常?的項(xiàng)?中應(yīng)??志的搜索等等。對(duì)于這些?結(jié)構(gòu)化的數(shù)據(jù)?本,關(guān)系型數(shù)據(jù)庫(kù)搜索不是能很好的?持。
搜索性能
如果使?mysql做搜索,?如有個(gè)player表,這個(gè)表有user_name這個(gè)字段,我們要查找出user_name以james開頭的球員,和含有James的球員。我們?般怎么做?數(shù)據(jù)量達(dá)到千萬(wàn)級(jí)別的時(shí)候怎么辦?
select * from player where user_name like 'james%';
select * from player where user_name like '%james%';
靈活的搜索
- 如果我們想查出名字叫james的球員,但是?戶輸?了jame,我們想提示他?些關(guān)鍵字
 

- 如果我們想查出帶有"冠軍"關(guān)鍵字的?章,但是?戶輸?了"總冠軍",我們也希望能查出來(lái)。
 

索引的維護(hù)
?般傳統(tǒng)數(shù)據(jù)庫(kù),全?搜索都實(shí)現(xiàn)的很雞肋,因?yàn)?般也沒(méi)??數(shù)據(jù)庫(kù)存??本字段,因?yàn)檫M(jìn)?全?搜索的時(shí)候需要掃描整個(gè)表,如果數(shù)據(jù)量?的話即使對(duì)SQL的語(yǔ)法進(jìn)?優(yōu)化,也是效果甚微。即使建?了索引,但是維護(hù)起來(lái)也很麻煩,對(duì)于 insert 和 update 操作都會(huì)重新構(gòu)建索引。
適合全?索引引擎的場(chǎng)景
- 搜索的數(shù)據(jù)對(duì)象是?量的?結(jié)構(gòu)化的?本數(shù)據(jù)。
 - ?本數(shù)據(jù)量達(dá)到數(shù)?萬(wàn)或數(shù)百萬(wàn)級(jí)別,甚?更多。
 - ?持?量基于交互式?本的查詢。
 - 需求?常靈活的全?搜索查詢。
 - 對(duì)安全事務(wù),??本數(shù)據(jù)操作的需求相對(duì)較少的情況。
 
常?的搜索引擎
簡(jiǎn)介:常?的搜索引擎,Lucene,Solr,Elasticsearch
Lucene
- Lucene是?個(gè)Java全?搜索引擎,完全?Java編寫。Lucene不是?個(gè)完整的應(yīng)?程序,?是?個(gè)代碼庫(kù)和API,可以很容易地?于向應(yīng)?程序添加搜索功能。
 - 通過(guò)簡(jiǎn)單的API提供強(qiáng)?的功能
 
可擴(kuò)展的?性能索引
強(qiáng)?,準(zhǔn)確,?效的搜索算法
跨平臺(tái)解決?案
- Apache軟件基?會(huì)
 
在Apache軟件基?會(huì)提供的開源軟件項(xiàng)?的Apache社區(qū)的?持。
但是Lucene只是?個(gè)框架,要充分利?它的功能,需要使?java,并且在程序中集成Lucene。需要很多的學(xué)習(xí)了解,才能明?它是如何運(yùn)?的,熟練運(yùn)?Lucene確實(shí)?常復(fù)雜。
Solr
- Solr是?個(gè)基于Lucene的Java庫(kù)構(gòu)建的開源搜索平臺(tái)。它以?戶友好的?式提供ApacheLucene的搜索功能。它是?個(gè)成熟的產(chǎn)品,擁有強(qiáng)???泛的?戶社區(qū)。它能提供分布式索引,復(fù)制,負(fù)載均衡查詢以及?動(dòng)故障轉(zhuǎn)移和恢復(fù)。如果它被正確部署然后管理得好,它就能夠成為?個(gè)?度可靠,可擴(kuò)展且容錯(cuò)的搜索引擎。很多互聯(lián)?巨頭,如Netflflix,eBay,Instagram和亞?遜都使?Solr,因?yàn)樗軌蛩饕退阉鞫鄠€(gè)站點(diǎn)。
 - 強(qiáng)?的功能
 
全?搜索
突出
分?搜索
實(shí)時(shí)索引
動(dòng)態(tài)群集
數(shù)據(jù)庫(kù)集成
NoSQL功能和豐富的?檔處理
Elasticsearch
- Elasticsearch是?個(gè)開源,是?個(gè)基于Apache Lucene庫(kù)構(gòu)建的Restful搜索引擎.
 - Elasticsearch是在Solr之后?年推出的。它提供了?個(gè)分布式,多租戶能?的全?搜索引擎,具有HTTP Web界?(REST)和?架構(gòu)JSON?檔。Elasticsearch的官?客戶端庫(kù)提供Java,Groovy,PHP,Ruby,Perl,Python,.NET和Javascript。
 - 主要功能
 
分布式搜索
數(shù)據(jù)分析
分組和聚合
- 應(yīng)?場(chǎng)景
 
維基百科
Stack Overflflow
GitHub
電商?站
?志數(shù)據(jù)分析
商品價(jià)格監(jiān)控?站
BI系統(tǒng)
站內(nèi)搜索
籃球論壇
參考個(gè)人博客:??cyz??















 
 
 






 
 
 
 