sphinx全文检索 安装配置和使用

公司项目刚刚导入大量产品数据,然后发现网站的产品搜索很卡,原本是原生sql的like来做模糊搜索,数据量20W的时候还可以接受,但是上百万就很卡了,所以需要做优化。

经过考虑,打算采用全文检索 sphinx + 数据库中间件(atlas/mycat) 的架构来优化.

我的环境:

centos6.5 64位

lnmp1.3一键环境包

CentOS6.4 X64 安装sphinx及sphinx for php扩展

安装前请先确定安装了常用的组件,然后在官方网站下载最新的sphinx,

yum install -y python python-devel

http://sphinxsearch.com/downloads/release/

安装sphinx

tar zxvf sphinx-2.2.10-release.tar.gz
cd sphinx-2.2.10-release
./configure --prefix=/usr/local/sphinx –-with-mysql
make && make install

在make时如果出现undefined reference to libiconv的错,请参考 http://www.lvtao.net/database/sphinx-make-error.html 解决方法
libsphinxclient 安装(PHP模块需要)

cd api/libsphinxclient
./configure –prefix=/usr/local/sphinx
make &&  make install

安装PHP的Sphinx模块
下载地址:http://pecl.php.net/package/sphinx

wget http://pecl.php.net/get/sphinx-1.3.0.tgz
tar zxf sphinx-1.3.3.tgz
cd sphinx-1.3.3
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx=/usr/local/sphinx/
make && make install

添加php扩展库查看php.ini位置php --ini

编辑配置vi /usr/local/php/etc/php.ini:$ 跳至文件尾部

extension_dir="/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/"
[sphinx]
extension=sphinx.so

php -m 或者 phpinfo() 查看是否已经加载扩展

首先我们得在服务器端把索引建立好,以便php通过端口访问获取

复制默认配置文件,重新创建一个配置文件

cp /usr/local/sphinx/etc/sphinx-min.conf.dist  /usr/local/sphinx/etc/sphinx.conf

sphinx.conf.dist是完整版默认配置,有很多内容,我这里选择复制的是sphinx-min.conf.dist迷你版,只要满足基本查询需要即可

#
# Minimal Sphinx configuration sample (clean, simple, functional)
#

source src1
{
        type                    = mysql

        sql_host                = localhost
        sql_user                = root
        sql_pass                = root
        sql_db                  = allchips_test
        sql_port                = 3306  # optional, default is 3306

        sql_query               = select * from products

        #sql_attr_uint          = id
        #sql_attr_timestamp     = date_added

        sql_field_string        = product_id
        sql_field_string        = partNo
}

source src2
{
        type                    = mysql

        sql_host                = localhost
        sql_user                = root
        sql_pass                = root
        sql_db                  = allchips_test
        sql_port                = 3306  # optional, default is 3306

        sql_query               = select * from product_prices

}

source src3
{
        type                    = mysql

        sql_host                = localhost
        sql_user                = root
        sql_pass                = root
        sql_db                  = allchips_test
        sql_port                = 3306  # optional, default is 3306

        sql_query               = select * from product_attrs

}

index products
{
        source                  = src1
        path                    = /mnt/data/products
        min_infix_len = 1
        infix_fields = partNo,short_desc

}

index prices
{
        source                  = src2
        path                    = /mnt/data/prices

}

index attrs
{
        source                  = src3
        path                    = /mnt/data/attrs

}

indexer
{
        mem_limit               = 128M
}

searchd
{
        listen                  = 9312
        listen                  = 9306:mysql41
        log                     = /mnt/data/log/searchd.log
        query_log               = /mnt/data/log/query.log
        read_timeout            = 5
        max_children            = 30
        pid_file                = /mnt/data/log/searchd.pid
        seamless_rotate         = 1
        preopen_indexes         = 1
        unlink_old              = 1
        workers                 = threads # for RT to work
        binlog_path             = /mnt/data
}

  

