如何在CentOS7上安装和配置Sphinx
介绍
Sphinx 是一个允许全文搜索的开源搜索引擎。 它以非常有效地对大数据执行搜索而闻名。 要索引的数据通常可以来自非常不同的来源:SQL 数据库、纯文本文件、HTML 文件、邮箱等。
狮身人面像的一些主要特点是:
- 高索引和搜索性能
- 高级索引和查询工具
- 高级结果集后处理
- 经过验证的可扩展性高达每秒数十亿个文档、TB 级数据和数千个查询
- 与 SQL 和 XML 数据源以及 SphinxQL、SphinxAPI 或 SphinxSE 搜索界面轻松集成
- 通过分布式搜索轻松扩展
在本教程中,我们将使用分发包中包含的示例 SQL 文件设置 Sphinx 和 MySQL 服务器。 它将为您提供有关如何在项目中使用 Sphinx 的基本概念。
先决条件
在开始本指南之前,您需要:
第 1 步 — 安装 Sphinx
在撰写本文时,最新的 Sphinx 版本是 2.2.11。 您可以在 Sphinx 网站 上找到最新版本 。
在安装 Sphinx 之前,首先需要安装它的依赖项。
sudo yum install -y postgresql-libs unixODBC
移动到 tmp
目录,在不显眼的地方下载 Sphinx 的文件。
cd /tmp
使用 wget
下载最新的 Sphinx 版本。
wget http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm
最后,使用 yum
安装它。
sudo yum install -y sphinx-2.2.11-1.rhel7.x86_64.rpm
现在你已经成功地在你的服务器上安装了 Sphinx。 在启动 Sphinx 守护进程之前,让我们对其进行配置。
第 2 步 – 创建测试数据库
在这里,我们将使用随包提供的 SQL 文件中的示例数据设置数据库。 这将允许我们稍后测试 Sphinx 搜索是否正常工作。
让我们将示例 SQL 文件导入数据库。 首先,登录 MySQL 服务器 shell。
mysql -u root -p
询问时输入 MySQL root 用户的密码。 您的提示将更改为 MariaDB>
。
创建一个虚拟数据库。 在这里,我们称它为 test,但您可以随意命名。
CREATE DATABASE test;
导入示例 SQL 文件。
SOURCE /usr/share/doc/sphinx-2.2.11/example.sql;
然后离开 MySQL shell。
quit
现在您有一个填充了示例数据的数据库。 接下来,我们将自定义 Sphinx 的配置。
第 3 步 – 配置 Sphinx
Sphinx 的配置应该在 /etc/sphinx
中名为 sphinx.conf
的文件中。 该配置由 3 个主要块组成:index、searchd 和 source。
已经提供了一个最小配置,但我们将提供一个新的示例配置文件供您使用并解释每个部分,以便您以后可以自定义它。
首先,移动现有的 sphinx.conf
文件。
sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2
使用 vi
或您喜欢的文本编辑器创建一个新的 sphinx.conf
文件。
sudo vi /etc/sphinx/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/sphinx/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/sphinx/searchd.log query_log = /var/log/sphinx/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinx/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinx/ }
复制和粘贴的完整配置如下。 您需要在下面更改的唯一变量是源块中的 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/sphinx/test1 docinfo = extern } searchd { listen = 9306:mysql41 log = /var/log/sphinx/searchd.log query_log = /var/log/sphinx/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinx/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinx/ }
要探索更多配置,您可以查看 /usr/share/doc/sphinx-2.2.11/sphinx.conf.dist
文件,其中详细解释了所有变量。
第 4 步 — 管理索引
在这一步中,我们将向 Sphinx 索引添加数据,并使用 cron
确保索引保持最新。
首先,使用我们之前创建的配置将数据添加到索引中。
sudo indexer --all
您应该得到如下所示的内容。
OutputSphinx 2.2.11-id64-release (95ae9a6) Copyright (c) 2001-2016, Andrew Aksyonoff Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com) using config file '/etc/sphinx/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.006 sec, 29765 bytes/sec, 616.90 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
在生产环境中,有必要使索引保持最新。 为此,让我们创建一个 Cron 作业。 首先,打开crontab
。
crontab -e
以下 Cron 作业将每小时运行一次,并使用我们之前创建的配置文件将新数据添加到索引中。 将其复制并粘贴到文件末尾,然后保存并关闭文件。
crontab
@hourly /usr/bin/indexer --rotate --config /etc/sphinx/sphinx.conf --all
现在 Sphinx 已经完全设置和配置好了,我们可以启动服务并尝试一下。
第 5 步 — 启动 Sphinx
使用 systemctl
启动 Sphinx 守护进程。
sudo systemctl start searchd
要检查 Sphinx 守护进程是否正常运行,请运行:
sudo systemctl status searchd
您应该得到如下所示的内容。
Output● searchd.service - SphinxSearch Search Engine Loaded: loaded (/usr/lib/systemd/system/searchd.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2016-08-19 17:48:39 UTC; 5s ago . . .
Sphinx 是完全定制和运行的,所以我们接下来会检查它是否正常工作。
第 6 步 — 测试搜索功能
现在一切都设置好了,让我们测试一下搜索功能。 使用 MySQL 接口连接到 SphinxQL。 您的提示将更改为 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 个匹配关键字“三”
现在您已经测试了 Sphinx,如果您愿意,可以使用 DROP DATABASE test;
删除测试数据库。
完成后,离开 MySQL shell。
quit
结论
在本教程中,我们向您展示了如何安装 Sphinx 并使用 SphinxQL 和 MySQL 进行简单搜索。
您还可以找到 PHP、Perl、Python、Ruby 和 Java 的官方 native SphinxAPI 实现。 如果你使用 Nodejs,你也可以使用 SphinxAPI 包 。
通过使用 Sphinx,您可以轻松地将自定义搜索添加到您的站点。 有关使用 Sphinx 的更多信息,请访问 项目网站 。