coreseek的简单介绍

http://www.itjxue.com  2023-01-21 16:54  来源:未知  点击次数: 

coreseek(sphinx) 如何实现 like 模糊查询?

1、sphinx的两个主要进程indexer和searchd。

indexer任务是从数据库(或者其他的数据源)收集原始的数据,然后建立相应的索引。

searchd则是通过读取indexer建立的索引来响应客户端的请求。

2、sphinx工作前提:配置文件修改

a、需要让其获取数据源从何而来(即:配置source信息)

b、建立索引,对数据源的哪部分数据进行索引等详细信息(即:indexer的所有信息)

c、执行indexer生产索引,最用才启用searchd服务

3、应用主要是通过api接口实现,支持php、perl、python及ruby等语言调用。

coreseek 安装完成后 怎么调用接口

然后重新运行aclocal和autoconf

aclocal autoconf

最后再次运行automake

automake

然后继续mmseg的安装

./configure --prefix=/usr/local/mmseg

make make install

如果make 报错

There is an easy fix when you get such messages as "X--tag=CXX: command not found".

Just type:

export echo=echo

And try again.

所以输入

export echo=echo

然后再次运行安装

make make install

安装csft

./configure --prefix=/usr/local/coreseek --with-mysql=/usr/local/mysql --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/

make make install

安装完毕后 注意 coreseek 中的配置文件也是csft.conf 而不是 sphinx.conf

cd /usr/local/coreseek/etc

cp sphinx.conf.dist csft.conf

vim csft.conf

有些配置改动如下其他配置内容如上文的sphinx.conf

在索引源中注释掉txt

index main{

#stopwords = G:\data\stopwords.txt

#wordforms =G:\data\wordforms.txt

#exceptions =/data/exceptions.txt

#charset_type = sbcs

#添加下面2行 意思是把中文分词加入到配置文件中

char_type = zh_cn.utf-8

charset_dictpath =/usr/local/mmseg/etc/ #你安装mmseg的目录

}

保存配置

建立索引

cd /usr/local/coreseek/bin

./indexer --all

./search 中文词缀

如何用php去使用sphinx

Sphinx集成到php程序中有两种方式

1.Sphinx php 模块(这次我们选择使用的方式)

2.Sphinx api 类(位于coreseek源码包里的csft里的api文件夹里有一个sphinxapi.php,使用的时候包含这个php文件即可)

我们要使用sphinx需要做以下几件事:

1.首先要有数据

2.建立sphinx配置文件

3.生成索引

4,启动searchd 服务进程,并开启端口9312

5.用php客户程序去链接sphinx服务

/usr/local/coreseek/bin/searchd

启动进程命令 searchd

-c 指定配置文件

--stop 停止服务

--pidfile 显示指定pid文件

-p 指定端口(默认9312)

注意:这里启动的服务是searchd

使用php sphinx的模块

下载 sphinx-1.1.0.tgz

tar zvxf sphinx-1.1.0.tgz

cd sphinx-1.1.0

/usr/local/php/bin/phpize #用于生成一个configure的脚本

进入coreseek源码包的csft/api/libsphinxclent 目录下执行configure

./configure

make make install

进入sphinx-1.1.0.gzt的源码包目录下 执行configure用于生成so 的shpinx模块

./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-sphinx

make make install

安装成功后会有提示

Build complete.

Don't forget to run 'make test'.

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/ (这个目录是sphinx.so所在的目录)

然后我们编辑php的ini文件 在extension中加入

extension=sphinx.so

然后重启nginx和php的服务

最后打印一下phpinfo 查看sphinx是否开启成功

如果成功开启 就可以使用php手册里的sphinx的方法和代码了

在thinkphp下怎么使用coreseek

首先我们把coreseek下载好,命名为coreseek,我们找到coreseek/etc中的csft_mysql.conf修改这个配置文件。

#源定义

source lemai

{

type = mysql

sql_host = localhost

sql_user = root

sql_pass = 123

sql_db = lemai

sql_port = 3306

sql_query_pre = SET NAMES utf8

sql_query = SELECT id, title,content,name FROM shop

#sql_query第一列id需为整数

#title、content作为字符串/文本字段,被全文索引

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

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

sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集

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

}

#index定义

index lemai

{

source = lemai #对应的source名称

path = var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

docinfo = extern

mlock = 0

morphology = none

min_word_len = 1

html_strip = 0

#中文分词配置,详情请查看:

#charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾

charset_dictpath = C:/AppServ/www/thinkphp/ThinkPHP/Extend/Vendor/Coreseek/etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...

charset_type = zh_cn.utf-8

#charset_table =

ngram_len = 0

}

#全局index定义

indexer

{

mem_limit = 128M

}

#searchd服务定义

searchd

{

listen = 9312

read_timeout = 5

max_children = 30

max_matches = 1000

seamless_rotate = 0

preopen_indexes = 0

unlink_old = 1

pid_file = var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

log = var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

query_log = var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

}

然后把coreseek拷贝一份到thinkphp的核心文件Extend/Vendor下.

打开cmd cd到coreseek

bin\indexer -c etc\csft_mysql.conf (mysql,等)数据库名 创建索引

创建完之后我们可以在var\data下看到一堆文件,此时说明创建成功

bin\searchd -c etc\csft_mysql.conf --console 启动进程

(检查端口9312是否有这个进程,有就OK)

命令行查询

echo 一号店 |iconv -f gbk -t utf-8 | search -c etc\csft_mysql.conf --stdin | iconv -f utf-8 -t gbk 中文索引查询

然后就可以在控制器中进行PHP连接sphinxapi进行测试了

Vendor('Coreseek.api.sphinxapi');

//加载第三方扩展包的文件 文件名不包含class

$db = new PDO('mysql:host=localhost;port=3306;dbname=lemai', 'root', '123', array( PDO::MYSQL_ATTR_INIT_COMMAND = 'SET NAMES UTF8'));

//实例化PDO

$spx = new SphinxClient();

//实例化SphinxClient

$spx - SetServer('127.0.0.1',9312);

$spx-SetConnectTimeout ( 3 );

$spx-SetArrayResult ( true );

$spx - SetMatchMode(SPH_MATCH_ANY);

$result = $spx - query('1','*');

$ids = join(",",array_keys($result['matches']));

$sql = "SELECT * FROM shop where id in ({$ids})";

$stmt = $db-query($sql);

$r = $stmt-FETCHALL(PDO::FETCH_ASSOC);

echo "pre";

var_dump($r);

以下是我的实例代码 包括sphinx分页

class IndexAction extends Action {

public function index(){

header("Content-type:text/html;charset=utf-8");

//设置字符集

$keyword = $_GET['kw'];

Vendor('Coreseek.api.sphinxapi');

//加载第三方扩展包的文件 文件名不包含class

$db = M();

$spx = new SphinxClient();

//实例化SphinxClient

$spx - SetServer('127.0.0.1',9312);

//设置ip和端口

$spx-SetConnectTimeout ( 3 );

//设置超时时间

$spx-SetArrayResult ( true );

if(strlen($keyword)=18){

$spx - SetMatchMode(SPH_MATCH_ALL);//如果用户查询字符大于=18个匹配有查询词

}else{

$spx - SetMatchMode(SPH_MATCH_ANY);//匹配查询词中的任意一个

}

//------

$limit = 12;//每页要显示的数量

$page = $_GET['page']1 ? $_GET['page'] : 1;

//GET值不为1 则按1算

//$spx-setLimits(0,12);

$off = ($page-1)*$limit;

$spx-SetLimits( $off, $limit);

//设置分页

$result = $spx - query("{$keyword}",'*');

/*

* 取出matches中的id,组成字符串

*/

$str = '';

foreach($result['matches'] as $rrs){

$str.=$rrs['id'].',';

}

$ids = rtrim($str,',');

//操作数据库

$sql = "SELECT * FROM shop where id in ({$ids})";

$stmt = $db-query($sql);

$opts = array(

"before_match"="span style='color:red'",//添加样式

"after_match"="/span"

);

foreach($stmt as $st){

$shop_all[] = $spx-buildExcerpts($st,'lemai',$keyword,$opts);

}

$num = $result['total'];

$count =ceil($result['total']/12);//查出sphinx搜索总数 得出该关键词分页数

$pagenum = $_GET['page']1?$_GET['page']:1;

$this-assign('pagenum',$pagenum);

$this-assign('num',$num);

$this-assign('count',$count);

$this-assign('shop_all',$shop_all);

$this-assign('keyword',$keyword);

$this-display("seek");

}

}

coreseek和lucence 的区别在哪里,各自有什么优点,相关性哪个好,百万级和千万级索引应该选用哪个?

1.php用coreseek,java用lucene。2.coreseek支持高速建立索引:10MB/秒;lucene为1.8MB/秒3.coreseek具有高扩展性(最高可对100GB文件建立索引),支持分布式检索,支持不同的搜索模式(“完全匹配”,“短语匹配”和”任一匹配“),支持作为Mysql的存储引擎lucene索引文件格式独立于应用平台;在传统全文检索引擎的倒排索引的基础上,实现了分块索引;查询实现中默认实现了布尔操作、模糊查询、分组查询等。相关性都还过得去,根据你团队的技术水平、程序、需求来选择

coreseek3.2 php 怎样更新索引

php是无法更新?coreseek ?的索引的,需要使用coreseek的语法,配合定时任务来自动更新索引。

这个写起来很麻烦,我们的系统正好用了 coreseek ,说一下我的思路吧。

1、首先建立一个 ?search 表,这个表用来存你要进行搜索的、经过分词的数据,分词系统你们自己选,我使用的是php的pscws4中文分词。

DROP?TABLE?IF?EXISTS?`search`;

CREATE?TABLE?`search`?(

??`searchid`?int(11)?NOT?NULL?AUTO_INCREMENT,

??`title`?varchar(255)?NOT?NULL,

??`content`?text?NOT?NULL,

??`add_time`?int(11)?NOT?NULL,

??PRIMARY?KEY?(`searchid`)

)?ENGINE=MyISAM?AUTO_INCREMENT=15209?DEFAULT?CHARSET=utf8;

2、还需要一个 索引计数表?search_counter,这个表用来存放每次索引更新后的最大一个ID,下次更新索引的时候,就不需要从头更新了,只需要比这个ID大的就可以。

DROP?TABLE?IF?EXISTS?`search_counter`;

CREATE?TABLE?`search_counter`?(

??`counter_id`?int(11)?NOT?NULL,

??`max_doc_id`?int(11)?NOT?NULL,

??PRIMARY?KEY?(`counter_id`)

)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;

3、配置?coreseek ,以下是我在windows下?coreseek的配置文件,linux 在服务器上,没去找。这里配置了2个索引源,一个是main,一个是增量索引delta,这样不需要每次重建所有索引,只需要合并?main和delta就可以了。

#源定义

source?main

{

????type????????????????????=?mysql

????sql_host????????????????=?192.168.0.10

????sql_user????????????????=?root

????sql_pass????????????????=?root

????sql_db??????????????????=?database

????sql_port????????????????=?3306

????sql_query_pre???????????=?SET?NAMES?utf8

????sql_query_pre???????????=?REPLACE?INTO?search_counter?SELECT?1,?MAX(searchid)?FROM?qhb_search

????sql_query???????????????=?SELECT?searchid,?title,?content,?controller_id,?controller,add_time?FROM?search

??????????????????????????????????????????????????????????????#sql_query第一列id需为整数

??????????????????????????????????????????????????????????????#title、content作为字符串/文本字段,被全文索引

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

sql_attr_uint???????????=?controller_id??????#?数据库ID过滤

sql_attr_uint???????????=?controller?????????#?控制器过滤

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

????sql_query_info_pre??????=?SET?NAMES?utf8????????????????????????????????????????#命令行查询时,设置正确的字符集

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

}

source?delta?:?main

?

{

?

????sql_query_pre??=?SET?NAMES?utf8

????sql_query??????=?SELECT?searchid,?title,?content,?controller_id,?controller,add_time?FROM?qhb_search?WHERE?searchid(?SELECT?max_doc_id?FROM?qhb_search_counter?WHERE?counter_id=1?)

sql_query_post?=?REPLACE?INTO?qhb_search_counter?SELECT?1,?MAX(searchid)?FROM?qhb_search

?

}

#index定义

index?main

{

????source??????????=?main?????????????#对应的source名称

????path????????????=?D:/WebSoft/coreseek/var/data/main?#请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

????docinfo?????????=?extern

????mlock???????????=?0

????morphology??????=?none

????min_word_len????=?1

????html_strip??????=?0

????#中文分词配置,详情请查看:

????#charset_dictpath?=?/usr/local/mmseg3/etc/?#BSD、Linux环境下设置,/符号结尾

????charset_dictpath??=?D:/WebSoft/coreseek/etc/???????????#Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...

????charset_type??????=?zh_cn.utf-8

}

index?delta?:?main

?

{

????source?=?delta

????path???=?D:/WebSoft/coreseek/var/data/delta

?

}

#全局index定义

indexer

{

????mem_limit????????????=?128M

}

#searchd服务定义

searchd

{

????listen??????????????=???9312

????read_timeout????????=?5

????max_children????????=?30

????max_matches?????????=?1000

????seamless_rotate?????=?0

????preopen_indexes?????=?0

????unlink_old??????????=?1

????pid_file??=?D:/WebSoft/coreseek/var/log/searchd_main.pid??#请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

????log???????=?D:/WebSoft/coreseek/var/log/searchd_main.log????????#请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

????query_log?=?D:/WebSoft/coreseek/var/log/query_main.log?#请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

}

4、建立索引。必须要先建立索引,?coreseek 才能启动。下面是我在Windows的建立索引命令,如何使用命令行我就不赘述了。

D:\WebSoft\coreseek\bin\indexer?--all?--config?d:\WebSoft\coreseek\bin\sphinx.conf

5、配置并启动服务

D:\WebSoft\coreseek\bin\searchd?--install?--config?

D:\WebSoft\coreseek\bin\sphinx.conf?--servicename?coreseek

6、Windows创建定时任务,每分钟更新一次索引

D:\WebSoft\coreseek\bin\indexer.exe?--config?D:\WebSoft\coreseek\bin\sphinx.conf?delta?--rotate

echo?indexing,?window?will?close?when?complete

7、Windows创建定时任务,每天凌晨2点合并索引

D:\WebSoft\coreseek\bin\indexer.exe?--config?D:\WebSoft\coreseek\bin\sphinx.conf?--merge?main?delta?--rotate

echo?indexing,?window?will?close?when?complete

8、附上 创建索引,重建索引,合并索引在windows及linux上的方法,以及一些使用上的小问题

windows:

建立索引

D:\WebSoft\coreseek\bin\indexer?--all?--config?d:\WebSoft\coreseek\bin\sphinx.conf

重建索引

D:\WebSoft\coreseek\bin\indexer?--config?D:\WebSoft\coreseek\bin\sphinx.conf?main?--rotate

增量索引

D:\WebSoft\coreseek\bin\indexer?--config?D:\WebSoft\coreseek\bin\sphinx.conf?delta?--rotate

合并索引

D:\WebSoft\coreseek\bin\indexer?--config?D:\WebSoft\coreseek\bin\sphinx.conf?--merge?main?delta?--rotate

配置并启动服务

D:\WebSoft\coreseek\bin\searchd?--install?--config?D:\WebSoft\coreseek\bin\sphinx.conf?--servicename?coreseek

创建自定义词库方法:

1、先去??搜狗细胞词库下载需要的词库

2、使用?深蓝词库转换?将词库转换为?txt

3、使用PHP程序将?生成的txt转换为?coreseek?所需要的格式

4、附加到??unigram.txt

5、使用命令更新分词词库

???cmd?进入?bin目录,执行下面命令

???mmseg?-u?D:\WebSoft\coreseek\etc\unigram.txt

6、将生成的??unigram.txt.uni?改名为:uni.lib

7、重建索引

8、重启coreseek服务

注意:

必须先建立索引,服务才能启动

1、coreseek索引或者查询时提示ERROR:?invalid?token?in?etc解决办法

该提示表示当前的配置文件的编码不是UTF-8(无BOM头)格式,无法正确解析,请使用编辑软件打开配置文件,另存为UTF-8(无BOM头)格式;

2、failed?to??lock?.....try?--rotate??

索引已经建立,使用重建索引命令

3、报警告:failed?to?scanf?pid?from?

没有启动coreseek服务

4、过滤搜索结果,必须使用数组传递,只支持???

无符号整数(1-32位宽);

UNIX?时间戳(timestamps);

浮点值(32位,IEEE?754单精度);

字符串序列?(尤其是计算出的整数值);

多值属性?MVA(?multi-value?attributes?)?(32位无符号整型值的变长序列)

$this-shpinx-SetFilter('controller',?array(1,2)?);

CENTOS?操作方法

开机启动coreseek搜索服务:

vi?/etc/rc.d/rc.local??

在最后一行添加

/usr/local/coreseek/bin/searchd?-c?/usr/local/coreseek/bin/sphinx.conf

##如要停止搜索服务,请使用/usr/local/coreseek/bin/searchd?-c?/usr/local/coreseek/bin/sphinx.conf?--stop

##如要已启动服务,要更新索引,请使用/usr/local/coreseek/bin/indexer?-c?/usr/local/coreseek/bin/sphinx.conf?--all?--rotate

linux下编辑定时任务?crontab?-e

#凌晨4点合并索引,其余时间每分钟更新索引

*?0-3?*?*?*?/usr/local/sphinx/bin/indexer?--config?/usr/local/sphinx/etc/sphinx.conf?delta?--rotate

*?6-23?*?*?*?/usr/local/sphinx/bin/indexer?--config?/usr/local/sphinx/etc/sphinx.conf?delta?--rotate

0?4?*?*?*?/usr/local/sphinx/bin/indexer?--config?/usr/local/sphinx/etc/sphinx.conf?--merge?main?delta?--rotate

启动服务:

/usr/local/coreseek/bin/searchd?-c?/usr/local/coreseek/bin/sphinx.conf

建立索引

/usr/local/coreseek/bin/indexer?--all?--config?/usr/local/coreseek/bin/sphinx.conf

重建索引

/usr/local/coreseek/bin/indexer?--config?/usr/local/coreseek/bin/sphinx.conf?main?--rotate

增量索引

/usr/local/coreseek/bin/indexer?--config?/usr/local/coreseek/bin/sphinx.conf?delta?--rotate

合并索引

/usr/local/coreseek/bin/indexer?--config?/usr/local/coreseek/bin/sphinx.conf?--merge?main?delta?--rotate

(责任编辑:IT教学网)

更多

推荐网页背景文章