搜索分為兩種:
1. 對結構化數據搜索:SQL語句對數據庫中存儲的內容進行查詢。
2. 對非結構化數據搜索:文本,圖片,全文搜索。
全文檢索分為兩類:
1. 順序掃描:如SQL中的LIKE查詢或regexp正則查詢。
2. 索引掃描:將非結構化數據提取部分(如:詞組)後進行重組,使其機構化,這些提取出的數據即索引。
使用索引的全文檢索包括兩個過程:
1. 索引創建(Index):將內容中的詞組 與 文本的ID提取出來,創建一張索引表。
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 #對排序字段進行注釋, 默認使用sphinx的文檔表,這裡不需要
#sql_attr_timestamp = date_added #對排序字段進行注釋
}
# 增量數據源, 繼承主數據源
source main throttled : main{
}
# 主索引,(main名字可更改)
index main{
source = main
path = /usr/local/sphinx/var/data/main
}
# 增量索引
index test1 stemmed : 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
或生成指定索引: /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)
創建索引出現如下提示,表示生成成功: