一、sphinx 全文检索

通过sphinx检索到id,然后到mysql里面拿到记录

什么是劝我呢检索?

结构化数据: 具有固定格式或者长度的数据

非结构化数据: 标题 内容 等不定长的数据

非机构化数据还叫做"全文数据"

检索分为两个过程:

索引创建 和 搜索索引

检索结构

php -> sphinx -> mysql

非结构化数据又叫全文数据,非固定长度字段例如文章标题搜索这类适用sphinx

全文数据搜索:

顺序扫描 : 如like查找

索引扫描 : 把非结构化数据中的内容提取出来一部分重新组织,这部分数据就叫做索引

全文检索分为两个过程

1.创建索引

2.搜索索引

创建索引:

sphinx通过语言处理组件会把搜索语句中的标点符号,语气助词给过滤掉,然后处理完毕后会

分析出一些词语,传给索引组件,然后排序去除重复词语.

搜索索引:

搜索关键字 提交 -> sphinx 分析出文档ID -> mysql通过ID查询数据并返回

中文分词需要coreseek

coreseek 支持中文的全文检索引擎

sphinx的安装

下载源码包 进行源码安装

./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql

make && make install

sphinx 中重要的三个命令(bin目录下)

Indexer 创建索引命令

Searchd 启动进程命令

Search 命令行搜索命令

配置sphinx

cd /usr/local/sphinx/etc

cp sphinx.conf.dist sphinx.conf

vi sphinx.conf

配置文件

名为main的主数据源:source main{}

继承名为main的增量数据源:source delta:main{}

名为main的主索引:index main{}

继承名为main的增量索引:index delta:main{}

分布式索引:index dist1{}

索引器:indexer{}

服务进程:searchd{}

修改配置文件中主数据源的mysql配置,测试环境的数据源名为main,假设mysql中test有张表叫post

source main

{

# data source type. mandatory, no default value

# known types are mysql, pgsql, mssql, xmlpipe, xmlpipe2, odbc

type = mysql

#####################################################################

## SQL settings (for 'mysql' and 'pgsql' types)

#####################################################################

# some straightforward parameters for SQL source types

sql_host = localhost

sql_user = root

sql_pass = admin

sql_db = test

sql_port = 3306 # optional, default is 3306

sql_sock = /tmp/mysqld.sock #如果是linux下需要开启,指定sock文件

sql_query_pre = SET NAMES utf8

sql_query_pre = SET SESSION query_cache_type=OFF #关闭缓存

# main document fetch query

# mandatory, integer document ID field MUST be the first selected column

sql_query = \ #获取数据的sql语句

SELECT id,title,content FROM post

#sql_attr_uint = group_id #对排序字段进行注释

#sql_attr_timestamp = date_added #对排序字段进行注释

sql_query_info = SELECT * FROM post WHERE id=$id

}

注释掉所有增量数据源,修改主索引

index main

{

source = main

# index files path and file name, without extension

# mandatory, path must be writable, extensions will be auto-appended

path = /usr/local/sphinx/var/data/main


docinfo = extern

mlock = 0

morphology = none

# default is 1 (index everything)

min_word_len = 1

# charset encoding type

# optional, default is 'sbcs'

# known types are 'sbcs' (Single Byte CharSet) and 'utf-8'

charset_type = utf-8

# 'utf-8' default value is

# charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F

}

注释掉所有的增量索引和分布式索引

 

配置完成后,创建索引

命令 indexer

-c 指定配置文件

--all 对所有索引重新编制索引

--rotate 用于轮换索引,主要是在不停止服务的时候,增加索引

--merge 合并索引

/usr/local/sphinx/sbin/indexer -c

/usr/local/sphinx/etc/sphinx --all

如果报错./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory

解决方式:cp /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18

测试

建立索引

[root@localhost bin]# ./indexer --all

Sphinx 0.9.9-release (r2117)

Copyright (c) 2001-2009, Andrew Aksyonoff

using config file '/usr/local/sphinx/etc/sphinx.conf'...

indexing index 'main'...

collected 2 docs, 0.0 MB

sorted 0.0 Mhits, 100.0% done

total 2 docs, 47 bytes

total 0.033 sec, 1414 bytes/sec, 60.21 docs/sec

total 1 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg

total 5 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg

搜索

[root@localhost bin]# ./search linux1

Sphinx 0.9.9-release (r2117)

Copyright (c) 2001-2009, Andrew Aksyonoff

using config file '/usr/local/sphinx/etc/sphinx.conf'...

index 'main': query 'linux1 ': returned 1 matches of 1 total in 0.000 sec

displaying matches:

1. document=1, weight=1

id=1

title=linux1

content=salflsdkjsdglds

words:

1. 'linux1': 1 documents, 1 hits

sphinx相当于把数据库数据索引静态化到本地 来加快查询速度 避免消耗数据库,给数据库给降压,当数据更新的时候,需要重新indexer --all 或者用 indexer main重建所有索引 才会搜出新的数据

 

安装CORESEEK

coreseek里有2个文件夹 一个是mmseg中文分词包 还有一个是csft(其实就是sphinx)包 都要安装

首先安装mmseg中文分词

./configure --prefix=/usr/local/mmseg

编译时可能会报错config.status: error: cannot find input file: src/Makefile.in

通过automake来解决

首先检查是否安装了libtool如果没有

yum -y install libtool

automake

如果automake报错 原因可能是下列

Libtool library used but `LIBTOOL' is undefined

The usual way to define `LIBTOOL' is to add `AC_PROG_LIBTOOL'

to `configure.ac' and run `aclocal' and `autoconf' again.

If `AC_PROG_LIBTOOL' is in `configure.ac', make sure

its definition is in aclocal's search path.

原因分析

aclocal是个扫描程序, 负责扫描configure.ac中所有的宏定义并展开,

上面产生的原因就是找不到LIBTOOL宏的定义之处造成的.原因就是aclocal与libtool没有安装在一个相同目录下面aclocal是去默认 安装目录 /usr/share/aclocal下面搜索所有的.m4文件找所定义的宏,但是由于安装了多个aclocal,可能aclocal目录不存在,实际目录为/usr/share/aclocal1.10等,

这就造成了aclocal找不到m4文件的情况, 解决办法就是将文件夹aclocal1.10重命名为aclocal.或者显示指定路径 aclocal -I /usr/share/aclocal1.10 -I /usr/share/libtool/m4 --install 或者把/usr/share/libtool/m4下面的文件都copy至/usr/share/aclocal1.10中.

本人的机器上是/usr/share/下有2个文件夹 一个是aclocal,一个是aclocal-1.11,首先将aclocal的所有文件拷贝到aclocal-1.11下

cp -R /user/share/aclocal/* /usr/share/aclocal-1.11/

然后重新运行aclocal和autoconf

aclocal && autoconf

最后再次运行automake

automake

然后继续mmseg的安装

./configure --prefix=/usr/local/mmseg

make && make install

如果make 报错

There is an easy fix when you get such messages as "X--tag=CXX: command not found".

Just type:

export echo=echo

And try again.

所以输入

export echo=echo

然后再次运行安装

make && make install

安装csft

./configure --prefix=/usr/local/coreseek --with-mysql=/usr/local/mysql --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/

make && make install

安装完毕后 注意 coreseek 中的配置文件也是csft.conf 而不是 sphinx.conf

cd /usr/local/coreseek/etc

cp sphinx.conf.dist csft.conf

vim csft.conf

有些配置改动如下其他配置内容如上文的sphinx.conf

在索引源中注释掉txt

index main{

#stopwords = G:\data\stopwords.txt

#wordforms =G:\data\wordforms.txt

#exceptions =/data/exceptions.txt

#charset_type = sbcs

#添加下面2行 意思是把中文分词加入到配置文件中

char_type = zh_cn.utf-8

charset_dictpath =/usr/local/mmseg/etc/ #你安装mmseg的目录

}

保存配置

建立索引

cd /usr/local/coreseek/bin

./indexer --all

./search 中文词缀

如何用php去使用sphinx

Sphinx集成到php程序中有两种方式

1.Sphinx php 模块(这次我们选择使用的方式)

2.Sphinx api 类(位于coreseek源码包里的csft里的api文件夹里有一个sphinxapi.php,使用的时候包含这个php文件即可)

我们要使用sphinx需要做以下几件事:

1.首先要有数据

2.建立sphinx配置文件

3.生成索引

4,启动searchd 服务进程,并开启端口9312

5.用php客户程序去链接sphinx服务

/usr/local/coreseek/bin/searchd

启动进程命令 searchd

-c 指定配置文件

--stop 停止服务

--pidfile 显示指定pid文件

-p 指定端口(默认9312)

注意:这里启动的服务是searchd

使用php sphinx的模块

下载 sphinx-1.1.0.tgz

tar zvxf sphinx-1.1.0.tgz

cd sphinx-1.1.0

/usr/local/php/bin/phpize #用于生成一个configure的脚本

进入coreseek源码包的csft/api/libsphinxclent 目录下执行configure

./configure

make && make install

进入sphinx-1.1.0.gzt的源码包目录下 执行configure用于生成so 的shpinx模块

./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-sphinx

make && make install

安装成功后会有提示

Build complete.

Don't forget to run 'make test'.

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/ (这个目录是sphinx.so所在的目录)

然后我们编辑php的ini文件 在extension中加入

extension=sphinx.so

然后重启nginx和php的服务

最后打印一下phpinfo 查看sphinx是否开启成功

如果成功开启 就可以使用php手册里的sphinx的方法和代码了