zoukankan      html  css  js  c++  java
  • sphnix 中文划词搜索技术

    首先要建立一个配置文件,比如叫sphinx.conf,这个配置文件的模板可以在etc目录下找到,链接mysql的话,就用csft_mysql.conf这个文件来修改就行

     1 #源定义
     2 source songs
     3 {
     4     type                    = mysql
     5 
     6     sql_host                = localhost
     7     sql_user                = root
     8     sql_pass                = 
     9     sql_db                    = test
    10     sql_port                = 3306
    11     sql_query_pre            = SET NAMES utf8
    12 
    13     sql_query                = select id,title,content from curl_songs
    14                                                               #sql_query第一列id需为整数
    15                                                               #title、content作为字符串/文本字段,被全文索引
    16     #sql_attr_uint            = group_id           #从SQL读取到的值必须为整数
    17     #sql_attr_timestamp        = date_added #从SQL读取到的值必须为整数,作为时间属性
    18 
    19     sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集
    20     sql_query_info            = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息
    21 }
    22 
    23 #index定义
    24 index songs
    25 {
    26     source            = songs             #对应的source名称
    27     path            = F:wampinsphinxcoreseek-3.2.14-win32vardatasongs #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    28     docinfo            = extern
    29     mlock            = 0
    30     morphology        = none
    31     min_word_len        = 1
    32     html_strip                = 0
    33 
    34     #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
    35     #charset_dictpath = F:wampinsphinxcoreseek-3.2.14-win32etc #BSD、Linux环境下设置,/符号结尾
    36     charset_dictpath = F:wampinsphinxcoreseek-3.2.14-win32etc                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
    37     charset_type        = zh_cn.utf-8
    38 }
    39 
    40 #全局index定义
    41 indexer
    42 {
    43     mem_limit            = 128M
    44 }
    45 
    46 #searchd服务定义
    47 searchd
    48 {
    49     listen                  =   9312
    50     read_timeout        = 5
    51     max_children        = 30
    52     max_matches            = 1000
    53     seamless_rotate        = 0
    54     preopen_indexes        = 0
    55     unlink_old            = 1
    56     pid_file = F:wampinsphinxcoreseek-3.2.14-win32varlogsearchd_mysql.pid  #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    57     log = F:wampinsphinxcoreseek-3.2.14-win32varlogsearchd_mysql.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    58     query_log = F:wampinsphinxcoreseek-3.2.14-win32varlogquery_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    59 }

    之后,在每次使用之前,必须启动sphinx的服务
    即bin文件下的searchd,启动时,要携带配置文件,命令如下

    1 F:wampinsphinxcoreseek-3.2.14-win32insearchd.exe
    2 -c F:wampinsphinxcoreseek-3.2.14-win32sphinx.conf

    这样sphinx就启动了,

    然后,对要进行查询的数据源文件,必须建立好索引,需要用到sphinx bin下面的indexer文件

    C:UsersAdministrator>F:wampinsphinxcoreseek-3.2.14-win32inindexer.exe
    -c F:wampinsphinxcoreseek-3.2.14-win32sphinx.conf songs --all

    然后就可以用php才操作sphinx了

     1 <?php
     2 //引入sphinx api类
     3 include 'sphinxapi.php';
     4 $s=new SphinxClient();
     5 $s->SetServer('localhost',9312);
     6 //设置搜索的内容,word
     7 $word=empty($_GET['search']) ? '' : $_GET['search'];
     8 //执行查询,songs为数据源的名字
     9 $res=$s->Query($word,'songs');
    10 if($res){
    11     //list里面存储查询到的id
    12     $list=array_keys($res['matches']);
    13     $list=implode(',', $list);
    14     
    15     
    16     //开始mysql查询部分
    17     mysql_connect('localhost','root','',3306);
    18     mysql_select_db('test');
    19     $sql="select * from curl_songs where id in ($list)";
    20     mysql_query('set names utf8');
    21     $res=mysql_query($sql) or die(mysql_error());
    22     
    23     while ($row=mysql_fetch_assoc($res)){
    24         //这个buildExcerpts方法,可以对结果进行文档标注,比如对搜到的关键字进行红色标注,比较实用
    25         //但实用之后,结果的数据就不是关联数组了,就成为索引数组,要用arr[0] arr[1]等来取值
    26         $arr[]=$s->BuildExcerpts($row, 'songs', $word, array(
    27         'before_match'=>'<font color="red">',
    28         'after_match'=>'</font>',
    29         'limit'=>'200'
    30         ));
    31     }
    32     
    33 }
    34 //总共消耗的时间
    35     $costtime=empty($res['time']) ?'0.00' : $res['time'];
    36 //一共查询到了多少条
    37     $totalfound=empty($res['total_found']) ? '0' : $res['total_found'];
    38 //页面显示部分    
    39 ?>
    40 <html>
    41 <meta charset='utf-8'></meta>
    42 <body>
    43 <form method='get' >
    44 <input type='text' name='search' value="<?php echo $word ?>" />  <button >搜索</button> <br>
    45 共有<?php echo $totalfound ?>条记录,消耗时间<?php echo $costtime ?>46 
    47 <?php 
    48 if (!empty($arr)) {
    49     echo "<ul>";
    50     foreach ($arr as $v){
    51     echo '<li><hr>'.$v[1] .' 演唱:'.$v[2].'</li>';
    52     echo '<li><p>'. $v[3] .'</p><br></li></ul>';
    53     }
    54 }
    55 ?>
    56 </form>
    57 </body>
    58 </html>

     --->sphinx应用后对应有个增量索引的东西,就是索引建立好后,当数据有更新,如果每次重新生成索引相当的费时不现实

    步骤,主数据源为songs 增加的为songs_add

    首先要在mysql下建立一张表,目的存储songs这个索引的最大id,其实就是相当于一个变量的作用

    1 create table a(
    2 id int unsigned primary key ,max_id int unsigned default ''
    3 )

    然后就是修改sphinx.conf这个文件,首先
    在原来的数据源 songs 中 要加入这一句

     意思就是在主查询完毕之后,插入songs表最大的id到a表中记录好,replace作用是无数据就插入,有数据就更新

    1 sql_query = select id,title,content from curl_songs
    2 sql_query_post = replace into a select 1,max(id) from curl_songs

    然后建立songs_add部分的数据源和索引

     1 #源定义
     2 source songs_add
     3 {
     4     type                    = mysql
     5 
     6     sql_host                = localhost
     7     sql_user                = root
     8     sql_pass                = 
     9     sql_db                    = test
    10     sql_port                = 3306
    11     sql_query_pre            = SET NAMES utf8
    12 
    13     sql_query                = select id,title,content from curl_songs where id >( select max_id from a)
    14     sql_query_post           =replace into a select 1,max(id) from curl_songs
    15 
    16 
    17     sql_query_info_pre      = SET NAMES utf8                             #命令行查询时,设置正确的字符集
    18     sql_query_info            = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息
    19 }
    20 
    21 #index定义
    22 index songs_add
    23 {
    24     source            = songs_add             #对应的source名称
    25     path            = F:wampinsphinxcoreseek-3.2.14-win32vardatasongs_add #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    26     docinfo            = extern
    27     mlock            = 0
    28     morphology        = none
    29     min_word_len        = 1
    30     html_strip                = 0
    31 
    32     #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
    33     #charset_dictpath = F:wampinsphinxcoreseek-3.2.14-win32etc #BSD、Linux环境下设置,/符号结尾
    34     charset_dictpath = F:wampinsphinxcoreseek-3.2.14-win32etc                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
    35     charset_type        = zh_cn.utf-8
    36 }

    配置文件设置好之后就开始运行
    (1):生成songs的索引(必须重新生成一次,这样a表中就会记录最大id)

    1 F:wampinsphinxcoreseek-3.2.14-win32inindexer.exe
    2 -c F:wampinsphinxcoreseek-3.2.14-win32sphinx.conf songs

    (2):生成songs_add的索引

    1 F:wampinsphinxcoreseek-3.2.14-win32inindexer.exe
    2 -c F:wampinsphinxcoreseek-3.2.14-win32sphinx.conf songs_add

    (3)合并这两个索引即可

    1 F:wampinsphinxcoreseek-3.2.14-win32inindexer.exe
    2 -c F:wampinsphinxcoreseek-3.2.14-win32sphinx.conf --merge songs song_add --rotate

    可以设置一个自动的脚本或linux下的计划任务,让索引更新在比如每天晚上2天自动更新

  • 相关阅读:
    第09组(71) Alpha冲刺 (3/6)
    第09组 Alpha冲刺 (2/6)
    第09组 Alpha冲刺 (1/6)
    第09组(71)需求分析报告
    第07组 Beta冲刺(1/5)
    第07组 Alpha冲刺 总结
    第07组 Alpha冲刺 (6/6)
    第07组 Alpha冲刺 (5/6)
    第五次作业
    第07组 Alpha冲刺 (4/6)
  • 原文地址:https://www.cnblogs.com/dk1988/p/3524561.html
Copyright © 2011-2022 走看看