如何在Ubuntu14.04上安装和配置Sphinx
介绍
Sphinx 是一个允许全文搜索的开源搜索引擎。 它以非常有效地对大数据执行搜索而闻名。 要索引的数据通常可以来自非常不同的来源:SQL 数据库、纯文本文件、HTML 文件、邮箱等。
狮身人面像的一些主要特点是:
- 高索引和搜索性能
- 高级索引和查询工具
- 高级结果集后处理
- 经过验证的可扩展性高达每秒数十亿个文档、TB 级数据和数千个查询
- 与 SQL 和 XML 数据源以及 SphinxQL、SphinxAPI 或 SphinxSE 搜索界面轻松集成
- 通过分布式搜索轻松扩展
在本教程中,我们将使用分发包中包含的示例 SQL 文件设置 Sphinx 和 MySQL 服务器。 它将为您提供有关如何在项目中使用 Sphinx 的基本概念。
先决条件
在开始本指南之前,您需要:
- 一个 Ubuntu 14.04 Droplet。
- 一个sudo非root用户,可以按照本教程进行设置。
第 1 步 - 安装 MySQL 服务器
注意: 如果您尚未安装 MySQL 服务器,则只需完成此部分。
在本节中,我们将安装 MySQL 服务器。 MySQL 将让我们存储一个样本数据数据库,我们可以用它来测试 Sphinx 的搜索能力。
更新软件包列表。
sudo apt-get update
然后安装 MySQL 服务器。
sudo apt-get install mysql-server
询问时输入 root 用户的密码,然后再次输入相同的密码进行确认。
第 2 步 - 安装 Sphinx
在本节中,我们将安装 Sphinx。
要安装 Sphinx,请运行:
sudo apt-get install sphinxsearch
现在你已经成功地在你的服务器上安装了 Sphinx。 在启动 Sphinx 守护进程之前,让我们对其进行配置。
第 3 步 - 创建测试数据库
在本节中,我们将使用包中提供的示例 SQL 文件设置数据库。
让我们将示例 SQL 文件导入数据库。
登录到 MySQL 服务器外壳。
mysql -u root -p
询问时输入 MySQL root 用户的密码。 您的提示将更改为 mysql>
。
创建一个名为 test
的数据库。
CREATE DATABASE test;
导入 SQL 文件。
SOURCE /etc/sphinxsearch/example.sql;
然后退出 MySQL shell。
quit
现在,您应该让测试数据库充满了数据。
第 4 步 – 配置 Sphinx
在本节中,我们将配置 Sphinx 配置文件。
创建 sphinx.conf
文件。
sudo nano /etc/sphinxsearch/sphinx.conf
Sphinx 配置由运行所必需的 3 个主要块组成。 它们是 index、searchd 和 source。 下面描述了这些块中的每一个,在此步骤结束时,将包含整个 sphinx.conf
供您粘贴到文件中。
source 块包含 MySQL 服务器的源类型、用户名和密码。 SQL 查询的第一列应该是唯一的 id。 SQL 查询将在每个索引上运行并将数据转储到 Sphinx 索引文件。 下面是每个字段和源块本身的描述。
sql_host
:MySQL 主机的主机名。 在我们的示例中,这是 localhost。 这可以是域或 IP 地址。sql_user
:MySQL 登录的用户名。 在我们的示例中,这是 root。sql_pass
:MySQL 用户的密码。 在我们的示例中,这是 root MySQL 用户的密码sql_db
:存储数据的数据库名称。 在我们的示例中,这是 test。sql_query
:这是将数据转储到索引的查询。
source src1 { type = mysql sql_host = localhost sql_user = root sql_pass = password sql_db = test sql_port = 3306 # optional, default is 3306 sql_query = \ SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents sql_attr_uint = group_id sql_attr_timestamp = date_added sql_query_info = SELECT * FROM documents WHERE id=$id }
index 组件包含存储数据的源和路径。
source
:源块的名称。 在我们的示例中,这是 src1。path
:此路径保存索引。charset_type
:这是索引的字符集。 您还可以将其设置为 utf-8。
index test1 { source = src1 path = /var/lib/sphinxsearch/data/test1 docinfo = extern charset_type = sbcs }
searchd 组件包含运行 Sphinx 守护程序的端口和其他变量。
listen
:这是 sphinx 守护进程将运行的端口。 在我们的示例中,这是 9312。query_log
:此路径保存查询日志。pid_file
:这是 Sphinx 守护进程的 PID 文件的路径。max_matches
:每个搜索词返回的最大匹配数。seamless_rotate
:防止在将具有大量数据的索引旋转到预缓存时搜索停止。preopen_indexes
:启动时是否强制预打开所有索引。unlink_old
:是否在成功轮换时取消链接旧索引副本。
searchd { listen = 9312 # Port to listen on log = /var/log/sphinxsearch/searchd.log query_log = /var/log/sphinxsearch/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinxsearch/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinxsearch/data }
复制和粘贴的完整配置如下。 您需要在下面更改的唯一变量是源块中的 sql_pass
,它被突出显示。
source src1 { type = mysql sql_host = localhost sql_user = root sql_pass = password # change this to your root users MySQL password sql_db = test sql_port = 3306 sql_query = \ SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents sql_attr_uint = group_id sql_attr_timestamp = date_added sql_query_info = SELECT * FROM documents WHERE id=$id } index test1 { source = src1 path = /var/lib/sphinxsearch/data/test1 docinfo = extern charset_type = sbcs } searchd { listen = 9312 log = /var/log/sphinxsearch/searchd.log query_log = /var/log/sphinxsearch/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinxsearch/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinxsearch/data }
第 5 步 - 将数据添加到索引
在本节中,我们将向 Sphinx 索引添加数据。
使用我们之前创建的配置将数据添加到索引。
sudo indexer --all
您应该得到如下所示的内容。
Sphinx 2.0.4-id64-release (r3135) Copyright (c) 2001-2012, Andrew Aksyonoff Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com) using config file '/etc/sphinxsearch/sphinx.conf'... indexing index 'test1'... WARNING: collect_hits: mem_limit=0 kb too low, increasing to 25600 kb collected 4 docs, 0.0 MB sorted 0.0 Mhits, 100.0% done total 4 docs, 193 bytes total 0.005 sec, 33788 bytes/sec, 700.28 docs/sec total 3 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg total 9 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
为了使索引保持最新,让我们创建一个 cronjob。
打开 crontab。
crontab -e
系统可能会询问您要使用哪个文本编辑器。 选择您喜欢的; 在本教程中,我们使用了 nano
。
将以下内容复制并粘贴到文件末尾,然后保存并关闭它。
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
上面的 cronjob 将每小时运行一次,并使用默认配置文件将新数据添加到索引中。
第 6 步 - 启动 Sphinx
在本节中,我们将启动 Sphinx 守护进程。
默认情况下,Sphinx 守护程序处于关闭状态。 要启用 Sphinx,首先打开 /etc/default/sphinxsearch
。
sudo nano /etc/default/sphinxsearch
找到行 START=no
并将其设置为 yes。
START=yes
然后,保存并关闭文件。
最后,启动 Sphinx 守护进程。
sudo service sphinxsearch start
第 7 步 - 测试搜索
在本节中,我们将测试我们的搜索。 输入以下命令。
search this is my test document number
您应该得到如下所示的内容。
Sphinx 2.0.4-id64-release (r3135) Copyright (c) 2001-2012, Andrew Aksyonoff Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com) using config file '/etc/sphinxsearch/sphinx.conf'... index 'test1': query 'this is my test document number ': returned 2 matches of 2 total in 0.002 sec displaying matches: 1. document=1, weight=7431, group_id=1, date_added=Tue Dec 16 09:49:04 2014 id=1 group_id=1 group_id2=5 date_added=2014-12-16 09:49:04 title=test one content=this is my test document number one. also checking search within phrases. 2. document=2, weight=7431, group_id=1, date_added=Tue Dec 16 09:49:04 2014 id=2 group_id=1 group_id2=6 date_added=2014-12-16 09:49:04 title=test two content=this is my test document number two words: 1. 'this': 4 documents, 4 hits 2. 'is': 4 documents, 4 hits 3. 'my': 2 documents, 2 hits 4. 'test': 3 documents, 5 hits 5. 'document': 2 documents, 2 hits 6. 'number': 3 documents, 3 hits
在上面,您可以从我们的测试索引中为我们的搜索词找到 2 个匹配项。 您还可以找到每个单词的匹配项。
结论
在本教程中,我们向您展示了使用命令行的非常简单的搜索。 您还可以在此处 找到 PHP、Perl、Python、Ruby 和 Java 的官方原生 SphinxAPI 实现。
如果您使用 PHP,here 是一些方便的示例来测试 Sphinx。
通过使用 Sphinx,您可以轻松地将自定义搜索添加到您的站点。 有关使用 Sphinx 的更多信息,请访问 项目网站 。