欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sphinx中文检索引擎coreseek+php+mysql搭建

程序员文章站 2024-01-01 11:57:04
...

coreseek下载

官网地址:

  1. Windows参考:http://www.coreseek.cn/products-install/install_on_windows/
  2. Linux参考:http://www.coreseek.cn/products-install/install_on_bsd_linux/
    :注意根据自己的环境配置选择合适的版本下载

安装

将安装包解压到自己环境的项目目录文件夹下,本例中为 E:\www\coreseek 中,在Windows环境下配置

配置步骤

1)数据(本例中使用mysql作为数据源)
2)建立 sphinx 配置文件
3)生成索引文件
4)启动 sphinx 服务
5)使用(调用api或search.exe程序进行查询)

建立sphinx配置文件

配置文件: etc/csft_mysql.conf
1)数据源定义

#源定义
#文章
source article
{
    type                    = mysql
    sql_host                = 127.0.0.1
    sql_user                = root
    sql_pass                = 123
    sql_db                  = test
    sql_port                = 3306
    sql_query_pre           = SET NAMES utf8
    sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM np_article      #增量id查询
    sql_query               = SELECT id*100+1 AS id, id AS contentid, title, intro, content, thumb, collect, hit, UNIX_TIMESTAMP(created_at) as created_at FROM article WHERE (deleted_at is null and id <= (SELECT max_doc_id FROM sph_counter WHERE counter_id = 1))
                                                #sql_query第一列id需为整数
                                                #title、content作为字符串/文本字段,被全文索引
    sql_attr_uint           = contentid               #从SQL读取到的值必须为整数,该字段会被保存到查询结果中        
    sql_attr_uint           = collect
    sql_attr_uint           = hit

    sql_field_string = title #字符串类型字段,将被保存到结果集中
    sql_field_string = intro
    sql_field_string = content
    sql_field_string = thumb

    sql_attr_timestamp = created_at #unix时间戳
    sql_query_info_pre      = SET NAMES utf8    #命令行查询时,设置正确的字符集
    #sql_query_info          = SELECT * FROM article WHERE id=$id #命令行查询时,从数据库读取原始数据信息
}

2)索引配置

#index定义
index article
{
    source            = article             #对应的source名称
    path              = E:/www/coreseek/coreseek-4.1-win32/var/data/test/article
                                          #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    docinfo           = extern
    mlock             = 0
    morphology        = none
    min_word_len      = 1   #最小索引词长度。可选选项,默认为1(索引任何词) 
    html_strip        = 1   #是否从输入全文数据中去除HTML标记。可选标记,默认为0。已知值包括0(禁用)和1(启用)。
    min_infix_len     = 1    #索引的最小中缀长度。可选选项,默认为0(不索引中缀)。
    infix_fields      = title   #做中缀索引的字段列表。可选选项,默认为空(所有字段均为中缀索引模式)。

    #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
    #charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
    charset_dictpath = E:/www/coreseek/coreseek-4.1-win32/etc/     
                                      #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
    charset_type      = zh_cn.utf-8
}

3)indexer程序配置

#全局index定义
indexer
{
    mem_limit            = 128M
}

4)服务器定义

#searchd服务定义
searchd
{
    listen              = 9312
    read_timeout        = 5
    max_children        = 30
    max_matches         = 1000
    seamless_rotate     = 0
    preopen_indexes     = 0
    unlink_old          = 1
    pid_file = E:/www/coreseek/coreseek-4.1-win32/var/log/searchd_mysql.pid  
                                       #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    log = E:/www/coreseek/coreseek-4.1-win32/var/log/searchd_mysql.log        
                                       #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    query_log = E:/www/coreseek/coreseek-4.1-win32/var/log/query_mysql.log 
                                       #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    binlog_path =                      #关闭binlog日志
    compat_sphinxql_magics = 0
}

生成索引

1)生成全部索引
E:\www\coreseek\coreseek-4.1-win32\bin>indexer.exe –config E:\www\coreseek\coreseek-4.1-win32\etc\csft_mysql.conf –all
: –all 指生成全部索引

2)生成指定索引
E:\www\coreseek\coreseek-4.1-win32\bin>indexer.exe –config E:\www\coreseek\coreseek-4.1-win32\etc\csft_mysql.conf article
: article 为配置文件中的索引名

索引更新

对于后期插入的新数据更新索引,使用增量索引
参考文档:http://blog.csdn.net/liushuai_andy/article/details/9138455
http://blog.csdn.net/liushuai_andy/article/details/9366777
思路
1、设置两个数据源和两个索引,一个主索引,一个增量索引,数据库中建立一个计数表,记录已经建完索引的最大ID
2、增量索引,在配置文件中,定义sql 时添加条件,大于表中id值;主索引,在配置文件中,定义sql 时添加条件,小于表中id值
3、每隔几分钟执行增量索引,执行后更新计数表中最大id,合并增量索引和主索引;每隔一天或几天,执行一次主索引

本例操作如下
1)增量索引源定义

#文章增量索引
source article_step:article
{
    sql_ranged_throttle = 100
    sql_query_pre            = SET NAMES utf8
    sql_query_pre = SET SESSION query_cache_type=OFF

    sql_query                = SELECT id*100+1 AS id, id AS contentid, title, intro, content, thumb, type_id, collect, hit, UNIX_TIMESTAMP(created_at) as created_at FROM article WHERE (deleted_at is null and id > ( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )) 

    sql_attr_uint           = contentid               #从SQL读取到的值必须为整数

    sql_attr_uint           = collect
    sql_attr_uint           = hit

    sql_field_string = title
    sql_field_string = intro
    sql_field_string = content
    sql_field_string = thumb

    sql_attr_timestamp = created_at

    sql_query_info_pre      = SET NAMES utf8         
}

