年輕的時(shí)候總以為很多app或者網(wǎng)站的搜索功能是基于cache+sql的模式進(jìn)行查詢的,也未曾想過數(shù)據(jù)是億萬級(jí)別,用戶也是億萬級(jí)別時(shí)候,cache和sql的入門級(jí)模式是否能應(yīng)對。答案是肯定不能hold住的,現(xiàn)在年長了些,隨著項(xiàng)目的發(fā)展有幸接觸到相關(guān)解決方案,所以想記下來,備忘。 那么老規(guī)則本文主要解決三個(gè)問題: 1.如何解決與設(shè)計(jì)數(shù)據(jù)和用戶都是億萬級(jí)別的搜索的思路。 2.sphinx的簡介與特性 3.sphinx的安裝與運(yùn)行 4.sphinx在億級(jí)項(xiàng)目中的使用場景
首先當(dāng)數(shù)據(jù)量和用戶基數(shù)很大時(shí)候,意味著三個(gè)問題需要解決: 1.查詢的次數(shù)會(huì)很多并且需要快速返回; 2.查詢并發(fā)數(shù)會(huì)很高,如何正確的分流分壓; 3.數(shù)據(jù)的增長會(huì)很快,這部分增長的數(shù)據(jù)如何有效的處理才能實(shí)時(shí)搜索到;
MySQL自身的全文索引搜索慢,定制化程度低,自然無法滿足解決上述問題,那么就需要更高性能的自定義的搜索,sphinx出現(xiàn)了,它提供了針對上述三大問題都有相應(yīng)的解決方案。sphinx是以以俄國全文檢索引擎,提供了高速、低空間占用、高結(jié)果相關(guān)度的全文搜索功能。主要方式是提供符合條件的數(shù)據(jù)源給sphinx,sphinx生成索引,依賴索引對外提供服務(wù)。更重要的是sphinx內(nèi)置mysql數(shù)據(jù)庫數(shù)據(jù)源的支持,使用起來非常簡單,和使用mysql很大程度相似。
我的理解中的sphinx
1.sphinx的機(jī)制兩部分構(gòu)成:生成索引+search索引 2.sphinx索引類型:普通索引+rt實(shí)時(shí)索引+分布式索引
特性(最新版sphinx性能某些方面更高于下面描述)
1.高速的建立索引(在當(dāng)代CPU上,峰值性能可達(dá)到10 MB/秒); 2.高性能的搜索(在2 – 4GB 的文本數(shù)據(jù)上,平均每次檢索響應(yīng)時(shí)間小于0.1秒); 3.可處理海量數(shù)據(jù)(目前已知可以處理超過100 GB的文本數(shù)據(jù), 在單一CPU的系統(tǒng)上可 處理100 M 文檔); 4.提供了優(yōu)秀的相關(guān)度算法,基于短語相似度和統(tǒng)計(jì)(BM25)的復(fù)合Ranking方法; 5.支持分布式搜索; 6.可作為MySQL的存儲(chǔ)引擎提供搜索服務(wù); 7.支持布爾、短語、詞語相似度等多種檢索模式; 8.文檔支持多個(gè)全文檢索字段(最大不超過32個(gè)); 9.文檔支持多個(gè)額外的屬性信息(例如:分組信息,時(shí)間戳等); 10.支持單一字節(jié)編碼和UTF-8編碼; 11.原生的MySQL支持(同時(shí)支持MyISAM 和InnoDB ); 12.原生的PostgreSQL 支持.
反正就是很牛逼就是了。
3.sphinx的安裝與運(yùn)行(此部分轉(zhuǎn)載的)
1.需要安裝的軟件 coreseek的mmseg包 mysql安裝包 sphinx-0.9.8版 sphinx中文分詞補(bǔ)丁1 sphinx中文分詞補(bǔ)丁2
2.安裝libmmseg
tar -zxvf mmseg-0.7.3.tar.gz cd mmseg-0.7.3 ./configure --PRefix=/usr/local/mmseg make make install 1234512345有問題嘗試執(zhí)行下面命令
echo '/usr/local/mmseg/lib' >> /etc/ld.so.conf ldconfig -v ln -s /usr/local/mmseg/bin/mmseg /bin/mmseg1231233.重新編譯mysql 安裝sphinx之前先裝兩個(gè)補(bǔ)丁。
tar -zxvf sphinx-0.9.8-rc2.tar.gz cd sphinx-0.9.8 patch -p1 < ../sphinx-0.98rc2.zhcn-support.patch patch -p1 < ../fix-crash-in-excerpts.patch123412344.安裝sphinx
cd /root/lemp/sphinx-0.9.8-rc2 ./configure --prefix=/usr/local/sphinx --with-mysql=/opt/mysql / --with-mysql-includes=/opt/mysql/include/mysql --with-mysql-libs=/opt/mysql/lib/mysql / --with-mmseg-includes=/usr/local/mmseg/include --with-mmseg-libs=/usr/local/mmseg/lib --with-mmseg make1234512345tokenizer_zhcn.cpp:1:30: SegmenterManager.h: 沒有那個(gè)文件或目錄 tokenizer_zhcn.cpp:2:23: Segmenter.h: 沒有那個(gè)文件或目錄1212make clean ./configure --prefix=/usr/local/sphinx --with-mysql=/opt/mysql / --with-mysql-includes=/usr/local/mysql/include/mysql --with-mysql-libs=/opt/mysql/lib/mysql / --with-mmseg-includes=/usr/local/mmseg/include/mmseg --with-mmseg-libs=/usr/local/mmseg/lib --with-mmseg/root/sphinx/sphinx-0.9.8-rc2/src/tokenizer_zhcn.cpp:34: undefined reference to `libiconv_close' collect2: ld returned 1 exit status123456123456官網(wǎng)解決辦法:In the meantime I've change the configuration file and set#define USE_LIBICONV 0 in line 8179.修改configure 文件把 #define USE_LIBICONV 0 最后的數(shù)值由1改為0重新編譯。1234512345
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注