MySQL+Sphinx實現全文搜索

最近在作一個搜索引擎,主要是對圖書方面的對象級的搜索,首先來了解下Sphinx吧。php

它可以提升你的查詢的速度,這個不是通常的快。css

Sphinx是一個基於SQL的全文檢索引擎,能夠結合MySQL,PostgreSQL作全文搜索,他能夠提供比數據庫自己更專業的搜索功能,使得應用程序更容易實現專業化的全文檢索。         Sphinx特別爲一些腳本語言設計搜索API接口,如:PHP、Python、Perl、Ruby等,同時爲MySQL也設計了一個存儲引擎插件。html

Sphinx單一索引最大可包含1億條記錄,在1千萬條記錄狀況下的查詢速度爲毫秒級。Sphinx建立索引的速度爲:建立100萬條記錄的索引只需 3~4分鐘,建立1000萬條記錄的索引能夠在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。python

Sphinx的主要特性包括:mysql

高速索引 (在新款CPU上,近10 MB/秒);
高速搜索 (2-4G的文本量中平均查詢速度不到0.1秒);
高可用性 (單CPU上最大可支持100 GB的文本,100M文檔);
提供良好的相關性排名linux

支持分佈式搜索;nginx

提供文檔摘要生成;c++

提供從MySQL內部的插件式存儲引擎上搜索算法

支持布爾,短語, 和近義詞查詢;sql

支持每一個文檔多個全文檢索域(默認最大32個);

支持每一個文檔多屬性;
支持斷詞;

支持單字節編碼與UTF-8編碼;

看了上面的特色仍是挺不錯的,在看看使用的方式吧.

原生MySQl存儲引擎檢索流程:

基於Sphinx存儲引擎檢索:

我仍是比較喜歡使用第二種存儲引擎,即便你的編程語言不支持Sphinx的API的接口也能夠使用喲。

在開始安裝以前須要安裝一些必要的組件

yum -y install gcc g++ gcc-c++ libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers patch libtool automake imake mysql-devel expat-devel

 

 

 

(1)安裝python支持

yum install –y python python-devel

 

(2)編譯安裝LibMMSeg(LibMMSeg是爲Sphinx全文搜索引擎設計的中文分詞軟件包,其在GPL協議下發行的中文分詞法,採用Chin-Hao Tsai的MMSEG算法。LibMMSeg在本文中用來生成中文分詞詞庫)。

wget http://www.coreseek.com/uploads/sources/mmseg-0.7.3.tar.gz

tar zxvf mmseg-0.7.3.tar.gz

cd mmseg-0.7.3

./configure

make

make install

(1)       編譯安裝MySQL5.1.26-rc、Sphinx、SphinxSE存儲引擎

wget http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.1.26-rc.tar.gz

tar zxvf mysql-5.1.26-rc.tar.gz

 

wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8-rc2.tar.gz

wget http://www.coreseek.com/uploads/sources/sphinx-0.98rc2.zhcn-support.patch

wget http://www.coreseek.com/uploads/sources/fix-crash-in-excerpts.patch

tar zxvf sphinx-0.9.8.rc2.tar.gz

patch –p1 < ../sphinx-0.98rc2.zhcn-support.patch    #補丁

patch –p1 <../fix-crash-in-excerpts.patch     #補丁

cp –rf mysqlse ../mysql-5.1.26-rc/storage/sphinx

cd ../

 

cd mysql-5.1.26-rc/

sh BUILD/autorun.sh

./configure --with-plugins= partition,innobase,myisammrg,sphinx  --prefix=/usr/local/mysql / --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile

make && make install

 cd ../

 

啓動MySQL數據庫

cp support-files/my-medium.cnf /etc/my.cnf # 配置文件

cp support-files/mysql.server /etc/rc.d/mysqld # 添加 MySQL 服務控制

cd /usr/local/mysql

bin/mysql_install_db --user=mysql # 安裝

bin/mysqld_safe --user=mysql & # 測試安裝是否成功

bin/mysql # 進入 MySQL 命令提示符

啓動中止

/etc/rc.d/mysqld start

/etc/rc.d/mysqld stop

因而咱們本身建立文件/etc/rc.local並給予執行權限。大體內容爲:

#!/bin/sh

/usr/local/mysql/bin/mysqld_safe --user=mysql &

或者

/etc/rc.d/mysqld start

輸入下列命令出現SPHINX表示SphinxSE已經移植到MySQL中去了。

show engines;

本文使用的0.9.8版本,建議使用0.9.9版本,0.9.9版本是最妥當的版本,我最後也改爲了0.9.9版本的。

Sphinx默認不支持中文索引及檢索,之前用Coreseek的補丁來解決,目前Coreseek不單獨提供補丁,而基於Sphinx開發了Coreseek全文檢索服務器,Coreseek應該是如今用的最多的Sphinx中文全文檢索,它提供了爲Sphinx設計的中文分詞包LibMMSeg包含mmseg中文分詞,其實coreseek-3.2.14.tar.gz中已經包含了sphinx,前面安裝SphinxSE時也能夠使用這個壓縮包裏的mysqlse。

安裝autoconf

tar zxvf autoconf-2.64.tar.gz

cd autoconf-2.64

./configure –prefix=/usr

make

make install

安裝Coreseek

tar zxvf coreseek-3.2.14.tar.gz

cd coreseek-3.2.14

cd mmseg-3.2.14/

./bootstrap

./configure –prefix=/usr/local/mmseg3

make

make install

cd ../csft-3.2.14/

sh buildconf.sh

./configure --prefix=/usr/local/coreseek --without-python --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql --host=arm

make

make install

cd /usr/local/coreseek/etc

進入配置目錄經過命令ls能夠看到3個文件

example.sql  sphinx.conf.dist  sphinx-min.conf.dist

其中example.sql是實例sql腳本咱們將其導入到數據庫中的test數據庫中做爲測試數據(會建立documents表和tags表)

vi sphinx.conf

輸入一些內容:

source src1

{

     type                   = mysql

     sql_host               = localhost

     sql_user               = root

     sql_pass               =12345678

     sql_db                 = test

     sql_port               = 3306   # optional, default is 3306

     sql_sock                              = /tmp/mysql.sock

     sql_query_pre = SET NAMES utf8

     sql_query              = \

         SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \

         FROM documents

     sql_attr_uint          = group_id

     sql_attr_timestamp     = date_added

     sql_query_info              = SELECT * FROM documents WHERE id=$id

}

index test1

{

     source                      = src1

     path                   = /usr/local/coreseek/var/data/test1

     docinfo                     = extern

     charset_type           = zh_cn.utf-8

     mlock              = 0

     morphology         = none

     min_word_len       = 1

     html_strip         = 0

     charset_dictpath       = /usr/local/mmseg3/etc/

     ngram_len                    = 0

}

indexer

{

     mem_limit              = 32M

}

 

 

searchd

{

     port                   = 9312

     log                         = /usr/local/coreseek/var/log/searchd.log

     query_log              = /usr/local/coreseek/var/log/query.log

     read_timeout           = 5

     max_children           = 30

     pid_file               = /usr/local/coreseek/var/log/searchd.pid

     max_matches                 = 1000

     seamless_rotate             = 1

     preopen_indexes             = 0

     unlink_old                  = 1

}

 

說明:代碼段sorce src1{***}表明數據源裏面主要包含了數據庫的配置信息,src1表示數據源名字,能夠隨便寫。

代碼段index test1{***} 表明爲那個數據源建立索引,與source ***是成對出現的,其中的source參數的值必須是某個數據源的名字。

生成索引

/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf --all

 出現的問題:

問題1:若是sh  BUILD/autorun.sh

但sphinx就是不會出如今configure –h裏面,須要執行sh BUILD/cleanup 再執行sh BUILD/autorun.sh 而後執行./configure –h如今就能夠看到sphinx了。

問題2:若是編譯mysql是報錯查看是否安裝ncurses安裝包

能夠執行:yum list|grep ncurses

yum –y install ncurses-devel

yum install ncurses-devel

而後再執行./configure。

問題3 在安裝LibMMSeg須要先執行yum install mysql-devel libxml2-devel expat-devel

問題4 在安裝MMSeg的時候出現錯誤提示爲:css/UnigramCorpusReader.cpp:89: error: 'strncmp' was not declared in this scope

手動修改了src/css/UnigramCorpusReader.cpp

在上面添加了一句

#include <string.h>

而後再開始編譯安裝就能夠了。

相關文章
相關標籤/搜索