• windows7使用Sphinx+PHP+MySQL详细介绍


    安装(Windows)

    1.官方下载

    Sphinx下载地址: 下载

    2.解压并重命名

    此处下载版本为3.0.3,将 sphinx 文件夹命名为sphinx

    3.文件夹目录介绍

    sphinx
    --api(各语言支持的api)
    --bin(二进制程序)
    --doc(文档说明)
    --etc(配置文件:conf/sql)
    --misc
    --src
    # 手动创建以下两个文件夹
    --data
    --log
    

    4.设置配置文件

    (1)将sphinx/etc/sphinx-min.conf.dist文件复制到sphinx/bin/目录下,并重命名为sphinx.conf

    注:sphinx/etc/sphinx.conf.dist为带注释的详细的

    (2)设置配置项

    主要是以下为配置函数:

    • source src1{} --- 连接数据库的基本配置
    # 连接的数据库类型
    type = mysql
    # 连接的数据库主机
    sql_host = localhost
    # 数据库连接的用户名,默认为test
    sql_user = root
    # 数据库连接的密码,默认为空
    sql_pass =123123
    # 连接的数据库名称,默认为test
    sql_db = test
    # 连接数据库的端口号,默认为3306
    sql_port = 3306
    # 操作的数据表执行的查询语句
    sql_query		= 
    		SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content 
    		FROM documents
    
    • index test1{}
    # 索引数据存放目录,默认为/var/data/test1
    path = D:Servicesphinxdata	est1
    # 设置中文匹配
    min_word_len    = 1  
    charset_type    = utf-8  
    # 指定utf-8的编码表
    charset_table   = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
    min_word_len	= 1
    min_prefix_len	= 0
    min_infix_len	= 1
    # 开启中文分词支持
    ngram_len		= 1
    # 需要分词的字符
    ngram_chars		= U+3000..U+2FA1F
    
    • index test1stemmed : test1{}
    # 主要需要修改的配置项,默认为/var/data/test1stemmed
    path = D:Servicesphinxdata	est1stemmed
    
    • index rt{}
    # 主要需要修改的配置项,默认为/var/data/rt
    path = D:Servicesphinxdata
    t
    # 指定对哪些字段进行匹配
    rt_field = name
    rt_field = ename
    rt_field = setmeal
    rt_field = category
    rt_field = country
    rt_field = traffic
    rt_field = body
    
    # 
    rt_attr_uint	= offerid
    
    • searchd{}
    # 自定义日志文件位置
    log = D:Servicesphinxlogsearchd.log
    query_log = D:Servicesphinxlogquery.log
    pid_file = D:Servicesphinxlogsearchd.pid
    

    以下几项不需要修改默认值,即可直接使用

    • source src1throttled : src1{}

    分布式索引的相关配置,没有则可以不修改

    • index dist1{}

    • indexer{}

    • common{}

    5.操作数据库,导入样例数据

    (1)进入到mysql命令行,执行命令

    D:phpStudyPHPTutorialMySQLin>mysql -uroot -p
    Enter password: *************
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 12
    Server version: 5.5.53 MySQL Community Server (GPL)
    
    
    mysql> use test;
    
    # 恢复样例数据到数据库
    mysql> source /D:Servicesphinxetc/eaxmple.sql
    
    # 新增两个数据表,documents和tags
    mysql> show tables;
    documents
    tags
    
    

    6.生成索引文件

    cmd命令行进入到sphinx/bin/目录下

    # 生成索引文件
    > indexer.exe --config sphinx.conf --all
    Sphinx 3.0.3-dev (commit facc3fb)
    Copyright (c) 2001-2018, Andrew Aksyonoff
    Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
    
    using config file 'sphinx.conf'...
    WARNING: key 'docinfo' was permanently removed from Sphinx configuration. Refer to documentation for details.
    WARNING: key 'dict' was permanently removed from Sphinx configuration. Refer to documentation for details.
    WARNING: key 'mva_updates_pool' was permanently removed from Sphinx configuration. Refer to documentation for details.
    indexing index 'test1'...
    collected 4 docs, 0.0 MB
    sorted 0.0 Mhits, 100.0% done
    total 4 docs, 0.2 Kb
    total 1.0 sec, 0.2 Kb/sec, 3 docs/sec
    indexing index 'test1stemmed'...
    collected 4 docs, 0.0 MB
    sorted 0.0 Mhits, 100.0% done
    total 4 docs, 0.2 Kb
    total 1.0 sec, 0.2 Kb/sec, 3 docs/sec
    skipping non-plain index 'dist1'...
    skipping non-plain index 'rt'...
    

    【注】新版sphinx的bin目录下已经没有search.exe程序,所以不能直接在命令行执行返回结果,只能使用api接口返回数据。

    7.开启搜索服务,保持后台运行

    > searchd.exe --pidfile
    
    [Tue May 15 09:02:14.690 2018] [7776] using config file './sphinx.conf'...
    listening on all interfaces, port=9312
    listening on all interfaces, port=9306
    Sphinx 3.0.3-dev (commit facc3fb)
    Copyright (c) 2001-2018, Andrew Aksyonoff
    Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
    
    

    PHP开启sphinx扩展

    1.下载php_sphinx扩展: 前往

    具体需要下载的版本需要查看phpinfo信息:

    Architecture         ==》x86/x64
    PHP Extension Build  ==》NTS/NS
    

    下载并解压后,将php_sphinx.dll文件放到php/ext目录下

    2.修改php.ini配置文件

    # 在 Dynamic Extensions 列表中添加php_sphinx扩展
    extension=php_sphinx.dll
    

    修改后重启apache服务

    3.在phpinfo.php输出的信息中查看sphinx扩展是否安装成功

                sphinx
    sphinx support	 enabled
    Version	         1.3.2
    Revision	 $Revision$
    

    代码实现

    1.样例数据表test.documents记录:

     id   group_id   group_id2   date_added             title             content
     1    1             5        2018-05-14 09:12:25   test one           this is my test document number one. also checking search within phrases.
     2    1             6        2018-05-14 09:12:25   test two           this is my test document number two
     3    2             7        2018-05-14 09:12:25   another doc        this is another group
     4    2             8        2018-05-14 09:12:25   doc number four    this is to test groups 
    

    2.PHP代码实现

    一般实现

    <?php
    require('sphinxapi.php');
    
    $sphinx = new SphinxClient();
    $sphinx->SetServer('localhost',9312);
    $sphinx->SetMatchMode(SPH_MATCH_ANY);
    $sphinx->SetArrayResult ( true );
    $res = $sphinx->Query($_GET['key'],'*');
    var_dump($res);
    

    thinkphp5使用介绍

    1.将sphinxapi.php文件放到extend目录下

    2.在控制器方法中使用(app/api/index

    public function test()
    {
        $sphinx = new SphinxClient();
        // sphinx的主机名和端口
        $sphinx->SetServer('localhost',9312);
        // 匹配模式
        $sphinx->SetMatchMode(SPH_MATCH_ANY);
        // 设置返回结果集为php数组格式
    
        $sphinx->SetArrayResult ( true );
        $res = $sphinx->Query(input('key'),'*');
        var_dump($res);
    }
    

    3.url访问:
    http://localhost/mypro/api/index/test?key=test

    4.输出数据

    D:webCODapiapplicationapicontrollerIndex.php:21:
    array (size=10)
      'error' => string '' (length=0)
      'warning' => string '' (length=0)
      'status' => int 0
      'fields' => 
        // 查询显示的字段名
        array (size=2)
          0 => string 'title' (length=5)
          1 => string 'content' (length=7)
      'attrs' => 
        array (size=2)
          'group_id' => string '1' (length=1)
          'date_added' => string '2' (length=1)
      'matches' => 
        // 匹配的结果,返回匹配记录的id和权重(权重越大,匹配条件越多)
        array (size=3)
          0 => 
            array (size=3)
              'id' => string '1' (length=1)
              'weight' => int 2421
              'attrs' => 
                array (size=2)
                  ...
          1 => 
            array (size=3)
              'id' => string '2' (length=1)
              'weight' => int 2421
              'attrs' => 
                array (size=2)
                  ...
          2 => 
            array (size=3)
              'id' => string '4' (length=1)
              'weight' => int 1442
              'attrs' => 
                array (size=2)
                  ...
      'total' => int 3
      'total_found' => int 3
      'time' => float 0
      'words' => 
        array (size=1)
          'test' => 
            array (size=2)
              'docs' => int 6
              'hits' => int 10
    

    在ThinkPHP5项目中应用

    1.修改配置信息sphinx/bin/sphinx.conf

    source src1{
    # 省略其他配置
    sql_user  = root
    sql_pass  = 123123
    sql_db    = shopMall
    sql_query = 
      SELECT id,offerid, name, ename, setmeal, category, country, traffic, os, body, inventory_title, shop 
      FROM i_offer
    sql_attr_uint = offerid
    # 省略其他配置
    }
    
    index rt
    {
      type  = rt
      path  = D:Servicesphinxdata
    t
    
      rt_field  = name
      rt_field  = ename
      rt_field  = setmeal
      rt_field  = category
      rt_field  = country
      rt_field  = traffic
      rt_field  = body
    
      rt_attr_uint  = offerid
    }
    

    2.生成索引,并开启searchd服务

    # 生成项目索引
    sphinx/bin/indexer.exe --config sphinx.conf --all
    
    # 开启服务 &表示后台开启,不用保持窗口执行状态
    sphinx/bin/searchd.exe &
    

    3.程序实现

    sphinx查询返回的结果并不是我们需要的显示结果,所以还需要对结果进行处理,从而获取到我们需要的结果。

    默认sphinx返回的数据中包含id信息是和数据记录的信息是相关的,所以我们需要通过id到数据库中查询相关信息。

    public function test()
    {
        $s = new SphinxClient;
        $s->setServer("localhost", 9312);
        // 作为数组返回
        $s->SetArrayResult(true);
        // 匹配格式  任意匹配
        $s->setMatchMode(SPH_MATCH_ANY);
        $s->setMaxQueryTime(3);
        // input()表示接收用户传过来的数据
        $result = $s->query(input('key'),'*');
    
        return json($result);
    }
    

    4.测试实现

    访问url:
    http://localhost/mypro/api/index/test?key=官方

    返回结果:

    
    D:webCODapiapplicationapicontrollerIndex.php:22:
    array (size=10)
      'error' => string '' (length=0)
      'warning' => string '' (length=0)
      'status' => int 0
      'fields' => 
        array (size=10)
          0 => string 'name' (length=4)
          1 => string 'ename' (length=5)
          2 => string 'setmeal' (length=7)
          3 => string 'category' (length=8)
          4 => string 'country' (length=7)
          5 => string 'traffic' (length=7)
          6 => string 'os' (length=2)
          7 => string 'body' (length=4)
          8 => string 'inventory_title' (length=15)
          9 => string 'shop' (length=4)
      'attrs' => 
        array (size=1)
          'offerid' => string '1' (length=1)
      'matches' => 
        array (size=6)
          0 => 
            array (size=3)
              'id' => string '36' (length=2)
              'weight' => int 4667
              'attrs' => 
                array (size=1)
                  ...
          1 => 
            array (size=3)
              'id' => string '19' (length=2)
              'weight' => int 2611
              'attrs' => 
                array (size=1)
                  ...
          // 此处省略部分数据
      'total' => int 6
      'total_found' => int 6
      'time' => float 0
      'words' => 
        array (size=2)
          '官' => 
            array (size=2)
              'docs' => int 14
              'hits' => int 16
          '方' => 
            array (size=2)
              'docs' => int 70
              'hits' => int 94
    

    对结果进行处理

    public function test()
    {
        $s = new SphinxClient;
        $s->setServer("localhost", 9312);
        // 作为数组返回
        $s->SetArrayResult(true);
        // 匹配格式  任意匹配
        $s->setMatchMode(SPH_MATCH_ANY);
        $s->setMaxQueryTime(3);
        // input()表示接收用户传过来的数据
        $result = $s->query(input('key'),'*');
    
        // 避免没有匹配记录时报错
        if(empty($result['matches'])) {
            return null;
        }
    
        $result = $result['matches'];
        // 返回数组中指定的id列, 返回结果为单列数组
        $result = array_column($result, 'id');
        $list = model('offer')
        ->field('offerid, name, ename, setmeal, category, country, traffic, os, body, inventory_title, shop')
        ->where(array('id' => array('in', $result)))
        ->select();
    
        return json($list);
    }
    

    返回结果

    [
      {
        offerid: 2332302,
        name: "【官方站】減震隱形增高鞋墊(安全有效~秒增高5公分~)",
        ename: "zenggaoxiedian",
        setmeal: "日韓超夯,氣墊隱形增高墊,輕鬆增高5公分,透氣減震,抗菌防臭,藝人最愛!【可拆分,自由裁剪,均碼35-44可用】【超殺998三雙】",
        category: "[{"id":6,"name":"其他"},{"id":7,"name":"商城"},{"id":8,"name":"家庭用品
    "}]",
        country: "[{"id":11,"name":"American Samoa"},{"id":1,"name":"Andorra"},{"id":8,"name":"Angola"},{"id":5,"name":"Anguilla"},{"id":10,"name":"Argentina"},{"id":7,"name":"Armenia"},{"id":12,"name":"Austria"}]",
        traffic: "[{"id":2,"name":"16+"},{"id":3,"name":"3G/4G"},{"id":4,"name":"Adult"}]",
        os: "[{"id":1,"name":"3DS System Software"},{"id":2,"name":"Android"},{"id":13,"name":"BeOS"},{"id":16,"name":"CentOS"}]",
        body: "123123123",
        inventory_title: "隱形增高鞋墊B",
        shop: "[{"userid":77912776,"name":"myShop"}]"
      },
      {
        offerid: 3308032,
        name: "【官方站】電熱造型梳",
        ename: "zaoxingshu",
        setmeal: "長/短髮都適用!好梳好上手!亂翹髮尾一秒聽話!【人氣爆红款美髮救星】限時特價,加NT$300再得1件!!!",
        category: "[{"id":2,"name":"美容"},{"id":4,"name":"日用品"},{"id":6,"name":"其他"},{"id":8,"name":"家庭用品
    "}]",
        country: "[{"id":6,"name":"Albania"},{"id":4,"name":"Antigua And Barbuda"}]",
        traffic: "[{"id":3,"name":"3G/4G"},{"id":5,"name":"Adult Content"},{"id":6,"name":"App Discovery Traffic"}]",
        os: "[{"id":3,"name":"Android with AOKP"},{"id":5,"name":"Android with Cyanogen Mod"},{"id":6,"name":"Android with LiquidSmooth"},{"id":7,"name":"Android with MIUI"}]",
        body: "123123123"
        inventory_title: "NOVA多功能卷髮棒B",
        shop: "[{"userid":77912776,"name":"myShop"}]"
      }
    ]
    

    支持简体中文、繁体中文和英文的检索。

    暂且实现如此。

    参考连接:

    • PHP官方手册使用Sphinx介绍:

    http://www.php.net/manual/zh/book.sphinx.php

    • sphinx安装:

    https://blog.csdn.net/huang2017/article/details/69665057

    https://blog.csdn.net/huang2017/article/details/69666154

    • 将sphinx服务添加到windows服务:

    ./searchd.exe --install -c sphinx.conf --servicename s

    https://blog.csdn.net/design321/article/details/8895712

    • sphinx使用:

    https://blog.csdn.net/u010837612/article/details/70827481

    • 中文支持(linux系统)

    http://www.xuejiehome.com/blread-1283.html

    • 中文支持(windows系统)

    http://www.phpernote.com/php-template-framework/284.html

    • 其他

    https://my.oschina.net/guyson/blog/283576

  • 相关阅读:
    ini_set /ini_get函数功能-----PHP
    【转】那个什么都懂的家伙
    word 2007为不同页插入不同页眉页脚
    August 26th 2017 Week 34th Saturday
    【2017-11-08】Linux与openCV:opencv版本查看及库文件位置等
    August 25th 2017 Week 34th Friday
    August 24th 2017 Week 34th Thursday
    August 23rd 2017 Week 34th Wednesday
    August 22nd 2017 Week 34th Tuesday
    August 21st 2017 Week 34th Monday
  • 原文地址:https://www.cnblogs.com/zqunor/p/9045267.html
Copyright © 2020-2023  润新知