sphinx

sphinx

編譯安裝:./configure --prefix=/usr/local/sphinx --with-msyql=/usr/local/mysql
使用mysql作爲數據源  靜

sphinx監聽在9312端口,給其他程序提供調用

sphinx 索引
詞 --> 詞所對應的文本ID

php請求sphinx一個詞語,shpinx去索引檢索這個詞語所對應的文本ID,然後返回文本ID,php根據
文本id去mysql取對應的文本

shpinx創建索引
將文本提取出來傳遞給分詞組件,分詞組件會把詞全部拆分,分詞組件把拆分好的詞傳給語言處理組件,語言處理組件會把詞語還原成原來的樣子
比如說把過去式的詞還原爲原來的詞語,把詞語排序,去重得到唯一值,把詞傳給索引組件,
索引組件會把詞對應相應的文本ID形成索引

分詞組件
1,將文檔分成一個一個單獨的單詞
2,去除標點
3,去除停詞(如is a this,中文的 是 這個)
經過分詞後得到的結果稱爲詞元
詞元經過語言處理組件後得到詞

文檔頻率和詞頻
文檔頻率是指在幾篇文檔出現過,詞頻就是出現過幾次

 sphinx索引表
 詞--->文檔頻率--->文檔號1--->詞頻--->文檔號2--->詞頻......
如:love    2      1  3      2  1....

如何進行搜索
1,用戶提交查詢語句
2,sphinx對查詢語句進行語法詞法分析語言處理
3,搜索索引得到對應的文檔
4,對文檔進行排序

缺點:
必須要有主鍵
主鍵必須爲整型
不負責數據存儲
配置複雜

php要用sphinx要安裝shpinx模塊,就像安裝xcache一樣不過在這之前要
cd coreseek-3.2.14/csft-3.2.14/api/libsphinxclient/
./configure
make && make install
tar xf sphinx-1.1.0
cd sphinx-1.1.0
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx
make && make install
vim /etc/php.ini
extension=sphinx.so


編譯安裝後命令
indexer 創建索引命令,searchd 啓動進程命令 search 命令行搜索命令

---------------
中文分詞
分詞算法:
1,基於字符串匹配
2,基於理解
3,基於統計

字符串匹配
又叫機械分詞,基於字典的
在足夠大的字典中進行詞條匹配,若找到就匹配成功
三個要素:詞典,文本掃描順序,匹配原則


-------------



配置文件

Source 源名稱1{     
#添加數據源,這裏會設置一些連接數據庫的參數比如數據庫的IP、用戶名、密碼等
#設置sql_query、設置sql_query_pre、設置sql_query_range等後面會結合例子做詳細介紹
 ……
}
Index 索引名稱1{
     Source=源名稱1
#設置全文索引
     ……
}
Indexer{
#設置Indexer程序配置選項,如內存限制等
……
}
Searchd{  
#設置Searchd守護進程本身的一些參數
……
}
Source和Index都可以配置多個。