最下面的indexer和searchd分别是索引创建,和查询命令的配置,基本只要设置好自己想要日志路径即可

重要的上面的部分,source (来源) 和 index (索引)

分析一下我的需求,我的产品搜索主要3张表

产品表products, (id,product_id)

产品价格表product_prices,

产品参数表product_attrs

三者以产品表的product_id关联1对多

source src1 对应  index products

source src2 对应  index prices

source src3 对应  index attrs

在source中是可以设置自定义返回的字段的

如上面的
sql_field_string = product_id
sql_field_string = partNo

配置好了之后,创建索引

我在使用  /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf  --all --rotate 命令的的时候,除了no rotate的提示。为了确保生成索引,我还是分开多个源生成

/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf  products

/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf  prices

/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf  attrs

如果没有什么问题一般是这样的。

接下来要用searchd作为sphinx在服务器的守护进程

/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf(途中的test.conf是以前测试的,使用sphinx.conf即可)

一般如果报错

文件夹不存在,则创建文件夹

如果已经端口进程已经在运行,那么有2种方法停止

1,/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf --stop

2, netstat -tnl 查看端口9312是否在监听

lsof -i:9312  查看9312端口信息,获得pid

kill {pid}

杀掉进程之后重新执行searchd命令启动

==========

php端

<?php
    //index.php
    phpinfo();die;
    $s = new SphinxClient;
    $s->setServer("127.0.0.1", 9312);

    $s->setMatchMode(SPH_MATCH_PHRASE);
    $s->setMaxQueryTime(30);

    $res1 = $s->query(‘usb‘,‘products‘);
    $res2 = $s->query(‘53e6dde17a667c4b2af1d38ba0a466c4‘,‘prices‘);
    $res3 = $s->query(‘53e6dde17a667c4b2af1d38ba0a466c4‘,‘attrs‘);

    //$res = $s->query(‘开关‘,‘products‘);
    //$res = $s->query(‘products‘);

    $err = $s->GetLastError();
   //var_dump(array_keys($res[‘matches‘]));
   // echo "<br>"."通过获取的ID来读取数据库中的值即可。"."<br>";

    echo ‘<pre>‘;

    $products=!empty($res1[‘matches‘])?$res1[‘matches‘]:"";
    $prices=!empty($res2[‘matches‘])?$res2[‘matches‘]:"";
    $attrs=!empty($res3[‘matches‘])?$res3[‘matches‘]:"";

    print_r($products);
    print_r($prices);
    print_r($attrs);

    if(!empty($err)){
        print_r($err);
    }

    $s->close();
    

coreseek的官网挂了下载不了,所以暂时不弄中文。以后看有时间在下载个中文词典打进去

这是打印的query返回的matches匹配结果,如果要查看整个query结果,可以看PHP手册http://php.net/manual/zh/sphinxclient.query.php

返回数据结构
值说明
"matches" 存储文档ID以及其对应的另一个包含文档权重和属性值的hash表
"total" 此查询在服务器检索所得的匹配文档总数(即服务器端结果集的大小,且与相关设置有关)
"total_found" (服务器上找到和处理了的)索引中匹配文档的总数
"words" 将查询关键字(关键字已经过大小写转换,取词干和其他处理)映射到一个包含关于关键字的统计数据(“docs”——在多少文档中出现,“hits”——共出现了多少次)的小hash表上。
"error" searchd报告的错误信息
"warning" searchd报告的警告信息

================================================================

Atlas听说很多人都在用,安装测试中 待续 -

				
时间: 2024-07-28 18:52:47

sphinx全文检索 安装配置和使用的相关文章

搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例

http://blog.csdn.net/e421083458/article/details/21529969 常用的命令 ps -ef|grep searchd 如果你开了search服务后,你命令比如 indexer search 后面都需要带上 --rotate ./indexer --all ./searchd 至于其它什么命令 看手册 collect2: ld returned 1 exit status make[2]: *** [indexer] Error 1 make[2]:

