--------------------------------------------------------------------------------------html
搜索分爲兩種:mysql
1. 對結構化數據搜索:SQL語句對數據庫中存儲的內容進行查詢。linux
2. 對非結構化數據搜索:文本,圖片,全文搜索。算法
全文檢索分爲兩類:sql
1. 順序掃描:如SQL中的LIKE查詢或regexp正則查詢。數據庫
2. 索引掃描:將非結構化數據提取部分(如:詞組)後進行重組,使其機構化,這些提取出的數據即索引。vim
使用索引的全文檢索包括兩個過程:緩存
1. 索引建立(Index):將內容中的詞組 與 文本的ID提取出來,建立一張索引表。socket
2. 搜索索引(Search):將搜索內容拆分紅詞組,去索引表中匹配ID,查出文本內容。分佈式
如何建立索引:
1. 將須要建立索引的文檔交給分詞組件(Tokenizer);
分詞組件所作的事:將文檔生成單獨的單詞,去除標點符號,去除停詞(the, a, 的, 是);每種語言的分詞組件都有一個停詞集合,
通過分詞組件後獲得的結果成爲詞元。
2. 將獲得的詞元(Token)傳給語言處理組件(Linguistic Processer);
語言處理組件對獲得的詞元進行同語言處理:如,英文變爲小寫(Lowercase),將單詞縮減爲詞根形式,如「cars」到「car」等(stemming),將單詞轉變爲詞根形式,如「drove」到「drive」(lemmatization),
3. 將獲得的詞(Term)傳給索引組件(Indexer);
索引組件主要作如下幾件事:利用獲得的詞(Term)和文檔ID,建立一個字典,對字典按字母順序排序,合併相同的詞成爲文檔倒排(Posting List)鏈表。
如何對索引進行搜索:
1. 輸入查詢語句,提交給Sphinx。
2. Sphinx對查詢語句進行詞法分析,語法分析及語言處理。
3. 搜索索引,獲得符合語法樹的文檔。
4. 根據獲得的文檔和查詢語句的相關性,對結果排序。
Sphinx是SQL Parse Index(查詢詞組索引)縮寫,基於SQL的全文檢索引擎。Coreseek支持中文的全文檢索引擎。
Sphinx的優勢:
高速的創建索引(在當代CPU上,可達到10M/秒)
高性能的搜索(在2-4G的文本數據上,平均每次檢索響應時間小於0.1秒)
可處理海量數據(目前已知能夠處理超過100GB的文本數據,在單一CPU的系統上可處理100M的文檔);
提供了優秀的相關度算法,基於短語類似度和統計BM2的複合Ranking方法;
支持分佈式搜索;
提供文檔片斷(摘要以及高亮)生成功能;
可做爲MySQL的存儲引擎提供搜索服務;
支持布爾、短語、詞語類似度等多種檢索方式;
文檔支持多個全文檢索字段(最大不超過32個);
Sphinx的缺點:
必需要有主鍵
主鍵必須爲整形
不負責數據存儲
配置不靈活
Sphinx的使用:
1. 下載Sphinx:
wget http://sphinxsearch.com/files/sphinx-2.2.8-release.tar.gz
編譯安裝:
cd /public/sphinx-2.2.8
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql
(rpm安裝的mysql: ./configure --prefix=/usr/local/sphinx --with-mysql=/usr)
make && make install
安裝完畢獲得四個目錄:
bin:存放命令,indexer索引組件,searchd進程
etc:配置文檔
var:存放索引表
建立數據庫表:
show database; //查看全部數據庫
create database test;
create table post(
id int unsigned auto_increment primary key,
title varchar(255) not null default '',
content text default NULL
)engine=myisam default charset=utf8;
desc post; //查看錶結構
insert into post(title, content) values("linux", "linux11111");
2. 配置Sphinx:
cd /usr/local/sphinx/etc/
cp sphinx.conf.dist sphinx.conf //備份配置文件,防止改錯
vim sphinx.conf
配置文件結構:
# 主數據源,(main名字可更改)
source main{
type = mysql #數據庫類型
sql_host = localhost #MySQL主機IP
sql_user = test #MySQL用戶名
sql_pass = #MySQL密碼
sql_db = test #MySQL數據庫
sql_port = 3306 #MySQL端口
sql_sock = /tmp/mysql.sock #Linux下須要開啓,指定sock文件
sql_query_pre = SET NAMES utf8 #MySQL檢索編碼
sql_query_pre = SET SESSION query_cache_type=OFF #關閉緩存
sql_query = \ #獲取數據的SQL語句
SELECT id, title, content FROM post
# 如下是用來過濾或條件查詢的屬性,這裏列出的字段將能夠進行條件查詢,同時不參與全文檢索
#sql_attr_uint = group_id
#sql_attr_timestamp = date_added
}
# 增量數據源(inherited source), 繼承主數據源
source src1throttled : main{
}
# 主索引(local index),(main名字可更改)
index main{
source = main # 指定主數據源
path = /usr/local/sphinx/var/data/main # 索引路徑
}
# 增量索引(inherited index)
index test1stemmed : test1{
}
# 分佈式索引(distributed index)
index dist1{
}
# 實時索引(realtime index)
index rt{
}
# 索引器設置,(調整最小內存到最佳)
indexer{
mem_limit = 256M #內存大小限制,默認128M,推薦256M
#其它用默認便可
}
# 服務進程設置,(監聽端口號)
searched{
#所有默認便可,默認端口號就是9312
}
# 公共配置
common{
}
:set nu //顯示行號,:set nonu取消行號
:311,314s/^/#/g //註釋增量數據源
:628,632s/^/#/g //註釋增量索引
:639,696s/^/#/g //註釋分佈式索引
3. 建立索引:
建立索引命令:indexer
-c 指定配置文件
--all 對全部索引從新編制索引
--rotate 用於輪換索引,在不中止服務的時候(searchd運行時)增長索引;searchd運行時不加會報錯。
--merge 合併索引,增量索引合併到主索引的時候用
生成所有索引: /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all
或指定索引(例如main): /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf main
(1)若是這裏出現報錯:
【ERROR: index 'main': sql_connect: Can't connect to local MySQL server through socket '/tmp/mysql.sock'】
沒找到/tmp/mysql.sock, 經過find / -name mysql.sock -print查找到位置,在配置sphinx.conf裏更改正確。
如:mysql_sock = /var/lib/mysql/mysql.sock 保存退出。
(2)繼續建立索引,警告:
【WARNING: Attribute count is 0: switching to none docinfo】
改sphinx.conf裏的docinfo = none就沒有警告了。(http://sphinxsearch.com/docs/current.html#conf-docinfo)
建立索引出現以下提示,表示生成成功:
上面總共是4條數據.
4. 啓動Sphinx:
重建索引:./searchd -c /usr/local/sphinx/etc/sphinx.conf
輪換索引: ./searchd -c /usr/local/sphinx/etc/sphinx.conf goods_list --rotate
./searchd -c /usr/local/sphinx/etc/sphinx.conf store_list --rotate
中止服務:./searchd -c /usr/local/sphinx/etc/sphinx.conf --stop
Link:http://www.cnblogs.com/farwish/p/3961962.html
@黑眼詩人 <farwish.com>