2)增量索引

#文章增量索引
index article_step:article
{
    source            = article_step            #对应的source名称
    path = E:/www/coreseek/coreseek-4.1-win32/var/data/test/article_step
}

启动服务

命令行,启动服务,必须打开控制台,php才能连到sphinx,并一直开启具体命令如下:

E:\www\coreseek\coreseek-4.1-win32\bin>searchd.exe –c E:\www\coreseek\coreseek-4.1-win32\etc\csft_mysql.conf

调用查询

1)使用步骤
在php中引入coreseek/api目录下的sphinxapi.php文件,该文件包含一个SphinxClient的类

$sAppPath = app_path();
require_once ( $sAppPath.'/extends/sphinx/sphinxapi.php' );
$oSphinx = new SphinxClient ();
//sphinx 生成索引文件所在服务器域名与端口
$oSphinx->SetServer ( '127.0.0.1', '9312');
//匹配结果的偏移量,参数分别为:起始位置,返回结果条数,最大匹配条数
$oSphinx->SetLimits($iOffset, $iPageSize, $iMaxReturn);
//最大搜索时间
$oSphinx->SetMaxQueryTime(1000);
$sRes = $oSphinx->Query($sKeyWorlds, '*' );
//echo '<pre>';
//print_r($sRes);
//echo '</pre>';


$sRes是一个数组,返回数组结构如下

array (size=8)
  'error' => string '' (length=0)
  'warning' => string '' (length=0)
  'status' => int 0
  'fields' => 
    array (size=4)
      0 => string 'title' (length=5)
      1 => string 'intro' (length=5)
      2 => string 'content' (length=7)
      3 => string 'thumb' (length=5)
  'attrs' => 
    array (size=8)
      'contentid' => int 1
      'title' => int 7
      'intro' => int 7
      'content' => int 7
      'thumb' => int 7
      'collect' => int 1
      'hit' => int 1
      'created_at' => int 2
  'total' => string '0' (length=1)
  'total_found' => string '0' (length=1)
  'time' => string '0.000' (length=5)

total是匹配到的数据总数量
matches是匹配的数据,包含 id,attr 这些信息
words 是检索关键字的分词

2)类似 mysql 条件的用法

//属性过滤,可过滤的属性必须在配置文件中设置sql_attr_ 
sql_attr_uint = id //定义int类型属性,该字段会被保存到结果集中
sql_attr_timestamp = created_at//定义时间类型属性
//如果再次修改这些属性,需要重新生成索引才能生效

//指定一些值:第一个参数为指定的字段,第二个参数为该字段的值,第三个参数为true时,表示不包含该值
$oSphinx->SetFilter('contentid', array($iId));
$oSphinx->SetFilter('contentid', array($iId), true);
//指定一个值的范围:第一个参数表判断的字段,第二、三个参数表范围,第四个参数为true时,表示不包含该范围
$oSphinx->SetFilterRange('contentid', 1, 10);

3)排序
SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)

SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面),需要设置一个属性名

SPH_SORT_ATTR_ASC模式, 按属性升序排列(属性值越小的越是排在前面),需要设置一个属性名SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序,需要设置一个属性名

SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排列。
$oSphinx->SetSortMode ( SPH_SORT_ATTR_DESC, "hit" );

:内置属性需要加@,可用的内置属性如下
–@id(匹配文档的ID)
–@weight(匹配权值)
–@rank (等同weight)
–@relevance(等同weight)
–@random(随机顺序返回结果)

SPH_SORT_EXPR 模式,按某个算术表达式排序

4)匹配模式
SPH_MATCH_ALL, 匹配所有查询词(默认模式);
SPH_MATCH_ANY, 匹配查询词中的任意一个;
SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配;
SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式
SPH_MATCH_EXTENDED, 将查询看作一个CoreSeek/Sphinx内部查询语言的表达式 . 从版本Coreseek 3/Sphinx 0.9.9开始, 这个选项被选项SPH_MATCH_EXTENDED2代替,它提供了更多功能和更佳的性能。保留这个选项是为了与遗留的旧代码兼容——这样即使Sphinx及其组件包括API升级的时候,旧的应用程序代码还能够继续工作。
SPH_MATCH_EXTENDED2, 使用第二版的“扩展匹配模式”对查询进行匹配.
SPH_MATCH_FULLSCAN, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,但任何文本匹配都不会发生.
我们要关注的主要是SPH_MATCH_EXTENDED2扩展匹配模式,扩展匹配模式允许使用一些像mysql的条件语句
$oSphinx->SetMatchMode ( SPH_MATCH_ANY);//模糊匹配
$oSphinx->SetMatchMode ( SPH_MATCH_ALL);//精确匹配

检索返回字段问题

需要返回文本字段,可以在配置文件中定义:

sql_field_string =title
sql_field_string =content

sql_attr_stringsql_field_string的区别
sql_attr_string 字符串属性(可返回原始文本信息)
sql_field_string字符串字段(可全文检索,可返回原始文本信息)

相关标签: sphinx

上一篇:

下一篇: