【php精品源码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了php精品源码-搭建Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词搜索引擎架构 - 其它资料的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
SphinxMySQL5.1xSphinxSEmmseg 中文分词 搜索引擎架构搭建手记 什么是 Sphinx Sphinx 是一个全文检索引擎,一般而言,Sphinx 是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。
Sphinx 可以非常容易的与 SQL 数据库和脚本语言集成。
当前系统内置 MySQL 和 PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式的 XML 数据。
通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的 DBMS 的原生支持)。
Sphinx 的特性 高速的建立索引在当代 CPU 上,峰值性能可达到 10 MB/秒 高性能的搜索在 2 – 4GB 的文本数据上,平均每次检索响应时间小于 0.1 秒 可处理海量数据目前已知可以处理超过 100 GB 的文本数据 在单一 CPU 的系统上可处理 100 M 文档 提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合 Ranking 方法 支持分布式搜索 provides document exceprts generation 可作为 MySQL 的存储引擎提供搜索服务 支持布尔、短语、词语相似度等多种检索模式 文档支持多个全文检索字段最大不超过 32 个 文档支持多个额外的属性信息例如:分组信息,时间戳等 停止词查询 支持单一字节编码和 UTF-8 编码 原生的 MySQL 支持同时支持 MyISAM 和 InnoDB 原生的 PostgreSQL 支持.安装 本文以 CentOS5.5mysql-5.1.55sphinx-0.9.9(coreseek-3.2.14.tar.gz)为例介绍 SphinxMySQL5.1xSphinxSE 存储引擎mmseg 中文分词搜索引擎架构搭建过程。
1.安装 MySQLSphinxSE,进入软件包目录 tar zxvf mysql-5.1.55.tar.gz tar zxvf sphinx-0.9.9.tar.gz cp -r sphinx-0.9.9/mysqlse/ mysql-5.1.55/storage/sphinx 把 sphinx 的源代码复制到 mysql
源码中 cd mysql-5.1.55 ./BUILD/autorun.sh ./configure --prefix/usr/local/webserver/mysql/ --enable-assembler --with-extra-charsetscomplex --enable-thread-safe-client--with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --with-pluginspartitioninnobasemyisammrgsphinx make make install /usr/sbin/groupadd mysql /usr/sbin/useradd -g mysql mysql chmod w /usr/local/webserver/mysql chown -R mysql:mysql /usr/local/webserver/mysql ①、创建 MySQL 数据库存放目录 --------------------------------- mkdir -p /data0/mysql/3306/data/ chown -R mysql:mysql /data0/mysql/ --------------------------------- ②、以 mysql 用户帐号的身份建立数据表: --------------------------------- /usr/local/webserver/mysql/bin/mysql_install_db --basedir/usr/local/webserver/mysql--datadir/data0/mysql/3306/data --usermysql ---------------------------------③、创建 my.cnf 配置文件: -------------------------------- vi /data0/mysql/3306/my.cnf -------------------------------- my.cnf 输入以下内容: client default-character-set utf8 port 3306 socket /tmp/mysql.sock mysql no-auto-rehash mysqld user mysql port 3306 socket /tmp/mysql.sock basedir /usr/local/webserver/mysql datadir /data0/mysql/3306/data open_files_limit 10240 back_log 600 max_connections 3000 max_connect_errors 6000 table_cache 614 externallocking FALSE max_allowed_packet 32M sort_buffer_size 2M join_buffer_size 2M thread_cache_size 300 thread_concurrency 8 query_cache_size 32M query_cache_limit 2M query_cache_min_res_unit 2k default-storage-engine MyISAMdefault_table_type MyISAMthread_stack 192Ktransaction_isolation READ-COMMITTEDtmp_table_size 246Mmax_heap_table_size 246Mlong_query_time 1log_long_formatlog-bin /data0/mysql/3306/binlogbinlog_cache_size 4Mbinlog_format MIXEDmax_binlog_cache_size 8Mmax_binlog_size 512Mexpire_logs_days 7key_buffer_size 256Mread_buffer_size 1Mread_rnd_buffer_size 16Mbulk_insert_buffer_size 64Mmyisam_sort_buffer_size 128Mmyisam_max_sort_file_size 10Gmyisam_repair_threads 1myisam_recoverskip-name-resolvemaster-connect-retry 10slave-skip-errors 103210621261114114610481396server-id 1mysqldumpquickmax_allowed_packet 32M-------------------------------- 开启 MYSQL: ---------------/usr/local/webserver/mysql/bin/mysqld_safe --defaults-file/data0/mysql/3306/my.cnf 21 /dev/null ------------------------------------------------------------------------------------------- 关闭 MYSQL: ---------------/usr/local/webserver/mysql/bin/mysqladmin -u root -p -S /tmp/mysql.sock shutdown-----------------------------------------------------------⑦、通过命令行登录管理 MySQL 服务器(提示输入密码时直接回车):---------------------------------------------------------------- /usr/local/webserver/mysql/bin/mysql -u root -p -S /tmp/mysql.sock----------------------------------------------------------------。
安装完成启动 MySQL 后查看 sphinx 存储引擎是否安装成功 在 mysql 命令行下执行 show engines 如果出现如下图红色方框内的信息说明 SphinxSE 已经安装成功! 安装 Sphinx 全文检索服务器 Sphinx 默认不支持中文索引及检索, 以前用 Coreseek 的补丁来解决,目前 Coreseek 不单独提供补丁文件,而基于 sphinx 开发了 Coreseek 全文检索服务器,Coreseek 应该是现在用的最多的 sphinx 中文全文检索, 它提供了为 Sphinx设计的中文分词包 LibMMSeg 包含 mmseg 中文分词, 其实 coreseek-3.2.14.tar.gz 中已经包含了 sphinx,前面安装 SphinxSE时也可以使用这个压缩包里的 mysqlse。
我们来看一下的安装过程: 安装 autoconf Bzip2 –d autoconf-2.65.tar.bz2 tar xvf autoconf-2.65.tar cd autoconf-2.65 ./configure --prefix/usr make make install cd .. 安装 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/usr/local/webserver/mysql --hostarm make make install ln -s /usr/local/webserver/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib 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 输入以下内容 定义一个数据库源,名字为 src1 source src1 type mysql sql_host localhost sql_user root sql_pass sql_db test sql_port 3306 optional default is 3306 sql_sock /tmp/mysql.sock sql_query_pre SET NAMES utf8 sql_query SELECT idtitlecontent FROM songs sql_query_info SELECT FROM songs WHERE idid 定义建立索引项 index test1 source src1 path /usr/local/coreseek/var/data/test1 charset_type zh_cn.utf-8 charset_dictpath /usr/local/mmseg3/etc/ 建索引程序的设置 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 说明: 代码段 source src1 代表数据源里面主要包含了数据库的配置信息,src1 表示数据源名字可以随便写。
代码段 index test1 代表为哪个数据源创建索引与 source 是成对出现的,其中的 source 参数的值必须是某一个数据源的名字。
其他参数可以查看手册,这里不再赘述。
生成索引 /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf --all 其中参数--all 表示生成所有索引 当然也可以是索引的名字例如:/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf test1 执行后可以在/usr/local/coreseek/var/data 目录中看到多出一些文件是以索引名为文件名的不同的扩展名的文件 在不启动 sphinx 的情况下即可测试命令: /usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/sphinx.conf number可以看到将内容中含有 number 数据的数据查询出来。
/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/sphinx.conf 研究生创业 可以看到我们输入的查询文字已经被拆分成了两个词,只是因为我们的测试数据中没有中文数据查询结果为空。
我们插入几条新数据。
INSERT INTO test.documents id group_id group_id2 date_added title content VALUES NULL 2 3 2011-02-01 00:37:12 研究生的故事 研究生自主创业 NULL 1 1 2011-01-28 00:38:22 研究 为了创业而研究生命科学 我们再来看以下数据库中的主要数据 插入新数据后需要重新生成索引 /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf test1 然后执行查询测试 /usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/sphinx.conf 研究生创业 我们搜索的词语是“研究生创业”,可以看到词语被拆分成了研究生和创业两个词虽然有两条记录都包含“创业和”研究生”这几个字但是“研究生命科学”中的“研究生”三个字虽然是紧挨着的但是不是一个词语,结果是只匹配一条“研究生自主创业”,我们在搜索“研究”这个词语 /usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/sphinx.conf 研究 同样匹配一条记录,而“研究生的故事”和“研究生自主创业”的词语却没有被查询出来,可以看出 sphinx 与分词技术结合可以匹配出相关度更高的结果。
当然我们的目的不仅限与命令行下的测试, 我们可以通过搜索 API 调用来执行搜索, 搜索 API 支持
PHP、Python、Perl、Rudy 和 Java。
如果从
PHP 脚本检索需要先启动守护进程 searchd,
PHP 脚本需要连接到 searchd 上进行检索: /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/sphinx.conf在解压后的 sphinx-0.9.9/api 目录下的 sphinxapi.
php 就是 sphinx 官方为我们提供的 API 文件(其实也可以使用
PHP 的 ,只需将其包含进自己的
PHP 脚本文件就可以了。
sphinx 扩展)示例代码: 执行后的结果: Array error warning status 0 fields Array 0 title 1 content attrs Array group_id 1 date_added 2 matches Array 5 Array weight 2 attrs Array group_id 2 date_added 1296491832 total 1 total_found 1 time 0.078 words Array 研究生 Array docs 1 hits 2 创业 Array docs 2 hits 2 在 matches 中的就是查询结果,我们注意到 sphinx 是将记录中的主键 ID 值返回而不是返回所有数据,上面的例子中的键名 5 就是记录的 ID(如果在查询前执行cl-SetArrayResult true 则数组结构会有些许差异)。
至此搜索服务器已经为我们完成了大部分工作,接下来我们通过主键 ID 值来查询我们想要的数据就可以了。
Sphinx 存储引擎的使用 SphinxSE 是一个可以编译进 MySQL 5.x 版本的 MySQL 存储引擎,它利用了该版本 MySQL 的插件式体系结构。
尽管被称作 , “存储引擎”SphinxSE 自身其实并不存储任何数据。
它其实是一个允许 MySQL 服务器与 searchd 交互并获取搜索结果的嵌入式客户端。
所有的索引和搜索都发生在 MySQL 之外。
SphinxSE 的适用于: 使将 MySQL FTS 应用程序移植到 Sphinx 使没有 Sphinx API 的那些语言也可以使用 Sphinx 当需要在 MySQL 端对 Sphinx 结果集做额外处理(例如对原始文档表做 JOIN,MySQL 端的额外过滤等等)时提供优化。
要通过 SphinxSE 搜索,需要建立特殊的 ENGINESPHINX 的“搜索表”,然后使用 SELECT 语句从中检索,把全文查询放在 WHERE 子句中。
创建一张表 t1 CREATE TABLE t1 id INTEGER UNSIGNED NOT NULL weight INTEGER NOT NULL query VARCHAR3072 NOT NULL group_id INTEGER INDEXquery ENGINESPHINX CONNECTIONsphinx://localhost:9312/test1 搜索表前三列的类型必须是 INTEGER,INTEGER 和 VARCHAR,这三列分别对应文档 ID,匹配权值和搜索查询。
查询列必须被索引,其他列必须无索引。
列的名字会被忽略,所以可以任意命名,参数 CONNECTION 来指定用这个表搜索时的默认搜索主机、端口号和索引,语法格式:CONNECTIONsphinx://HOST:PORT/INDEXNAME。
执行 SQL 语句 select d.idd.titled.content from t1 join documents as d on t1.id d.id and t1.query 研究生创业 ----------------------------------------------- id title content ----------------------------------------------- 5 研究生的故事 研究生自主创业 ----------------------------------------------- 1 row in set 0.04 sec 结果返回了我们想要的数据,可见利用 SphinxSE 可以仅仅在 SQL 语句上做很小的改动即可很方便的实现全文检索! 主索引 增量索引 前提:数据不会被改变 第一步:建表: 用来存索引过的最大的记录 id Create table a Id int unsigned not null primary key Max_id int unsigned 第二步:修改配置文件为:见 sphinx 配置文件.doc 第三步:先执行 ./bin/indexer –c ./etc/sphinx.conf –test1 生成所有的索引-〉一个数据源的主查询,只有第一次执行 第四步:定期执行:./bin/indexer –c ./etc/sphinx.conf delta --rotate 生成增量的索引文件 第五步:合并到主索引中 ./bin/indexer –merge test1 delta –c ./etc/sphinx.conf --rotate
上一篇:
微信公众平台入门到精通vol.17
下一篇:
什么是“双核心期刊”