nginx + PHP 的 sphinx全文索引

admin 2022年4月8日09:04:13安全闲碎评论15 views5582字阅读18分36秒阅读模式

By:0x584A Date:2015年11月24日 00:33:30

原理

首先通过sphinx对数据库里面的数据建立索引文件,通过PHP调用sphinx实例化对象,通过其返回的ID值去查mysql中的数据
因为ID一般都是设置为主键索引,所以提升了查询效率,一步到位。

环境

操作系统:CentOS 7.0 x64

服务器IP地址:121.42.151.168

Web环境:Nginx+PHP+MySQL

站点根目录:/usr/local/nginx/html

1 CoreSeek下:

wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz

2 安装编译工具

yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel

  • 安装mmseg

    • 需提前安装操作系统基础开发库及mysql依赖库以支持mysql数据源和xml数据源

      $ cd mmseg-3.2.14 $ ./bootstrap    #输出的warning信息可以忽略,如果出现error则需要解决 $ ./configure --prefix=/usr/local/mmseg3 $ make && make install $ cd ..
  • 安装coreseek

    $ cd csft-3.2.14 或者 cd csft-4.0.1 或者 cd csft-4.1 $ sh buildconf.sh    #输出的warning信息可以忽略,如果出现error则需要解决 $ ./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql    ##如果提示mysql问题,可以查看MySQL数据源安装说明 $ make && make install

3 (自信的可以省略这一步)测试mmseg分词,coreseek搜索(需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文)

$ cd /home/ftp/coreseek-3.2.14/testpack/

$ cat /home/ftp/coreseek-3.2.14/testpack/var/test/test.xml

  • 此时应该正确显示中文,如下图所示

nginx + PHP 的 sphinx全文索引

$ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc /home/ftp/coreseek-3.2.14/testpack/var/test/test.xml

nginx + PHP 的 sphinx全文索引

$ /usr/local/coreseek/bin/indexer -c /home/ftp/coreseek-3.2.14/testpack/etc/csft.conf --all

nginx + PHP 的 sphinx全文索引

$ /usr/local/coreseek/bin/search -c /home/ftp/coreseek-3.2.14/testpack/etc/csft.conf 网络搜索

nginx + PHP 的 sphinx全文索引

  • 启动服务,更新索引

$ /usr/local/coreseek/bin/indexer -c /home/ftp/coreseek-3.2.14/testpack/etc/csft.conf --all --rotate

nginx + PHP 的 sphinx全文索引

  • 测试MySQL数据源:

    测试数据库下载:http://www.coreseek.cn/uploads/csft/test/documents.sql

    上传documents.sql到/home/目录

    导入数据库到MySQL从服务器:

    mysql -u root -p #进入MySQL控制台

    create database documents; #创建数据库

    use documents #进入数据库

    source /home/documents.sql #导入备份文件到数据库

    nginx + PHP 的 sphinx全文索引

    exit #退出MySQL控制台

  • 拷贝MySQL数据源配置文件

$ cp /home/ftp/coreseek-3.2.14/testpack/etc/csft_mysql.conf /usr/local/coreseek/etc/csft_mysql.conf

  • 添加软连接

$ ln -s /usr/local/coreseek/etc/csft_mysql.conf /etc/csft_mysql.conf

  • 编辑,修改

$ vim /etc/csft_mysql.conf

