注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

全文检索开源(Sphinx、coreseek、xunsearch) 系统  

2012-11-22 14:20:42|  分类: Web技术-应用研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一  简介
     Sphinx: 开源的全文检索软件 http://www.sphinxsearch.com/ (本身对中文支持不是很好)
    coreseek:是一款中文全文检索/搜索软件,基于Sphinx研发并独立发布 http://www.coreseek.cn/
    xunsearch:基于Xapian(http://xapian.org/) 和 Scws  开发的中文全文检索软件 http://www.xunsearch.com/

二  使用
     sphinx、coreseek、xunsearch这三个全文检索软件,在客户端开发(使用)上来说,xunsearch是最简单的。因此我们先从 xunsearch 说起。
 
     Xunsearch
    首先进入其官网http://www.xunsearch.com/ 去下载服务端的包以及提供的PHP SDK包。
     由于xunsearch只支持类UNIX 系统,因此我这里只说其客户端的使用。
     客户端的集成引官网文档来说可以分为:
1 编写项目配置文件。
2 决定索引更新方式。
3 引入 PHP-SDK 的入口文件 $prefix/sdk/php/lib/XS.php 进行搜索功能和界面开发。
4 最终调整与正式部署。
    以上步骤 xunsearch 都提供了完整的PHP SDK API(包括索引的建立),以上步骤官网都给出很详细的说明文档,我这里就不多说,只是提供一条线路。
  1 编写项目配置文件,你需要看:
        b) 配置文件详解: http://www.xunsearch.com/doc/php/guide/ini.guide

 2 决定索引更新方式。如果项目搜索的实时要求比较高、而且采用 PHP 开发,则建议修改项目代码, 在数据变动时调用 XSIndex 的相关 API 进行索引同步;否则请另行编写索引管理工具, 选用定时或不定时重建的方式(如果你使用其提供的PHP API,你需要看:)。
    a) 添加一条简单的索引 http://www.xunsearch.com/doc/php/guide/index.add
          b) 批量添加一条索引 http://www.xunsearch.com/doc/php/guide/util.indexer
      c) 关于索引 与 XSDocument 文档 http://www.xunsearch.com/doc/php/guide/index.overview  
                                       http://www.xunsearch.com/doc/php/guide/class.document

3  进行搜索功能和界面开发,你需要看
    a) API提供的界面: http://www.xunsearch.com/doc/php/guide/util.skel
    b) 详细的搜索API解析:http://www.xunsearch.com/doc/php/guide/search.overview (从这里开始看)
 
通过以上步骤是很容易搭建起一个项目来的。