#定義一個數據源
source search_main
{
           #定義數據庫類型
    type                 = mysql
           #定義數據庫的IP或者計算機名
    sql_host             = localhost
           #定義連接數據庫的帳號
    sql_user             = root
           #定義鏈接數據庫的密碼
    sql_pass             = test123
           #定義數據庫名稱
    sql_db               = test
           #定義連接數據庫後取數據之前執行的SQL語句
    sql_query_pre        = SET NAMES utf8
    sql_query_pre        = SET SESSION query_cache_type=OFF
           #創建一個sph_counter用於增量索引
    sql_query_pre        = CREATE TABLE IF NOT EXISTS sph_counter \
                                      ( counter_id INTEGER PRIMARY KEY NOT NULL,max_doc_id INTEGER NOT NULL)
           #取數據之前將表的最大id記錄到sph_counter表中
    sql_query_pre        = REPLACE INTO sph_counter SELECT 1, MAX(searchid) FROM v9_search
           #定義取數據的SQL,第一列ID列必須爲唯一的正整數值
    sql_query            = SELECT searchid,typeid,id,adddate,data FROM v9_search where \
                                      searchid<( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) \
                                        and searchid>=$start AND searchid<=$end
           # sql_attr_uint和sql_attr_timestamp用於定義用於api過濾或者排序,寫多行制定多列
    sql_attr_uint        = typeid
    sql_attr_uint        = id
    sql_attr_timestamp   = adddate
           #分區查詢設置
    sql_query_range      = SELECT MIN(searchid),MAX(searchid) FROM v9_search
           #分區查詢的步長
    sql_range_step       = 1000
           #設置分區查詢的時間間隔
    sql_ranged_throttle  = 0
           #用於CLI的調試
    sql_query_info       = SELECT * FROM v9_search WHERE searchid=$id
}
#定義一個增量的源
source search_main_delta : search_main
{
    sql_query_pre       = set names utf8
           #增量源只查詢上次主索引生成後新增加的數據
#如果新增加的searchid比主索引建立時的searchid還小那麼會漏掉
    sql_query           = SELECT searchid,typeid,id,adddate,data FROM v9_search where  \
                                  searchid>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) \
                                   and searchid>=$start AND searchid<=$end
    sql_query_range     = SELECT MIN(searchid),MAX(searchid) FROM v9_search where \
                                       searchid>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}
 
#定義一個index_search_main索引
index index_search_main
{
           #設置索引的源
    source            = search_main
           #設置生成的索引存放路徑
    path         = /usr/local/coreseek/var/data/index_search_main
           #定義文檔信息的存儲模式,extern表示文檔信息和文檔id分開存儲
    docinfo           = extern
           #設置已緩存數據的內存鎖定,爲0表示不鎖定
    mlock             = 0
           #設置詞形處理器列表,設置爲none表示不使用任何詞形處理器
    morphology        = none
           #定義最小索引詞的長度
    min_word_len      = 1
           #設置字符集編碼類型,我這裏採用的utf8編碼和數據庫的一致
    charset_type      = zh_cn.utf-8
           #指定分詞讀取詞典文件的位置
    charset_dictpath  = /usr/local/mmseg3/etc
           #不被搜索的詞文件裏表。
    stopwords       = /usr/local/coreseek/var/data/stopwords.txt
           #定義是否從輸入全文數據中取出HTML標記
    html_strip       = 0
}
#定義增量索引
index index_search_main_delta : index_search_main
{
    source   = search_main_delta
    path    = /usr/local/coreseek/var/data/index_search_main_delta
}
 
#定義indexer配置選項
indexer
{
           #定義生成索引過程使用索引的限制
    mem_limit        = 512M
}
 
#定義searchd守護進程的相關選項
searchd
{
           #定義監聽的IP和端口
    #listen            = 127.0.0.1
    #listen            = 172.16.88.100:3312
    listen            = 3312
    listen            = /var/run/searchd.sock
           #定義log的位置
    log                = /usr/local/coreseek/var/log/searchd.log
           #定義查詢log的位置
    query_log          = /usr/local/coreseek/var/log/query.log
           #定義網絡客戶端請求的讀超時時間
    read_timeout       = 5
           #定義子進程的最大數量
    max_children       = 300
           #設置searchd進程pid文件名
    pid_file           = /usr/local/coreseek/var/log/searchd.pid
           #定義守護進程在內存中爲每個索引所保持並返回給客戶端的匹配數目的最大值
    max_matches        = 100000
           #啓用無縫seamless輪轉,防止searchd輪轉在需要預取大量數據的索引時停止響應
    #也就是說在任何時刻查詢都可用,或者使用舊索引,或者使用新索引
    seamless_rotate    = 1
           #配置在啓動時強制重新打開所有索引文件
    preopen_indexes    = 1
           #設置索引輪轉成功以後刪除以.old爲擴展名的索引拷貝
    unlink_old         = 1
           # MVA更新池大小,這個參數不太明白
    mva_updates_pool   = 1M
           #最大允許的包大小
    max_packet_size    = 32M
           #最大允許的過濾器數
    max_filters        = 256
           #每個過濾器最大允許的值的個數
    max_filter_values  = 4096
}

二、sphinx的管理
1.    生成Sphinx中文分詞詞庫(新版本的中文分詞庫已經生成在了/usr/local/mmseg3/etc目錄下)
cd /usr/local/mmseg3/etc
/usr/local/mmseg3/bin/mmseg -u thesaurus.txt
mv thesaurus.txt.uni uni.lib
2.   生成Sphinx中文同義詞庫
#同義詞庫是說比如你搜索深圳的時候,含有深圳灣等字的也會被搜索出來
/data/software/sphinx/coreseek-3.2.14/mmseg-3.2.14/script/build_thesaurus.py unigram.txt > thesaurus.txt
/usr/local/mmseg3/bin/mmseg -t thesaurus.txt
將thesaurus.lib放到uni.lib同一目錄
3.    生成全部索引
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf –all
若此時searchd守護進程已經啓動,那麼需要加上—rotate參數:
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --all --rotate
4.    啓動searchd守護進程
/usr/local/coreseek/bin/searchd --config /usr/local/coreseek/etc/sphinx.conf
5.   生成主索引
寫成shell腳本,添加到crontab任務,設置成每天凌晨1點的時候重建主索引
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --rotate index_search_main
6.     生成增量索引
寫成shell腳本,添加到crontab任務,設置成每10分鐘運行一次
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --rotate index_search_main_delta
7.    增量索引和主索引的合併
寫成shell腳本,添加到計劃任務,每15分鐘跑一次
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --merge index_search_main index_search_main_delta --rotate
8.    使用search命令在命令行對索引進行檢索
/usr/local/coreseek/bin/search --config /usr/local/coreseek/etc/sphinx.conf  遊戲
 
網站編碼要統一UTF-8

---------------
【編譯分詞庫mmseg3】
1、首先給 新版本號 命名的目錄下的configure文件賦予可執行權限 chmod u+x configure
2 在所編譯版本目錄下執行
cd mmseg3 && chmod +x bootstrap configure
./bootstrap #輸出的warning信息可以忽略,如果出現error則需要解決

./configure --prefix=/data/postmall/repository/mmseg3
make && make install
cd /data/postmall/search/
ln -snf /data/postmall/repository/mmseg3 mmseg


【編譯sphinx】
1、首先給 新版本號 命名的目錄下的configure文件賦予可執行權限 chmod u+x configure

2、在所編譯版本目錄下執行--編譯
./configure --prefix=/data/postmall/repository/sphinx2/sphinx.{版本號} --with-mmseg-includes=/data/postmall/search/mmseg/include/mmseg --with-mmseg-libs=/data/postmall/search/mmseg/lib --enable-id64

3、make install

*【注意】如果在進行第3步make過程中報錯,需要做以下更改,目的是引入mmseg的庫文件和lib文件
修改src/Makefile
在以下倆項後添加
LIBS爲LIBS=-L/data/postmall/search/mmseg/lib -lmmseg -lrt
CPPFLAGS爲 CPPFLAGS=-I/data/postmall/search/mmseg/include/mmseg

make install

4拷貝sphinx配置文件以及 mmseg生成的庫文件至新目錄
cd /data/postmall/search/sphinx2
cp mmseg.ini uni.lib /data/postmall/repository/sphinx2/sphinx.{版本號}
cp ./etc/* /data/postmall/repository/sphinx2/sphinx.{版本號}/etc/


5 停止API 的JAVA程序以及 增量推送程序searchBox{35 36} (注意 倆組類型不同,這裏的操作也不同, 選擇當前環境進行執行)
ps -ef|grep RTSE.Interface|awk '{print $2}'|xargs kill -9
ps -ef|grep searchb|awk '{print $2}'|xargs kill -9

5 停止API的TOMCAT以及增量推送程序 RTSE_Indexer (55 58 59)
ps -ef|grep tomcat1|awk '{print $2}'|xargs kill -9
ps -ef|grep RTSE_indexer|awk '{print $2}'|xargs kill -9

6 停止sphinx2 (注意 不同項目sphinx2後面的配置文件不同,主要是在啓動命令後加--stop進行停止)
/data/postmall/search/sphinx2/bin/searchd -c /data/postmall/search/sphinx2/etc/psbc_score_mall_listing.conf --stop

7 做軟連接 進行版本更新
cd /data/postmall/search,然後 ln -snf /data/postmall/repository/sphinx2/sphinx.{版本號}/ sphinx2


8啓動sphinx2

/data/postmall/search/sphinx2/bin/searchd -c /data/postmall/search/sphinx2/etc/psbc_score_mall_listing.conf

9進行sphinx2功能檢查

mysql -h0 –P 6906 // 檢查連通性
mysql> show LISTING; //檢查索引完整、存在
mysql> desc LISTING; // 檢查索引結構
mysql> select * from LISTING; // 檢查索引數據採樣
mysql> select count(*) from LISTING; // 檢查索引彙總功能
mysql> select * from LISTING where id = -1; // 選擇一個未被佔用的數值準備測試插入、刪除,推薦-1
mysql> insert into LISTING (id) values(-1); // 檢查索引可以insert
mysql> select * from LISTING where id = -1; // 檢查索引可以insert後可select
mysql> delete from LISTING where id = -1; // 檢查索引可以delete
mysql> select * from LISTING where id = -1; // 檢查索引可以insert後可select
mysql>\q // 結束測試

10 啓動api進程以及增量推送進程
35,36
====
/usr/local/jdk/bin/java -jar /data/postmall/repository/RTSE.Interface/RTSE.Interface.jar -k startService >/dev/null &

/usr/local/jdk/bin/java -jar /home/web/searchb/searchbox.jar -k maall >/dev/null 2>&1 &
====
55,58,59
~/t1_restart.sh
/usr/local/jdk/bin/java -jar /data/postmall/search/RTSE.Indexer/RTSE.Indexer.jar -k startService > /dev/null 2>&1 &
---------------

安裝coreseek
tar xf coreseek
1,先安裝mmseg
yum -y install glibc-common libtool autoconf automake mysql-devel expat-devel gcc-c++
cd mmseg-3.2.14
#automake
./bootstrap
./configure --prefix=/usr/local/mmseg
make && make install
測試
[root@node3 mmseg-3.2.14]# /usr/local/mmseg/bin/mmseg -d /usr/local/mmseg/etc src/t1.txt
中文/x 分/x 詞/x 測試/x
中國人/x 上海市/x

具體步驟看官網
http://www.coreseek.cn/products-install/install_on_bsd_linux/

2,安裝csft
cd csft-3.2.14
sh buildconf.sh    #輸出的warning信息可以忽略,如果出現error則需要解決
./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg=/usr/local/mmseg  --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ --with-mysql=/usr/local/mysql
make && make install
##配置測試,測試是否可以正確運行
$ /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx-min.conf.dist

mysql數據源的配置可參考testpack/etc/csft_mysql.conf文

詞典的構造


cp一個配置文件
cp spinx.conf.dist csft.conf
註釋stopwords wordfomns excptions

增量索引
在mysql裏創建一個表,用於記錄在建立完全索引時最大的文本ID值
mysql> create table sph_counter(counter_id int unsigned auto_increment primary key,max_doc_id int);
mysql> insert into sph_counter select 1,2;
mysql> select * from sph_counter;
+------------+------------+
| counter_id | max_doc_id |
+------------+------------+
|          1 |          2 |
+------------+------------+
1 row in set (0.00 sec)

mysql> replace into sph_counter select 1,3;
mysql> select * from sph_counter;
+------------+------------+
| counter_id | max_doc_id |
+------------+------------+
|          1 |          3 |
+------------+------------+
1 row in set (0.00 sec)

用於更新計數器表
sql_query_pre = replace into sqh_counter select 1,max(id) from t1

主數據源語句
sql_query = select id,tit,cnt from t1 where id<=(select max_doc_id from sph_counter where counter_id=1)

增量數據源語句
sql_query = select id,tit,cnt from t1 where id>(select max_doc_id from sph_counter where counter_id=1)



分區段查詢
# in sphinx.conf

sql_query_range    = SELECT MIN(id),MAX(id) FROM documents
sql_range_step = 1000
sql_query = SELECT * FROM documents WHERE id>=$start AND id<=$end

如果這個表(documents)中,字段ID的最小值和最大值分別是1 和2345,則sql_query將執行3次:

將 $start 替換爲1,並且將 $end 替換爲 1000;
將 $start 替換爲1001,並且將 $end 替換爲 2000;
將 $start 替換爲2001,並且將 $end 替換爲 2345.
顯然,這對於只有2000行的表,分區查詢與整個讀入沒有太大區別,但是當表的規模擴大到千萬級(特別是對於MyISAM格式的表),分區區段查詢將提供一些幫助。

4.7. 分佈式搜索

爲提高可伸縮性,Sphnix提供了分佈式檢索能力。分佈式檢索可以改善查詢延遲問題(即縮短查詢時間)和提高多服務器、多CPU或多核環境下的吞吐率(即每秒可以完成的查詢數)。這對於大量數據(即十億級的記錄數和TB級的文本量)上的搜索應用來說是很關鍵的。

其關鍵思想是對數據進行水平分區(HP,Horizontally partition),然後並行處理。
在不同服務器上設置Sphinx程序集(indexer和searchd)的多個實例;
讓這些實例對數據的不同部分做索引(並檢索);
在searchd的一些實例上配置一個特殊的分佈式索引;
然後對這個索引進行查詢.


agent = specification:remote-indexes-list
specification = hostname ":" port | path
“hostname”是遠程主機名,“port”是遠程TCP端口,而“remote-index-list”是一個逗號分隔的遠程索引列表。

全部代理會被並行搜索。然而同一個代理的多個索引是依次搜索的。這使您可以根據硬件來優化配置。
利用分佈式索引給本地加速
index dist
{
    type = distributed
    local = chunk1
    agent = localhost:9312:chunk2
    agent = localhost:9312:chunk3
    agent = localhost:9312:chunk4
}
注意其中一塊是本地搜索的,而同一個searchd示例又向本身查詢,以便並行地啓動其他三個搜索。

index poi_dist  
{  
    type        =   distributed            #### 設置爲分佈式搜索  
    local       =   poi_name               #### 設置查詢本地全量索引  
    local       =   poi_name_incr          #### 設置查詢本地增量索引  
    local       =   poi_rt                 #### 設置查詢本地實時索引  
    agent       =   srv24:9340:poi_name    #### 也可以通過agent來進行查詢遠程全量索引  
}  

示例:
agent = localhost:9312:chunk2 # contact itself
agent = /var/run/searchd.s:chunk2
agent = searchbox2:9312:chunk3,chunk4 # search remote indexes

1:主配置文件 dist.conf
source sour1{}建立源1
index index1{}建立索引1   
index dist{
      type = distributed //表示爲分佈式
      local = index1    //本地索引
      agent = localhost:9311:index2   //分佈式其它索引ip地址端口和索引名稱  可以有多個
}
searchd{
 listen = 9312
pid_file = F:/www/sphinx/data/searchd_mysql.pid
}
2:第二個配置文件 dist1.conf
source source2{}
index index2{}
searchd{
 listen = 9311//這裏的端口和pid_file一定不要和上面的重複,應爲這要分別開始守護進程的,避免衝突
pid_file = F:/www/sphinx/data/searchd_mysqls.pid
}
然後先開dist1.conf的searchd守護,然後再開dist.conf守護,就可以用了,
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章