1

准备为之前说的电商系统做一个功能完善搜索功能,我的需求是关键字相关搜索,搜索结果多样化排序,根据用户搜索记录为用户提供最优搜索结果。在网上看了好多,看来看去感觉Coreseek还不错。Coreseek是一个基于Sphinx二次开发的搜索工具,属于国内出品,有完善的中文文档。废话不多说,这篇是Coreseek安装篇,废了我不少劲。

Coreseek官方介绍

Sphinx是一个独立的全文搜索引擎;而Coreseek是一个支持中文的全文搜索引擎,意图为其他应用提供高速、低空间占用、高相关度结果的中文全文搜索能力。CoreSeek/Sphinx可以非常容易的与SQL数据库和脚本语言集成。

应用程序可以通过三种不同的接口方式来与Sphinx搜索服务(searchd)通信: a) 通过原生的搜索 API (SphinxAPI), b) 通过Sphinx自身支持的MySQL网络协议 (使用命名为SphinxQL的SQL精简子集), 或者 c) 通过MySQL 服务端的存储插件引擎(SphinxSE)。当然, 还可以通过可以使用 a)、b)、c) 的应用程序来构建webservice来为其他应用程序提供通信

在Sphinx发行版本中提供的原生搜索API支持PHP、Python、Perl、Rudy和Java。搜索API非常轻量化,可以在几个小时之内移植到新的语言上。第三方API接口和插件提供了对Perl、C#、Haskell、Ruby-on-Rails支持,以及对其他可能的语言或者框架的支持。

从版本1.10-beta开始,Sphinx支持两种不同的索引后端:“磁盘(disk)”索引后端和“实时索引(realtime)”(RT)索引后端。磁盘索引支持在线全文索引重建,但是仅支持非文本(属性)数据的在线更新。RT实时索引在此基础上,又增加了在线的全文索引更新。在此之前的版本仅支持磁盘索引。

使用命名为数据源的接口,数据可以被加载到磁盘索引。当前系统内置MySQL和PostgreSQL以及ODBC兼容(MS SQL、Oracle等) 数据库数据源的支持,也支持从管道标准输入读取特定格式的XML数据。通过适当修改源代码,用户可以自行增加新的数据源驱动(例如:对其他类型的DBMS的原生支持)。在Coreseek发行的版本中,用户还可以使用Python脚本作为数据源来获取任何已知世界和未知世界的数据,这极大的扩展了数据源的来源。从1.10-beta版本开始的RT实时索引,只能使用MySQL接口通过SphinxQL来操作。

<!--more-->

运行环境及系统清单

  1. 系统环境:Ubuntu15.10

  2. Coreseek-4.1-beta:下载地址

  3. 软件依赖:gcc g++ automake libtool mysql-client libmysqlclient-dev libxml2-dev libexpat1-dev mysql-server-5.6

  4. libiconv:下载地址

安装过程

  • 首先把存在Ubuntu软件源的依赖装上:

sudo apt-get install gcc g++ automake libtool mysql-client libmysqlclient-dev libxml2-dev libexpat1-dev mysql-server-5.6
  • 解压Coreseek

tar -xvf coreseek-4.1-beta.tar.gz
  • 安装mmseg

cd mmseg-3.2.14
// 编辑
./bootstrap
./configure --prefix=/usr/local/mmseg3
sudo make && sudo make install

测试分词软件(mmseg)是否安装成功

cd /usr/local/mmseg3/bin
./mmseg -d /usr/local/mmseg3/etc/ /usr/local/src/coreseek-4.1-beta/mmseg-3.2.14/src/t1.txt
  • 安装libiconv

tar xvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure
make && sudo make install && ldconfig

如果你的glibc版本在2.16以上,make时很有可能出现如下错误

In file included from progname.c:26:0:
./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function)
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
^

参考这里的方法,下载patch文件,解压后打上patch即可。

wget -O - http://blog.atime.me/static/resource/libiconv-glibc-2.16.patch.gz | gzip -d - | patch -p0
  • 安装csft

    更改configure.ac文件,将
    
AM_INIT_AUTOMAKE([-Wall -Werror foreign])

改为

AM_INIT_AUTOMAKE([-Wall foreign])

编译:

cd csft-4.1
automake --add-missing
sh buildconf.sh
./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql --with-python LIBS=-liconv

如果你的gcc版本在4.7以上,编译的时候可能会因为sphinx的一个bug报错,解决方法参考bug报告里的一个patch,在csft-4.1目录下执行:

wget -O - http://blog.atime.me/static/resource/sphinxexpr-gcc4.7.patch.gz | gzip -d - | patch -p0

然后执行:

make -j4  #-j4表示使用4核编译
sudo make install

搞定!

安装辅助工具

将csft-4.1/contrib/scripts目录下的searchd脚本拷贝到/etc/init.d/目录下,即可使用service命令启动和终止searchd服务。

安装好coreseek后,将/usr/local/coreseek/share/man/目录下的所有文件和目录都拷贝到/usr/local/share/man/目录里,即可使用man命令查看indexer和searchd的使用手册。

修复libiconv.so.2问题

安装完成,然后去/usr/local/coreseek/bin执行searchd提示:

./searchd: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory

原因是动态链接库未找到__解决方法:__

在/etc/ld.so.conf中加一行/usr/local/lib,运行ldconfig。ld.so.conf和ldconfig是维护系统动态链接库的。

参考资料


路易港
651 声望16 粉丝

温故而知新。