全文搜索引擎coreseek安装配置(sphinx)

一.以下安装配置均经过实践检验,下文所有查询语句均为实际生成过程中的数据字段 1.特别说明安装次shpinx需要mysql环境 ,请先安装mysql5.6及以上版本 安装开始: cd /data/softwore wget  http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz(只安装中文分词mmseg3) tar zxvf coreseek-4.1-beta.tar.gz cdcoreseek-4.1-beta.tar

sphinx全文检索功能 | windows下测试

前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统.网上的资料大多是在linux环境下的安装使用,当然,作为生产环境很有必要部署在*nix环境下,作为学习测试,还是windows环境比较方便些. 本文旨在提供一种便捷的方式让Sphinx在windows下安装配置以支持中文全文检索,配置部分在linux下通用. 一.关于Sphinx Sphinx 是一个在GPLv2 下发布的一个全文检索引擎,商业授权(例如, 嵌入到其他程序中)需

Sphinx学习之sphinx的安装篇

一.  Sphinx简介 Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎.意图为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能.Sphinx可以非常容易的与SQL数据库和脚本语言集成.当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据. Sphinx的特性如下: a)  高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒); b)  高性能的搜索(在2 – 4GB 的文本数据上,平均每

webpy+nginx+uwsgi安装配置

转:(1)安装Nginx1.1 下载nginx-1.0.5.tar.gz并解压1.2 ./configure (也可以增加--prefix= path指定安装路径)此时有可能会提示缺少pcre支持,如果要安装pcre的话可以通过 yum install pcre-devel 来实现安装1.3 make1.4 make install (2)安装uWSGI2.1 下载uwsgi-0.9.8.2.tar.gz并解压2.2 make在安装uWSGI的时候有可能提示说是libxml2不存在,针对此情况,

【coreseek】安装配置

安装sphinx相关服务. 参考:http://blog.csdn.net/e421083458/article/details/21529969 http://www.coreseek.cn/products-install/install_on_bsd_linux/ 安装sphinx相关服务. 参考:http://blog.csdn.net/e421083458/article/details/21529969 http://www.coreseek.cn/products-install/

Coreseek/sphinx全文检索的了解

Coreseek/sphinx全文检索的了解 概述: 全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法,全文检索是将存储于数据库中整本书.整篇文章中的任意内容信息查找出来的检索.它可以根据需要获得全文中有关章.节.段.句.词等信息,也可以进行各种统计和分析. 定义: 全文检索易龙天网的设计师认为可以把它划分为二部分: 全文 全文顾名思义:就是全文检索的对象,它可能是一段话,也可能是一片文章,它可能是一个文件比如:word,txt也能是任意一种扩展名结尾的文件 检索 描文章中的每一个词

Windows 2008群集与SQL Server 2008群集安装配置

一.摘要: 本文主要讲述如何在windows server 2008 R2 系统上安装 SQL server 2008 的集群配置. 二.准备: 最少事先需准备三台服务器(理由看这里https://support.microsoft.com/zh-cn/kb/2795523),我此次的实验是在台式机电脑上面安装的,系统安装这里不讲.如果没有主机设备的,此实验可在vmware虚拟机上面安装实现.基本上大同小异,虚拟机这块我在这就不讲了. 因为手上没有存储服务器,所有只能用微软的iscsiTarge

Sphinx全文检索之PHP使用教程

一.Sphinx简介 1. Sphinx是什么? 中文名:全文索引引擎.只支持英文和俄文.但是只要有相应的语言包也可支持任何语言.国内有一团队在Sphinx基础上封装了一个带中文包的软件:coreseek. 2. 为什么要用Sphinx? 在mysql数据库中,对于如下sql语句,select * from xxx where like xxx '%xxx'; (以%开头的like查询),无法使用到任何索引优化,导致如果数据量非常大,查询速度会非常慢.而这种sql语句在很多功能中都要用到,如根据