如何在Ubuntu16.04上安装和配置Sphinx

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

介绍

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

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

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

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

先决条件

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

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

第 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 个主要块组成:indexsearchdsource。 我们将提供一个示例配置文件供您使用,并解释每个部分,以便您以后自定义它。

首先,创建 sphinx.conf 文件。

sudo nano /etc/sphinxsearch/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/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 的更多信息,请访问 项目网站