###############################################################################  #MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/  #请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库  #源定义  source mysql  {  type                    = mysql  sql_host                = localhost  sql_user                = root  #账号  sql_pass                = 123456 #密码  sql_db                  = documents  #MySQL数据库名称  sql_port                = 3306  sql_query_pre            = SET NAMES utf8  sql_query                = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents  #sql_query第一列id需为整数  #title、content作为字符串/文本字段,被全文索引  sql_attr_uint            = group_id           #从SQL读取到的值必须为整数  sql_attr_timestamp        = date_added #从SQL读取到的值必须为整数,作为时间属性  sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集  sql_query_info            = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息  }  #index定义  index mysql  {  source            = mysql             #对应的source名称  path            = /usr/local/coreseek/var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...  docinfo            = extern  mlock            = 0  morphology        = none  min_word_len        = 1  html_strip                = 0  #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/  charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾  #charset_dictpath = etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...  charset_type        = zh_cn.utf-8  }  #全局index定义  indexer  {  mem_limit            = 1024M  #内存使用限制  max_iops = 100  max_iosize = 0  }  #searchd服务定义  searchd  {  listen                  =   9312  read_timeout        = 5  max_children        = 30  max_matches            = 1000  seamless_rotate        = 0  preopen_indexes        = 0  unlink_old            = 1  pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid  #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...  log =/usr/local/coreseek/var/log/searchd_mysql.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...  query_log =/usr/local/coreseek/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...  }  #################################################################################
  • 拷贝测试文件到web站点根目录下

$ cp /home/ftp/coreseek-3.2.14/testpack/api/sphinxapi.php /usr/www/coreseek/sphinxapi.php

  • 拷贝测试文件到web站点根目录下

$ cp /home/ftp/coreseek-3.2.14/testpack/api/test_coreseek.php /usr/www/coreseek/test_coreseek.php

  • 进入web站点根目录

$ cd /usr/www/coreseek

  • 编辑,添加以下代码

$ vim test.php

  • 建立索引服务

$ /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate

  • 启动测试模式 运行后会停顿监听 (暂别运行)

$ /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --console

  • 后台启动模式

$ /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf

  • 停止 (用于停止运行在后台服务)

$ /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --stop

  • 更新索引服务

$ /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate

  • 打开浏览器

    http://121.42.151.168:81/

    nginx + PHP 的 sphinx全文索引

  • 设置coreseek开机自动后台运行

    • 编辑,在最后一行添加下面的代码

      vim /etc/rc.d/rc.local
      /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf

  • 保存退出

    :wq

  • 添加以下更新索引脚本

    vim /usr/local/coreseek/bin/build_index.sh

#!/bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
  • 保存退出

    :wq

  • 添加脚本执行权限

    chmod +x /usr/local/coreseek/bin/build_index.sh

  • 编辑,在最后一行添加以下代码
    vim /etc/crontab

*/30 * * * * root /usr/local/coreseek/bin/build_index.sh #每隔30分钟执行一次

  • 保存退出

    :wq

  • 重新加载任务计划

    service crond reload


期间出现的错误

  • [错误1] 到这一步的时候报错:

    $/usr/local/coreseek/bin/indexer -c /usr/local/src/coreseek-3.2.14/testpack/etc/csft.conf --all

提示我没有/usr/local/coreseek/bin/indexer 这个目录? cd 看下还真没有. 让后仔细查了下,原来是make出的错。
报错如下:

make[2]: *** [sphinxexpr.o] Error 1 make[2]: Leaving directory `/home/ftp/coreseek-3.2.14/csft-3.2.14/src' make[1]: *** [all] Error 2 make[1]: Leaving directory `/home/ftp/coreseek-3.2.14/csft-3.2.14/src' make: *** [all-recursive] Error 1

解决办法:
编辑 vim ./src/sphinxexpr.cpp

将所有的:

T val = ExprEval ( this->m_pArg, tMatch );

替换成

T val = this->ExprEval ( this->m_pArg, tMatch );

保存然后重新编译就ok了!

  • [错误2] 报错如下:

ERROR: index 'mysql': sql_connect: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) (DSN=mysql://root:***@localhost:3306/coreseek).

解决办法:
vim /etc/csft_mysql.conf
加上一句:sql_sock = /tmp/mysql.sock

原文始发于微信公众号(一个人的安全笔记):nginx + PHP 的 sphinx全文索引

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月8日09:04:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  nginx + PHP 的 sphinx全文索引 http://cn-sec.com/archives/772042.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: