一、认识corseseek
coreseek的结缘还是从2018年下半年开始接触的,总体感觉还是好的,因为毕竟自己做的项目上再搜索引擎上面也是几经周折,从去年到至今运行稳定,几乎没有出现任何纰漏,客户体验上也还过得去。但最近在别的项目上又需要到了搜索引擎,我居然忘的一干二净。汗颜啊!
没办法,重新复习下吧,记得以前做过coreseek的笔记,更悲催的是找不到了,印象中在CSDN上有位前辈写过非常详细的文章,并且和他有交流过,遗憾的是找不到了。所以综以上几点,也是写这篇文章的主要目的,少走弯路,把心得记下来!也借此能够帮助更多的兄弟姐妹!哈哈,gao了。
网上有很多这样关于coreseek的文章,可他们老是把sphinx和coreseek标题写到一起,也没有标记一下所安装记录的版本,导致我很懵,你到底是再说sphinx呢,还是在说coreseek呢?虽然两者有关系,但是也不能混在一起说不清楚吧,能说清楚也算,不过写博客的目的不同,自己能看得懂也可以,但是过了长时间在回来看,你能保证再看的懂吗?
二、Sphinx和Coreseek
众所周知,mysql等数据库的LIKE模糊搜索不支持索引,因此查询效率极低,需要结合第三方索引引擎程序(索引程序)来提高查询性能。开源索引程序有3大类:lucene系(java开发,包括solr和elasticsearch)、sphinx(c++开发,简单高性能)、Xapian(c++开发),其中lucene由于hadoop的原因名气最大,sphinx因为简单可靠,代码结构优良,性能非常好,在国内大型网站中使用最广。sphinx是国外的一款搜索软件,但是本身不支持中文索引,coreseek在sphinx基础上增加了中文分词功能,支持了中文索引。本文主要介绍Coreseek4.1.32的使用。
Sphinx是国外的一款搜索软件。 coreseek是在sphinx的基础上,增加了中文分词功能,换句话说,就是支持了中文。 Coreseek发布了3.2.14版本和4.1版本,其中的3.2.14版本是2010年发布的,它是基于Sphinx0.9.9搜索引擎的。而4.1版本是2011年发布的,它是基于Sphinx2.0.2的。Sphinx从0.9.9到2.0.2还是有改变了很多的,有很多功能,比如sql_attr_string等是在0.9.9上面不能使用的。 可以同时安装sphinx,coreseek,不会互相冲突。
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。
Sphinx单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
Sphinx的主要特性包括:
高速索引(在新款CPU上,近10 MB/秒);高速搜索 (2-4G的文本量中平均查询速度不到0.1秒);高可用性(单CPU上最大可支持100 GB的文本,100M文档);提供良好的相关性排名支持分布式搜索;提供文档摘要生成;提供从MySQL内部的插件式存储引擎上搜索支持布尔,短语,和近义词查询;支持每个文档多个全文检索域(默认最大32个);支持每个文档多属性;支持断词;支持单字节编码与UTF-8编码。
Sphinx是开源的搜索引擎,它支持英文的全文检索。所以如果单独搭建Sphinx,你就已经可以使用全文索引了。但是往往我们要求的是中文索引,怎么做呢?国人提供了一个可供企业使用的,基于Sphinx的中文全文检索引擎。也就是说Coreseek实际上的内核还是Sphinx。
Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景,用户可以免费下载使用。
Coreseek 是一款基于sphinx开源的搜索引擎 ,专门为用户提供免费的中文全文检索系统 ,coreseek被称为带有中文分词的sphinx,与 sphinx不同的是coreseek增加了一个带有中文分词的词库。
Sphinx可以通过设置为“一元切分模式”来支持搜索中文,在实际使用中,搜索非中文的话,sphinx比coreseek要快;搜索短中文字符串的话,开启了“一元切分模式”的sphinx比coreseek要快;只有在搜索长中文字串时,coreseek的分词优势才能显现,比sphinx要快。
所以根据你的应用场景来选择用哪个,如果是索引英文、数字、字符较多的数据,就用源生sphinx;如果是索引中文非常多非常长的数据,还是用coreseek吧。Coreseek是基于Sphinx开发的一款软件,对Sphinx做了一些改动,在中文方面支持得比Sphinx好
安装注意 :
Coreseek发布了3.2.14版本和4.1版本等多个版本
Coreseek3.2.14版本是2010年发布的,它是基于Sphinx0.9.9搜索引擎的。
Coreseek4.1版本是2011年发布的,它是基于Sphinx2.0.2以后的开发的。
三、Sphinx和Coreseek的优缺点
这里要特别提一下sphinx的特殊版本(至少是我认为的吧)Sphinx-for-chinese,下面会对其做一些说明:
1、Coreseek 为国人基于Sphinx开发的方案,目前最稳定版,是基于经典的Sphinx0.9.9版
优点:有成熟的文档、以及社区;其分词mmseg为目前国内最为好用分词,索引和搜索分词都可以用到;
缺点:深度开发、版本更新较慢;索引较慢
策略:一个词库管理后台,维护词库;定期生成字典;此套件会自动分词索引;
适用场景:普通青年、搭建差不多的搜索,适用于普遍网站
2、Sphinx-for-chinaese 为国人2基于经典的Sphinx0.9.9版开发的扩展版
优点:部署简单,易操作,内嵌分词和词库,索引和搜索分词都可以用到;
缺点:版本更新较慢;分词较弱;索引相对较慢
策略:同一
适用场景:普通青年、快速搭建搜索的小站。
综上几点:Sphinx主要用于英文搜索;Sphinx-for-chinese虽然可以查询中文,但是查询中文不准;Coreseek中文查询整体效果不错。
四、Coreseek的入门
我们要使用Coreseek 需要做以下几件事:
-
首先要有数据
-
建立Coreseek 配置文件
-
生成索引
-
启动searchd 服务进程,并开启端口9312
-
用php客户程序去链接Coreseek 服务
没有Coreseek4.1 安装资源,请自行在CSDN上下载相应资源.
由于开源产品Coreseek 在windows上无需安装只需要放在某个目录下即可 ,放到任意盘的根目录。
解压过得文件你可以看到如图所示的一些文件夹 (如图):
api => 该目录是Coreseek自带的一些API类文件;
bin => 该目录是Coreseek的一些命令存放目录;
etc => 该目录是Coreseek的一些配置文件;
var => 该目录是存放创建索引完毕之后的索引存放目录以及客户关键词的查询记录。
plugin => MySql的安装包。
A、打开etc目录
这里我主要改造的是csft_mysql.conf这个配置文件,我喜欢改个名,方便识记coreseek.conf,当然你也可以不改。
打开此文件,需要修改一下其中的配置:
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库
## 数据源定义
source weicbd_products
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = 123456
sql_db = dbname
sql_port = 3306
sql_query_pre = SET NAMES utf8
## sql_query第一列id需为整数
## Products_Name、Products_JSON作为字符串/文本字段,被全文索引
sql_query = SELECT p.Products_ID, Products_ID as attr_id, p.Products_Name, p.Products_Name AS attr_name, p.Spec_No, p.Spec_No AS attr_specno, p.Products_CreateTime, p.Products_CreateTime as attr_time, p.Products_PriceY, p.Products_PriceY as attr_pricey, p.Products_PriceX, p.Products_PriceX as attr_pricex, p.Products_JSON, p.Products_JSON as attr_json, Products_Sort, Products_Sort as attr_sort, p.Products_Status, p.Products_Status as attr_status, p.Products_Count, p.Products_Count as attr_count, b.Biz_Name, b.Biz_Province, b.Biz_City, b.Biz_Area FROM weicbd_products p inner join weicbd_biz b on p.Biz_ID = b.Biz_ID
## 从SQL读取到的值必须为整数
sql_attr_uint = attr_id
sql_attr_uint = attr_sort
sql_attr_uint = attr_status
sql_attr_uint = attr_count
## 从SQL读取到的值必须为整数,作为时间属性
sql_attr_timestamp = attr_time
sql_attr_string = attr_name
sql_attr_string = attr_json
sql_attr_string = attr_specno
sql_attr_string = attr_pricey
sql_attr_string = attr_pricex
## 命令行查询时,设置正确的字符集
sql_query_info_pre = SET NAMES utf8
## 命令行查询时,从数据库读取原始数据信息
sql_query_info = SELECT * FROM weicbd_products WHERE Products_ID=$id
}
## index定义
index products
{
source = weicbd_products
## 请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
path = D:/coreseek4132/var/data/products
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
## 中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
## charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
## Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_dictpath = D:/coreseek4132/etc/
charset_type = zh_cn.utf-8
}
## 全局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
## 请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
pid_file = D:/coreseek4132/var/log/searchd_mysql.pid
## 请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
log = D:/coreseek4132/var/log/searchd_mysql.log
## 请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
query_log = D:/coreseek4132/var/log/query_mysql.log
## 关闭binlog日志
binlog_path =
}
注意事项:
把以下路径修改正确,注意,一定要绝对路径
path => E:/coreseek4132/var/data/goods #请修改为实际使用的绝对路径,切记goods后面不加 /
charset_dictpath => E:/coreseek4132/etc/ #这个是要加的
pid_file => E:/coreseek4132/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径
log => E:/coreseek4132/var/log/searchd_mysql.log
query_log => E:/coreseek4132/var/log/query_mysql.log
B,创建索引
dos进入bin目录,输入
indexer.exe --config E:/coreseek4132/etc/coreseek.conf --all
知识点:
普通建立索引方法,–all参数是建立所有索引
E:/coreseek4132/bin/ indexer.exe --config E:/coreseek4132/bin/coreseek .conf --all
--config 等价于 -c
如果Coreseek已经在运行中,要indexer时,需要加上–rotate参数,这样索引完就直接生效了。不需要重新启动Coreseek服务。
E:/coreseek4132/bin/ indexer -c /usr/local/coreseek/etc/csft.conf --all --rotate
建立单个索引的方法,arc索引名称为例
E:/coreseek4132/bin/ indexer -c E:/coreseek4132/bin/coreseek .conf arc
或者
E:/coreseek4132/bin/ indexer -c E:/coreseek4132/bin/coreseek.conf arc --rotate
一般我们为了不影响正常业务运行,所以基本上都是Coreseek运行状态下,就更新索引。
E:/coreseek4132/bin/ indexer -c /usr/local/coreseek/etc/csft.conf --all --rotate
C、将Coreseek加入到win服务中
输入命令searchd.exe --install --config e:/coreseek4132/etc/coreseek.conf --servicename coreseek4132
服务中查看效果:
这时候你也可以手动进行启动。
当然我说的是再doc窗口中启动和关闭
还有下面的方法:
e:\coreseek\bin\searchd -c e:/coreseek4132/etc/coreseek.conf –-stop #停止服务
e:\coreseek\bin\searchd -c e:/coreseek4132/etc/coreseek.conf --console #启动服务
删除服务的命令是: sc delete coreseek4132
D:php文件中使用Coreseek的API文件
<?php
// 包含Coreseek的api文件
require_once 'sphinxapi.php';
// Coreseek服务器地址
$server = '127.0.0.1';
// 端口
$port = 9312;
// 索引名 为*时表示搜索所有索引
$indexName = 'goods';
// 分页页码
$page = isset($_GET ['page'])?$_GET ['page']:1;
$page = intval ( $page ) > 1 ? intval ( $page ) : 1;
// 每页显示的数量
$pageSize = 10;
$keyword = "射雕";
// 建立连接
$sphinx = new SphinxClient ();
$sphinx->SetServer ( $server, $port );
$sphinx->SetSortMode(SPH_SORT_EXTENDED, "attr_total desc");
// 连接超时时间(非常必要,比如sphinx服务器挂了等异常情况) 单位为s,秒
$sphinx->SetConnectTimeout ( 3 );
// 最大查询时间 单位为ms,毫秒
$sphinx->SetMaxQueryTime ( 2000 );
// 按分页取结果
$sphinx->SetLimits ( ($page - 1) * $pageSize, $pageSize ); //第一个参数为offset,第二个参数为limit
// 模式
//$sphinx->SetMatchMode(SPH_MATCH_ANY);
// 取到的原始数据
$orgDatas = $sphinx->Query ($keyword, $indexName );
// 调试用,如果有错误的话,可以打印$errors的值
$errors = $sphinx->GetLastError ();
$DB->v($orgDatas);
$DB->v($errors);
//$DB->v($orgDatas['total'] > 0);
exit;
// 调试用,如果有错误的话,可以打印$errors的值
$errors = $sphinx->GetLastError ();
//var_dump (iconv("gbk","utf-8",$errors));
?>
Coreseek集成到php程序中有两种方式
-
Sphinx php 模块
-
Sphinx api 类(位于coreseek源码包里的csft里的api文件夹里有一个sphinxapi.php,使用的时候包含这个php文件即可)
E:索引的日常维护
我们可以把索引的日常维护写到批处理文件中,让windows的计划任务按照我们的需求进行自动更新。变的更智能些!
@echo off
rem 定时更新索引
@echo 搜索引擎更新索引服务开始执行...
echo BENGING
rem 此定时程序执行
@echo 开始执行时间如下:%date:~0,10% %time:~0,-3%
%~d0
rem 切换到sphinx-for-chinese目录下bin目录,准备使用indexer重建索引
cd D:/coreseek4132/bin
d:
echo 开始更新索引
indexer.exe --config d:/coreseek4132/etc/coreseek.conf --all --rotate
echo 索引更新完毕
echo.
cd %~dp0
echo.
rem 下面是cmd命令输出日期时间的
@echo 结束执行时间如下:
echo %date:~0,10% %time:~0,-3%
echo END
@echo 5秒后窗口将自动关闭,请勿操作,谢谢!!!
@ping 0.0.0.0 -n 5 > nul
exit /b 0
文中可能有写的不对的地方,请留言指正,最后码字不易,请在右上角多多点赞哈,谢谢各位!
-------------------------------------------------------------------------------------------------------------------------------------------------------
再此感谢以下作者的文章,因为本文的创作有你们的功劳!
---------------------
作者:扬子 ,原文:https://blog.csdn.net/dl425134845/article/details/53286742
作者:偶-木 ,原文:https://blog.csdn.net/u013372487/article/details/66478774