如何在CentOS7上安装和配置Sphinx

来自菜鸟教程
跳转至:导航、​搜索

介绍

Sphinx 是一个允许全文搜索的开源搜索引擎。 它以非常有效地对大数据执行搜索而闻名。 要索引的数据通常可以来自非常不同的来源:SQL 数据库、纯文本文件、HTML 文件、邮箱等。

狮身人面像的一些主要特点是:

  • 高索引和搜索性能
  • 高级索引和查询工具
  • 高级结果集后处理
  • 经过验证的可扩展性高达每秒数十亿个文档、TB 级数据和数千个查询
  • 与 SQL 和 XML 数据源以及 SphinxQL、SphinxAPI 或 SphinxSE 搜索界面轻松集成
  • 通过分布式搜索轻松扩展

在本教程中,我们将使用分发包中包含的示例 SQL 文件设置 Sphinx 和 MySQL 服务器。 它将为您提供有关如何在项目中使用 Sphinx 的基本概念。

先决条件

在开始本指南之前,您需要:

  • 一台 CentOS 7 服务器。
  • 一个sudo非root用户,可以按照本教程进行设置。
  • MySQL安装在你的服务器上,你可以按照本教程的步骤2进行设置。

第 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 个主要块组成:indexsearchdsource

已经提供了一个最小配置,但我们将提供一个新的示例配置文件供您使用并解释每个部分,以便您以后可以自定义它。

首先,移动现有的 sphinx.conf 文件。

sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2

使用 vi 或您喜欢的文本编辑器创建一个新的 sphinx.conf 文件。

sudo vi /etc/sphinx/sphinx.conf

indexsearchdsource 块中的每一个如下所述。 然后,在此步骤结束时,包含整个 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 的更多信息,请访问 项目网站