如何在Ubuntu16.04上安装和配置Sphinx
介绍
Sphinx 是一个允许全文搜索的开源搜索引擎。 它以非常有效地对大数据执行搜索而闻名。 要索引的数据通常可以来自非常不同的来源:SQL 数据库、纯文本文件、HTML 文件、邮箱等。
狮身人面像的一些主要特点是:
- 高索引和搜索性能
- 高级索引和查询工具
- 高级结果集后处理
- 经过验证的可扩展性高达每秒数十亿个文档、TB 级数据和数千个查询
- 与 SQL 和 XML 数据源以及 SphinxQL、SphinxAPI 或 SphinxSE 搜索界面轻松集成
- 通过分布式搜索轻松扩展
在本教程中,我们将使用分发包中包含的示例 SQL 文件设置 Sphinx 和 MySQL 服务器。 它将为您提供有关如何在项目中使用 Sphinx 的基本概念。
先决条件
在开始本指南之前,您需要:
第 1 步 — 安装 Sphinx
在 Ubuntu 上安装 Sphinx 很容易,因为它位于本机软件包存储库中。 使用 apt-get
安装它。
sudo apt-get install sphinxsearch
现在你已经成功地在你的服务器上安装了 Sphinx。 在启动 Sphinx 守护进程之前,让我们对其进行配置。
第 2 步 – 创建测试数据库
接下来,我们将使用随包提供的 SQL 文件中的示例数据设置数据库。 这将允许我们稍后测试 Sphinx 搜索是否正常工作。
让我们将示例 SQL 文件导入数据库。 首先,登录 MySQL 服务器 shell。
mysql -u root -p
询问时输入 MySQL root 用户的密码。 您的提示将更改为 mysql>
。
创建一个虚拟数据库。 在这里,我们称它为 test,但您可以随意命名。
CREATE DATABASE test;
导入示例 SQL 文件。
SOURCE /etc/sphinxsearch/example.sql;
然后离开 MySQL shell。
quit
现在您有一个填充了示例数据的数据库。 接下来,我们将自定义 Sphinx 的配置。
第 3 步 – 配置 Sphinx
Sphinx 的配置应该在 /etc/sphinxsearch
中名为 sphinx.conf
的文件中。 该配置由运行必不可少的 3 个主要块组成:index、searchd 和 source。 我们将提供一个示例配置文件供您使用,并解释每个部分,以便您以后自定义它。
首先,创建 sphinx.conf
文件。
sudo nano /etc/sphinxsearch/sphinx.conf
这些 index、searchd 和 source 块中的每一个都在下面描述。 然后,在此步骤结束时,包含整个 sphinx.conf
供您复制并粘贴到文件中。
source 块包含 MySQL 服务器的源类型、用户名和密码。 sql_query
的第一列应该是唯一的 id。 SQL 查询将在每个索引上运行并将数据转储到 Sphinx 索引文件。 下面是每个字段和源块本身的描述。
type
:要索引的数据源类型。 在我们的示例中,这是 mysql。 其他支持的类型包括 pgsql、mssql、xmlpipe2、odbc 等。sql_host
:MySQL 主机的主机名。 在我们的示例中,这是localhost
。 这可以是域或 IP 地址。sql_user
:MySQL 登录的用户名。 在我们的示例中,这是 root。sql_pass
:MySQL 用户的密码。 在我们的示例中,这是根 MySQL 用户的密码。sql_db
:存储数据的数据库名称。 在我们的示例中,这是 test。sql_query
:将数据从数据库转储到索引的查询。
这是源代码块:
sphinx.conf 的源代码块
source src1 { type = mysql #SQL settings (for ‘mysql’ and ‘pgsql’ types) 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 }
index 组件包含存储数据的源和路径。 在
source
:源块的名称。 在我们的示例中,这是 src1。path
:保存索引的路径。
sphinx.conf 的索引块
index test1 { source = src1 path = /var/lib/sphinxsearch/data/test1 docinfo = extern }
searchd 组件包含运行 Sphinx 守护程序的端口和其他变量。
listen
:Sphinx 守护进程将运行的端口,后跟协议。 在我们的示例中,这是 9306:mysql41。 已知的协议是 :sphinx (SphinxAPI) 和 :mysql41 (SphinxQL)query_log
:查询日志的保存路径。pid_file
:Sphinx 守护进程 PID 文件的路径。seamless_rotate
:防止在将具有大量数据的索引旋转到预缓存时搜索停止。preopen_indexes
:启动时是否强制预打开所有索引。unlink_old
:轮换成功时是否删除旧索引副本。
搜索 sphinx.conf 的块
searchd { listen = 9312:sphinx #SphinxAPI port listen = 9306:mysql41 #SphinxQL port 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 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinxsearch/data }
复制和粘贴的完整配置如下。 您需要在下面更改的唯一变量是源块中的 sql_pass
变量,它被突出显示。
完整的 sphinx.conf 文件
source src1 { type = mysql sql_host = localhost sql_user = root sql_pass = your_root_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 } index test1 { source = src1 path = /var/lib/sphinxsearch/data/test1 docinfo = extern } searchd { listen = 9306:mysql41 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 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinxsearch/data }
要探索更多配置,您可以查看 /etc/sphinxsearch/sphinx.conf.sample
文件,其中对所有变量进行了更详细的解释。
第 4 步 — 管理索引
在这一步中,我们将向 Sphinx 索引添加数据,并使用 cron
确保索引保持最新。
首先,使用我们之前创建的配置将数据添加到索引中。
sudo indexer --all
您应该得到如下所示的内容。
OutputSphinx 2.2.9-id64-release (rel22-r5006) Copyright (c) 2001-2015, Andrew Aksyonoff Copyright (c) 2008-2015, Sphinx Technologies Inc (http://sphinxsearch.com) using config file '/etc/sphinxsearch/sphinx.conf'... indexing index 'test1'... collected 4 docs, 0.0 MB sorted 0.0 Mhits, 100.0% done total 4 docs, 193 bytes total 0.010 sec, 18552 bytes/sec, 384.50 docs/sec total 4 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg total 12 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
在生产环境中,有必要使索引保持最新。 为此,让我们创建一个 cronjob。 首先,打开 crontab。
crontab -e
系统可能会询问您要使用哪个文本编辑器。 选择您喜欢的; 在本教程中,我们使用了 nano
。
以下 cronjob 将每小时运行一次,并使用我们之前创建的配置文件将新数据添加到索引中。 将其复制并粘贴到文件末尾,然后保存并关闭文件。
crontab
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
现在 Sphinx 已经完全设置和配置好了,我们可以启动服务并尝试一下。
第 5 步 — 启动 Sphinx
默认情况下,Sphinx 守护程序处于关闭状态。 首先,我们将通过将 /etc/default/sphinxsearch
中的 START=no
行更改为 START=yes
来启用它。
sudo sed -i 's/START=no/START=yes/g' /etc/default/sphinxsearch
然后,使用 systemctl
重新启动 Sphinx 守护进程。
sudo systemctl restart sphinxsearch.service
要检查 Sphinx 守护程序是否正常运行,请运行。
sudo systemctl status sphinxsearch.service
您应该得到如下所示的内容。
Output● sphinxsearch.service - LSB: Fast standalone full-text SQL search engine Loaded: loaded (/etc/init.d/sphinxsearch; bad; vendor preset: enabled) Active: active (running) since Tue 2016-07-26 01:50:00 EDT; 15s ago . . .
这也将确保 Sphinx 守护程序即使在服务器重新启动时也会启动。
第 6 步——测试
现在一切都设置好了,让我们测试一下搜索功能。 使用 MySQL 接口连接到 SphinxQL(在端口 9306 上)。 您的提示将更改为 mysql>
。
mysql -h0 -P9306
让我们搜索一个句子。
SELECT * FROM test1 WHERE MATCH('test document'); SHOW META;
您应该得到如下所示的内容。
Output+------+----------+------------+ | id | group_id | date_added | +------+----------+------------+ | 1 | 1 | 1465979047 | | 2 | 1 | 1465979047 | +------+----------+------------+ 2 rows in set (0.00 sec) +---------------+----------+ | Variable_name | Value | +---------------+----------+ | total | 2 | | total_found | 2 | | time | 0.000 | | keyword[0] | test | | docs[0] | 3 | | hits[0] | 5 | | keyword[1] | document | | docs[1] | 2 | | hits[1] | 2 | +---------------+----------+ 9 rows in set (0.00 sec)
在上面的结果中,您可以看到 Sphinx 从我们的 test1
索引中为我们的测试句子找到了 2 个匹配项。 SHOW META;
命令也显示句子中每个关键字的命中。
让我们搜索一些关键字。
CALL KEYWORDS ('test one three', 'test1', 1);
您应该得到如下所示的内容。
Output+------+-----------+------------+------+------+ | qpos | tokenized | normalized | docs | hits | +------+-----------+------------+------+------+ | 1 | test | test | 3 | 5 | | 2 | one | one | 1 | 2 | | 3 | three | three | 0 | 0 | +------+-----------+------------+------+------+ 3 rows in set (0.00 sec)
在上面的结果中可以看到,在 test1 索引中,Sphinx 发现:
- 3 个文档中有 5 个匹配关键字“test”
- 1 个文档中有 2 个匹配关键字“one”
- 0 个文档中的 0 个匹配关键字“三”
现在您可以离开 MySQL shell。
quit
结论
在本教程中,我们向您展示了如何安装 Sphinx 并使用 SphinxQL 和 MySQL 进行简单搜索。
您还可以找到 PHP、Perl、Python、Ruby 和 Java 的官方 native SphinxAPI 实现。 如果你使用 Nodejs,你也可以使用 SphinxAPI 包 。
通过使用 Sphinx,您可以轻松地将自定义搜索添加到您的站点。 有关使用 Sphinx 的更多信息,请访问 项目网站 。