Sphinx
同样的进入其官网 http://www.sphinxsearch.com/下载其服务器包,由于sphinx支持windows系统,因此我们这里下载 sphinx win版本的。
下载后好,减压缩。sphinx设置的详情文档参考:http://sphinxsearch.com/docs/ (注意各语言的API在下载包里有)。
下面我写的是一条线路(注意要让sphinx支持中文查寻,应该使用http://www.coreseek.cn/插件):

1  设置配置文件。
    你可以参考http://sphinxsearch.com/docs/manual-0.9.9.html#confgroup-index  这里文档完成配置文件设置。
    一个简单的配置(更多复杂配置参看官网)

#
# Minimal Sphinx configuration sample (clean, simple, functional)
#
#主数据源
source main
{
type = mysql

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

sql_query_pre = SET NAMES utf8

sql_query = \
SELECT id, title, number, created_time \
FROM test

#这里属性设置(参看:http://sphinxsearch.com/docs/manual-0.9.9.html#attributes)
sql_attr_uint = number
sql_attr_timestamp = created_time

sql_query_info = SELECT * FROM test WHERE id=$id
}

#主索引
index main
{
source = main
path = D:/sphinx/sphinx_server/data/main
docinfo = extern
charset_type = utf-8
}

#索引配置
indexer
{
mem_limit = 32M
}

#索引器配置
searchd
{
port = 9312
log = D:/sphinx/sphinx_server/data/log/log/searchd.log
query_log = D:/sphinx/sphinx_server/data/log/query.log
read_timeout = 5
max_children = 30
pid_file = D:/sphinx/sphinx_server/data/log/searchd.pid
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 0
unlink_old = 1
}



    

2  建议索引
   进入到sphinx服务端的目录里,进入bin目录 运行

bin>indexer -c sphinx.conf(这里写上你的conf文件路径) main(这里写上你的主数据源名称)

成功后,你应该看到的信息是:
全文检索开源软件(Sphinx、xunsearch) - fc_lamp - @fc_lamp
 

3  启动sphinx 服务

bin>searchd -c sphinx.conf(这里写上你的conf文件路径)

一切正常,你将看如下图:
全文检索开源软件(Sphinx、xunsearch) - fc_lamp - @fc_lamp
accepting connections 等待连接。


4 客户端 调用API
  这里我们使用PHP的方式

<?php
require './sphinxapi.php';
$cl = new SphinxClient ();
$cl->SetServer ( '127.0.0.1', 9312 ); //注意这里的主机
//使用多字段模式
$cl->SetMatchMode(SPH_MATCH_EXTENDED);
$cl->SetMatchMode( SPH_MATCH_ALL );
$pageSize = 5;
$offset = 0;
//分页设置
$cl->SetLimits($offset,$pageSize,100);
$index = 'main';
$res = $cl->Query ( $_GET ['keywords'], $index );
//这里有一个问题:使用sphinx全文查寻出后得到仅是ID,真实数据还以
//返回的ID去查寻数据库,获取出数据来(不过,现在有了另一个解决方案sphinx 支持mysql内查寻)。



Coreseek 
 首先我们采用的是 win coreseek 3.2.14 版本,在这里下载:http://www.coreseek.cn/products-install/install_on_windows/
 同样的下载包里已包含了API接口文件。

1 设置配置文件
   你可能还需要看一下这个文件:http://www.coreseek.cn/products-install/coreseek_mmseg/ (中文分词配置)
  下面是一个简单的配置文件(更多选项参考官网)

#
# Minimal Sphinx configuration sample (clean, simple, functional)
#
#主数据源
source main
{
type = mysql

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

#设置正确的字符集
sql_query_pre = SET NAMES utf8

#sql_query第一列id需为整数 title、msg作为字符串/文本字段,被全文索引
sql_query = \
SELECT id, title, group_id,msg,begin_time \
FROM test

#从SQL读取到的值必须为整数
sql_attr_uint = group_id
#从SQL读取到的值必须为整数,作为时间属性
sql_attr_timestamp = begin_time

#命令行查询时,从数据库读取原始数据信息
sql_query_info = SELECT * FROM test WHERE id=$id
}

#主索引
index mysql
{
source = mysql
path = D:/coreseek/var/mysql
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0

##以下部分为中文分词核心配置(Windows环境下设置,/符号结尾,最好给出绝对路径)
#中文分词参考:http://www.coreseek.cn/products-install/coreseek_mmseg/

#可选设置,表示停止词文件,该文件中的词汇(也可以为单字)不参与搜索
#stopwords = /path/to/stowords.txt

#必须设置,表示词典文件的目录,该目录下必须有uni.lib词典文件存在;
charset_dictpath = D:/coreseek/etc

#必须设置,表示启用中文分词功能;否则中文分词功能无效,使用sphinx的其他处理模式
charset_type = zh_cn.utf-8

#必须设置,表示取消原有的一元字符切分模式,不使其对中文分词产生干扰(字符表)
charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z,\
A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6,\
U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101,\
U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109,\
U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F,\
U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, \
U+0116->U+0117,U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D,\
U+011D,U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, \
U+0134->U+0135,U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, \
U+013C,U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, \
U+0143->U+0144,U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, \
U+014B,U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, \
U+0152->U+0153,U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159,\
U+0159,U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, \
U+0160->U+0161,U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, \
U+0167,U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, \
U+016E->U+016F,U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175,\
U+0175,U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, \
U+017B->U+017C,U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, \
U+0430..U+044F,U+05D0..U+05EA, U+0531..U+0556->U+0561..U+0586, U+0561..U+0587, \
U+0621..U+063A, U+01B9,U+01BF, U+0640..U+064A, U+0660..U+0669, U+066E, U+066F, \
U+0671..U+06D3, U+06F0..U+06FF,U+0904..U+0939, U+0958..U+095F, U+0960..U+0963, \
U+0966..U+096F, U+097B..U+097F,U+0985..U+09B9, U+09CE, U+09DC..U+09E3, U+09E6..U+09EF, \
U+0A05..U+0A39, U+0A59..U+0A5E,U+0A66..U+0A6F, U+0A85..U+0AB9, U+0AE0..U+0AE3, \
U+0AE6..U+0AEF, U+0B05..U+0B39,U+0B5C..U+0B61, U+0B66..U+0B6F, U+0B71, U+0B85..U+0BB9, \
U+0BE6..U+0BF2, U+0C05..U+0C39,U+0C66..U+0C6F, U+0C85..U+0CB9, U+0CDE..U+0CE3, \
U+0CE6..U+0CEF, U+0D05..U+0D39, U+0D60,U+0D61, U+0D66..U+0D6F, U+0D85..U+0DC6, \
U+1900..U+1938, U+1946..U+194F, U+A800..U+A805,U+A807..U+A822, U+0386->U+03B1, \
U+03AC->U+03B1, U+0388->U+03B5, U+03AD->U+03B5,U+0389->U+03B7, U+03AE->U+03B7, \
U+038A->U+03B9, U+0390->U+03B9, U+03AA->U+03B9,U+03AF->U+03B9, U+03CA->U+03B9, \
U+038C->U+03BF, U+03CC->U+03BF, U+038E->U+03C5,U+03AB->U+03C5, U+03B0->U+03C5, \
U+03CB->U+03C5, U+03CD->U+03C5, U+038F->U+03C9,U+03CE->U+03C9, U+03C2->U+03C3, \
U+0391..U+03A1->U+03B1..U+03C1,U+03A3..U+03A9->U+03C3..U+03C9, U+03B1..U+03C1, \
U+03C3..U+03C9, U+0E01..U+0E2E,U+0E30..U+0E3A, U+0E40..U+0E45, U+0E47, U+0E50..U+0E59, \
U+A000..U+A48F, U+4E00..U+9FBF,U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF, \
U+2F800..U+2FA1F, U+2E80..U+2EFF,U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF, \
U+3040..U+309F, U+30A0..U+30FF,U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF, \
U+3130..U+318F, U+A000..U+A48F,U+A490..U+A4CF


#取消原有的一元字符切分模式

ngram_len = 0

}

#索引配置
indexer
{
mem_limit = 32M
}

#索引器配置
searchd
{
listen = 9312
log = D:/coreseek/var/log/searchd_mysql.log
query_log = D:/coreseek/var/log/query_mysql.log
pid_file = D:/coreseek/var/log/searchd.pid
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
}


 PS:官网给出的配置文件很蛋疼,很多东西都自己去找。
  
 2  建立索引

D:/coreseek/etc>D:/coreseek/bin/indexer --all

这句命令为:先进入你的配置文件目录(也就是csft.conf所在目录),然后使用使用 indexer(注意所在上当目录正确) 创建索引。
如果一切正常用,你将看到以下信息:
全文检索开源软件(Sphinx、coreseek、xunsearch) - fc_lamp - @fc_lamp
 
3 启动服务
   启动服务你可以有两种方式:
   1) 一是把把 searchd 服务安装成一个Windows服务(来自官网手册):
     C:\usr\local\coreseek> C:\usr\local\coreseek\bin\searchd.exe --install --config C:\usr\local\coreseek\etc\coreseek.conf --servicename Coreseek 
这样 searchd 服务应该出现在“控制面板->系统管理->服务”的列表中了。

 2) 我们使用命令启动
   

D:/coreseek/etc>D:/coreseek/bin/searchd

注意路径,一切正常得话如下图:
全文检索开源软件(Sphinx、coreseek、xunsearch) - fc_lamp - @fc_lamp
 

4 客户端使用API
  这里我们一样使用PHP的方式:

require ("sphinxapi.php");

$cl = new SphinxClient ();
$cl->SetServer ( '127.0.0.1', 9312 );
//使用多字段模式
$cl->SetMatchMode ( SPH_MATCH_EXTENDED );
$cl->SetMatchMode ( SPH_MATCH_ALL );
$pageSize = 5;
$offset = 0;
//分页设置
$cl->SetLimits ( $offset, $pageSize, 100 );
$res = $cl->Query ( '电影票', "main" );
#总条目
var_dump ( $res ['total'] );
#结果
var_dump ( $res ['matches'] );
#耗时
var_dump ( $res ['time'] );




好了,这样Sphinx、coreseek、xunsearch 这三个开源的全文索引软件都简单说(不是讲)完了。
 
PS:这里附上memcached 的安装使用 http://fc-lamp.blog.163.com/blog/static/174566687201122811230906/




      
   

  评论这张
 
阅读(1775)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017