当前位置:Gxlcms > 数据库问题 > Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词

Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词

时间:2021-07-01 10:21:17 帮助过:3人阅读

include(‘sphinxapi.php‘);

 

  $cl = new SphinxClient();

  //设置sphinxserver地址与port,假设是本机则能够为localhost

  $cl->SetServer( "192.168.16.6", 9312 );

  //下面设置用于返回数组形式的结果

 $cl->SetArrayResult ( true );

 //$cl->SetMatchMode( SPH_MATCH_ANY  );//匹配模式

 //$cl->SetFilter( ‘group_id‘, array( 2 ) );

 

  $result = $cl->Query( 研究生创业‘, ‘test1‘ );  //參数 keyword  索引名

 

  if ( $result === false ) {

      echo "Query failed: " . $cl->GetLastError() . ".\n";

  }

  else {

      if ( $cl->GetLastWarning() ) {

          echo "WARNING: " . $cl->GetLastWarning() . "";

      }

  

          echo ‘<pre>‘;

          print_r( $result );

  }

 ?>

运行后的结果:

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 );则数组结构会有些许差异)。至此搜索server已经为我们完毕了大部分工作。接下来我们通过主键ID值来查询我们想要的数据就能够了。

Sphinx存储引擎的使用

SphinxSE是一个能够编译进MySQL 5.x版本号的MySQL存储引擎。它利用了该版本号MySQL的插件式体系结构。虽然被称作“存储引擎”。SphinxSE自身事实上并不存储不论什么数据。它事实上是一个同意MySQLserver与searchd交互并获取搜索结果的嵌入式client。全部的索引和搜索都发生在MySQL之外。

SphinxSE的适用于:

 使将MySQL FTS 应用程序移植到Sphinx

 使没有Sphinx API的那些语言也能够使用Sphinx

 当须要在MySQL端对Sphinx结果集做额外处理(比如对原始文档表做JOIN,MySQL端的额外过滤等等)时提供优化。

要通过SphinxSE搜索,须要建立特殊的ENGINE=SPHINX的“搜索表”,然后使用SELECT语句从中检索,把全文查询放在WHERE子句中。

创建一张表sphinx表(用来连接MYSQL和SPHINX)

CREATE TABLEt1

(

    id         INTEGER UNSIGNED NOT NULL,

    weight     INTEGER NOT NULL,

    query      VARCHAR(3072) NOT NULL COMMENT ‘查询的单词’,

    group_id   INTEGER,

    INDEX(query) COMMENT ‘必需要给query字段建一个索引’

) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/songs";

 

SELECT b.*

FROM t1a,curl_songs b WHERE a.id=b.id AND query=’冬天的雪’

 

搜索表前三列的类型必须是INTEGER,INTEGER和VARCHAR。这三列分别相应文档ID,匹配权值和搜索查询。查询列必须被索引。其它列必须无索引。列的名字会被忽略,所以能够随意命名,參数CONNECTION来指定用这个表搜索时的默认搜索主机、port号和索引,语法格式:CONNECTION="sphinx://HOST:PORT/INDEXNAME"。

运行SQL语句

查询出全部冬天的雪的记录:

SELECT  a.*

 FROM curl_songs a,t1 b

  WHERE a.id=b.id AND b.query=”冬天的雪”

 

+----+--------------------+-----------------------+

| id |title              | content               |

+----+--------------------+-----------------------+

|  5 | 研究生的故事 | 研究生自主创业 |

+----+--------------------+-----------------------+

1 row in set(0.04 sec)

结果返回了我们想要的数据,可见利用SphinxSE能够只在SQL语句上做非常小的修改就可以非常方便的实现全文检索。

 

 

 

 

 

 

 

 

 

 

 

 

 

主索引 + 增量索引

     前提:数据不会被改变

     第一步:建表: (用来存索引过的最大的记录 id)

               Create table a

{

                    Idint 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

Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词

标签:

人气教程排行