OpenShift 中如何使用 Sphinx 执行全文搜索 已翻译 100%

oschina 投递于 2013/02/01 08:06 (共 7 段, 翻译完成于 02-01)
阅读 2399
收藏 17
1
加载中

Sphinx 是一个开源的快速可扩展的全文检索引擎。Sphinx作为一个独立的程序包提供给应用程序一个快速和相关的全文检索功能,它可以很好的和RDBMS整合,像mysql,postgresql等。在这篇文章里,我们首先介绍下在OpenShift下的Sphinx安装以及正和一个java应用程序。在这篇文章里我以java为例,你也可以使用OpenShift提供的其他语言,像PHP,Ruby,Python等。

注意: 这篇文章的灵感来自于我读到的一篇博客http://habrahabr.ru/post/157857/,这篇博客是俄语写的。

第一步:注册一个OpenShift账号

如果你还没有OpenShift的账号,到网站website使用sphinx作为优惠码注册一个,这个是完全免费的,Red Hat给每一个用户三个免费的装置来运行你的应用程序。在写这篇文章时,每个用户合并后分配的内存是1.5G,磁盘空间是3G。

缪斯的情人
缪斯的情人
翻译于 2013/02/01 09:24
2

第二步:安装客户端工具

OpenShift的客户端工具是使用当前非常流行的ruby写的,在OSX10.6或者大多数基于linux的系统中,ruby是默认安装的,所以安装客户端工具是件很简单的事。只需在你的终端运行下面的命令:

sudo gem install rhc

第三步:配置OpenShift

rhc的客户端工具让你使用SSH,git和应用程序命名空间配置你的openshift实例时更加简单了,每个用户的命名空间是唯一的,同时它是应用程序url的一部分。比如,如果你的命名空间是t20,你的应用程序名为sphinx,那么应用程序的url就是https://sphinx-t20.rhcloud.com/,命令则如下所示:

rhc setup -l openshift_login

第四步:创建Sphinx应用

安装完客户端工具和配置了openshift账号后,接下来我们创建一个sphinx应用程序,在这篇文章里,我们创建了一个tomcat应用程序,当然你也可以参照这篇文章在php或者ruby应用程序里使用sphinx。执行rhc app create命令创建sphinx应用程序,如下:

rhc app create -a sphinx -t jbossews-1.0

这将为我们创建一个应用程序容器(我们称为装置),同时配置了所有依赖的SELinux策略和cgroup配置。OpenShift也会创建一个私人的git仓库,并且把仓库拷贝到你的本地系统,最后Openshift把DNS设为外网可访问的。

缪斯的情人
缪斯的情人
翻译于 2013/02/01 09:42
1


第五步:添加MYSQL组件

Sphinx 为相关的数据库提供全文检索功能。如果你正在使用mysql数据库,你可以使用FULLTEXT作为索引搜索,但是当数据量大的时候效率会很低。在这篇文章中,我是用的mysql,你也可以使用postgresql。增加一个mysql组件,执行下面的命令:

rhc cartridge add -a sphinx -c mysql-5.1

第六步:在OpenShift上安装Sphinx

现在我们创建了一个应用程序并且添加了组件支持,我们可以在openshift空间上安装sphinx全文检索服务了,下面的步骤交给我们如何一步步安装。

  1. 第一步是通过SSH访问你的openshift空间,如果你不知道如何去做请访问 FAQ.

  2. 一旦你通过SSH进入你的应用实例,请切换目录到$OPENSHIFT_DATA_DIR,这个目录是个1G的可读写目录,你可以放些自己东西。

cd $OPENSHIFT_DATA_DIR
  1. 下一步创建2个目录--source 和installation,source目录包含sphinx源代码,installation目录是sphinx的安装目录。
mkdir source
mkdir installation
  1. 接下来目录定位到source下载sphinx源码,提取出tar.gz文件重命名为sphinx.
cd source
wget http://sphinxsearch.com/files/sphinx-2.0.6-release.tar.gz tar xzvf sphinx-2.0.6-release.tar.gz
mv sphinx-2.0.6-release sphinx
  1. 编译和安装sphinx代码。通过执行下面的命令完成,这一步可能费点时间,请耐心等待。
cd sphinx
./configure --prefix=$OPENSHIFT_DATA_DIR/installation/
make install

    1.第五步成功完成后,我们可以看到在第三步创建的installation下多了4个文件夹。这四个文件夹是bin,etc,share,var,让我们来一个个的看看。

    1. bin目录包含五个文件 -- indexer, indextool, search, searchd, spelldump. 你可以在sphinx文档里查看他们 Sphinx documentation.

    2. etc目录包含简单的配置文件和数据库文件.

    3. share文件夹包含帮助手册.

    4. var文件夹保存索引和日志信息.

缪斯的情人
缪斯的情人
翻译于 2013/02/01 12:49
1

第七步:修改sphinx的配置


在使用sphinx之前我们先配置一下sphinx.conf配置文件,所有的sphinx程序默认的在当前目录查找该文件。我们使用第六步创建的简单的sphinx.conf.dist文件.

cd $OPENSHIFT_DATA_DIR/installation/etc
cp sphinx.conf.dist sphinx.conf

接下来,我们运行个mysql实例而不是一个本地的程序,请先替换下你openshift的环境变量的值。

some straightforward parameters for SQL source types
    sql_host        = 127.13.159.129    #$OPENSHIFT_MYSQL_DB_HOST
    sql_user        = admin  #$OPENSHIFT_MYSQL_DB_USERNAME
    sql_pass        = 7sXcYM_E3vsp #$OPENSHIFT_MYSQL_DB_PASSWORD
    sql_db          =  test
    sql_port        =  3306 #$OPENSHIFT_MYSQL_DB_PORT

第二个改变,我们必须在sphinx.conf中对searchd做如下修改,使用$OPENSHIFT_INTERNAL_IP做绑定,端口在15000-35530之间。

