Sphinx 優點
高速索引(接近10M/S)
高速搜索(2-4G文本搜索耗時不到0.1秒)
高可用性(單CPU支持100GB文本,100M文檔)
提供相關性排名、分布式搜索、文檔摘要(高亮顯示)
Sphinx 缺點
必須有主鍵
主鍵必須是整形
不負責數據存儲
配置復雜
Sphinx是介於PHP和mysql的中間層,它提供比mysql更專業的搜索功能,性能更高,因為存在於mysql之前,可以更好的緩解數據庫壓力
安裝
sudo apt-get install sphinxsearch -y
安裝完成后在 / etc / sphinxsearch / 目錄下有以下4個文件
example.sql 數據源,用於測試
sphinx.conf.dist 完整的配置,包含全部配置
sphinx.conf.sample 配置參考
sphinx-min.conf.dist 精簡配置,包含主要配置
我們來看看 sphinx-min.conf.dist 中的配置項
拷貝sphinx-min.conf.dist 到當前目錄下 sphinx.conf
源配置:
source src1 { type=mysql sql_host=localhost sql_user=test sql_pass=sql_db=test sql_port= 3306 # optional, default is 3306sql_query=\ SELECTid, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents sql_attr_uint=group_id sql_attr_timestamp=date_added }
源塊包含源代碼,用戶名和密碼到MySQL服務器的類型。 所述的第一列sql_query應該是唯一的ID。 SQL查詢將在每個索引上運行,並將數據轉儲到Sphinx索引文件。 下面是每個字段和源塊本身的描述。
type :數據源索引的類型。 在我們的例子,這是MySQL。 其他支持的類型包括pgsql,mssql,xmlpipe2,odbc等。
sql_host :主機名MySQL的主機。 在我們的例子,這是localhost 。 這可以是域或IP地址。
sql_user :數據庫用戶名
sql_pass :密碼
sql_db :存儲數據的數據庫的名稱
sql_query :查詢從數據庫到索引那轉儲數據。
索引配置:
index test1 { source=src1 path= /var/lib/sphinxsearch/data/test1 }
source :源塊的名稱。 在我們的例子,這是src1的 。
path :路徑保存索引。
端口和常量配置:
searchd { listen= 9312listen= 9306:mysql41 log= /var/lib/sphinxsearch/log/searchd.log query_log= /var/lib/sphinxsearch/log/query.log read_timeout= 5max_children= 30pid_file= /var/run/sphinxsearch/searchd.pid seamless_rotate= 1preopen_indexes= 1unlink_old= 1workers= threads # forRT to work binlog_path= /var/lib/sphinxsearch/data }
該searchd的組件包含端口和其他變量來運行Sphinx守護進程。
listen :這Sphinx守護進程運行的端口,后面的協議。 在我們的例子,這是9306:mysql41。 已知的協議是:Sphinx (SphinxAPI)和:mysql41(SphinxQL)
query_log :路徑保存查詢日志
pid_file :到Sphinx守護進程的PID文件的路徑。
seamless_rotate :同時旋轉海量數據預緩存的指標,防止searchd的攤位。
preopen_indexes :是否強行盤前在啟動時的所有索引。
unlink_old :是否刪除成功旋轉舊的索引拷貝。
管理索引
將數據添加到Sphinx索引
sudo indexer --all
Sphinx 2.2.9-id64-release (rel22-r5006)
Copyright (c) 2001-2015, Andrew Aksyonoff
Copyright (c) 2008-2015, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinxsearch/sphinx.conf'...
indexing index 'test1'...
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.032 sec, 5922 bytes/sec, 122.75 docs/sec
skipping non-plain index 'testrt'...
total 4 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
total 12 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
表示創建索引成功
在生產環境中,有必要保持索引為最新。 為了做到這一點,讓我們創建一個cronjob。 首先,打開crontab
crontab -e
可能會詢問您要使用哪個文本編輯器。 選擇你喜歡的; 在本教程中,我們使用nano 。
隨后的cronjob將每小時運行一次,並使用我們之前創建的配置文件向索引添加新數據。 將其復制並粘貼到文件末尾,然后保存並關閉文件
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
現在Sphinx已經完全設置和配置,我們可以啟動服務並嘗試
啟動 sphinx
默認情況下,Sphinx守護程序關閉。 首先,我們將改變這一行啟用START=no到START=yes中/etc/default/sphinxsearch
sudo sed -i 's/START=no/START=yes/g' /etc/default/sphinxsearch
然后,使用systemctl重啟Sphinx守護進程
sudo systemctl restart sphinxsearch.service
要檢查Sphinx守護程序是否正確運行,請運行
sudo systemctl status sphinxsearch.service
測試
現在,一切都設置好了,讓我們測試搜索功能。 使用MySQL接口連接到SphinxQL(在端口9306上)。 您提示將改變為mysql>
mysql -h0 -P9306
搜索:test1 代表sphinx配置文件中索引名稱 match(搜索條件)
select * from test1 where match('another');
測試關鍵字
CALL KEYWORDS ('test one three', 'test1', 1);
輸出:
+------+-----------+------------+------+------+
| qpos | tokenized | normalized | docs | hits |
+------+-----------+------------+------+------+
| 1 | test | test | 3 | 5 |
| 2 | one | one | 1 | 2 |
| 3 | three | three | 0 | 0 |
+------+-----------+------------+------+------+
3 rows in set (0.00 sec)
在結果上面可以看到,在test1的指數,Sphinx發現:
5個匹配在3個文檔中的關鍵字'test'
2在1個文檔中匹配關鍵字“1”
0匹配0個文檔中的關鍵字'three'