searchd
{
    # [hostname:]port[:protocol], or /unix/socket/path to listen on
    # known protocols are 'sphinx' (SphinxAPI) and 'mysql41' (SphinxQL)
    #
    # multi-value, multiple listen points are allowed
    # optional, defaults are 9312:sphinx and 9306:mysql41, as below
    #
    # listen            = 127.0.0.1
    # listen            = 192.168.0.1:9312
    # listen            = 9312
    # listen            = /var/run/searchd.sock
    listen          = 127.13.159.129:15000
    listen          = 127.13.159.129:15001:mysql41

你可以在这查看全部文件 https://gist.github.com/4085595.

缪斯的情人
缪斯的情人
翻译于 2013/02/01 14:54
1

第八步:测试使用sphinx-使用sphinx命令行界面做索引和搜索

在此之前,我们先把数据上传到运行在openshift上的mysql,这样我们才能索引和搜素。在etc文件夹下有个example.sql文件,执行它创建2个表,同时上传一些数据到测试数据库中,mysql自身并没有测试数据库,我们需要使用下面命令自己创建一个.

mysql
 
mysql> create database test;

现在可以使用下面命令导入数据了.

mysql < example.sql

使用下面的命令对数据进行索引。这将在$OPENSHIFT_DATA_DIR/installation/var/data目录下生成索引文件。

cd $OPENSHIFT_DATA_DIR/installation/bin
./indexer --all

最后,我们可以使用命令行工具做搜素了。

cd $OPENSHIFT_DATA_DIR/installation/bin
./search test

运行后将得到如下结果.

Sphinx 2.0.6-release (r3473)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
 
using config file '/var/lib/openshift/275699b529ee47e5a6be9046debca2c2/app-root/data//installation/etc/sphinx.conf'...
index 'test1': query 'test ': returned 3 matches of 3 total in 0.000 sec
 
displaying matches:
1. document=1, weight=2421, group_id=1, date_added=Fri Nov 16 03:58:48 2012
    id=1
    group_id=1
    group_id2=5
    date_added=2012-11-16 03:58:48
    title=test one
    content=this is my test document number one. also checking search within phrases.
2. document=2, weight=2421, group_id=1, date_added=Fri Nov 16 03:58:48 2012
    id=2
    group_id=1
    group_id2=6
    date_added=2012-11-16 03:58:48
    title=test two
    content=this is my test document number two
3. document=4, weight=1442, group_id=2, date_added=Fri Nov 16 03:58:48 2012
    id=4
    group_id=2
    group_id2=8
    date_added=2012-11-16 03:58:48
    title=doc number four
    content=this is to test groups

第九步:以守护进程方式启动sphinx搜索

Searchd是sphinx一个守护进程,它能使软件像web应用程序一样使用全文检索。我们使用下面的命令启动searchd.

cd $OPENSHIFT_DATA_DIR/installation/bin
./searchd

缪斯的情人
缪斯的情人
翻译于 2013/02/01 15:06
1

第十步:java整合sphinx

现在搜索的进程已经启动,我们可以把sphinx服务整合到java应用程序中,使用全文检索了。我创建了一个简单的blog应用,他只有一个post实体,这是一个简单的spring jpa应用程序,他可以把数据持久化到数据库。

通过远程方式在github上获取到应用程序源码,把代码通过下面命令存放到sphinx目录。

git remote add sphinx git://github.com/shekhargulati/sphinx-openshift-quickstart.git
git pull -s recursive -X theirs sphinx master

接下来把代码推到openshift上,应用程序代码会被编译并且生成新的war包部署到openshift服务器,下一步,访问http://sphinx-t20.rhcloud.com/,把t20替换成你注册openshift的账号,使用界面创建几篇文章。

在使用索引前,我们要修改sphinx.conf文件把数据库从测试数据库改变为sphinx数据库。

你可能需要修改sphinx.conf文件中的sql_db, sql_query, and sql_query_info,参照 https://gist.github.com/4087001.

最后,重新索引数据并且重新启动searchd的进程,如下:

cd $OPENSHIFT_DATA_DIR/installation/bin
./searchd --stop
./indexer --all
./searchd

现在访问地址http://sphinx-t20.rhcloud.com/posts/search/openshift进行搜索. 替换openshift搜索条目为你自己的条目。

搜索功能的源码来自于Sphinx Java api组件提供的代码。这个jar包在maven仓库中没有,因此在构建之前我安装了这个jar,你可以在openshift/action_hooks目录下找到。

搜索的REST支持点如下所示。它使用的是sphinx官方的api,你可以在<sphinx_sourcecode_location>/api/java找到。在下面的代码中,我们首先创建了SphinxClient实例,接着做了相应的一些配置,最后进行搜索查询。需要特别注意的一点是我们使用了OPENSHIFT_INTERNAL_IP环境变量,端口为15000来连接sphinx服务端,这要和在sphinx.conf文件中配置一致.

@RequestMapping(value = "/search/{searchTerm}", method = RequestMethod.GET, produces = "text/html")
    public String search(@PathVariable("searchTerm") String searchTerm,
            Model uiModel) throws Exception {
        SphinxClient searchClient = new SphinxClient();
        String host = System.getenv("OPENSHIFT_INTERNAL_IP");
        int port = 15000;
        int mode = SphinxClient.SPH_MATCH_ALL;
        String index = "*";
        int offset = 0;
        int limit = 20;
        int sortMode = SphinxClient.SPH_SORT_RELEVANCE;
        String sortClause = "";
 
        searchClient.SetServer(host, port);
        searchClient.SetWeights(new int[] { 100, 1 });
        searchClient.SetMatchMode(mode);
        searchClient.SetLimits(offset, limit);
        searchClient.SetSortMode(sortMode, sortClause);
 
        SphinxResult result = searchClient.Query(searchTerm, index);
        System.out.println("Result is " + result);
        String message = "Query '" + searchTerm + "' retrieved " + result.total
                + " of " + result.totalFound + " matches in " + result.time
                + " sec.";
        System.out.println(message);
        uiModel.addAttribute("message", message);
        uiModel.addAttribute("result", result);
        return "posts/result";
 
    }

缪斯的情人
缪斯的情人
翻译于 2013/02/01 15:31
1

第十一步:在应用程序中使用

那么,下次你需要搜索功能时,你可以考虑在你的应用程序里加入sphinx了。

让我们一起享受全文检索带来的乐趣吧!!!!

缪斯的情人
缪斯的情人
翻译于 2013/02/01 15:33
2
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(3)

ifsc01
ifsc01

引用来自“缪斯的情人”的评论

引用来自“lidashuang”的评论

不知道中文怎么样

你是指spinx吗,有个coreseek,专门针对中文做的封装

coreseek openshirt 上应该没有吧
缪斯的情人
缪斯的情人

引用来自“lidashuang”的评论

不知道中文怎么样

你是指spinx吗,有个coreseek,专门针对中文做的封装
ifsc01
ifsc01
不知道中文怎么样
返回顶部
顶部