如何在 CentOS 7 上安装和配置 Sphinx

介绍

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

一些Sphinx的主要特点是:

  • 高索引和搜索性能
  • 先进的索引和查询工具
  • 先进的结果集后处理
  • 已证明可扩展到数十亿的文档,多兆字节的数据和每秒数千个查询
  • 易于与 SQL 和 XML 数据源以及 SphinxQL、SphinxAPI 或 SphinxSE 搜索接口
  • 易于扩展与分布式搜索

在本教程中,我们将使用分布包中包含的样本 SQL 文件来设置 Sphinx 与 MySQL 服务器,它将为您提供如何为您的项目使用 Sphinx 的基本想法。

前提条件

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

  • 一个 CentOS 7 服务器
  • 一个 sudo 非根用户,您可以通过遵循 本教程来设置。

步骤1:安装Sphinx

在写作时,最新的Sphinx版本是 2.2.11. 你可以找到最新的版本 在Sphinx网站

在安装Sphinx之前,您首先需要安装它的依赖性。

1sudo yum install -y postgresql-libs unixODBC

移动到tmp目录以在不显眼的地方下载Sphinx的文件。

1cd /tmp

下载最新的Sphinx版本使用wget

1wget http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm

最后,使用yum来安装。

1sudo yum install -y sphinx-2.2.11-1.rhel7.x86_64.rpm

现在你已经成功地安装了Sphinx在你的服务器上. 在启动Sphinx戴蒙之前,让我们配置它。

步骤2:创建测试数据库

在这里,我们将使用随包提供的SQL文件中的样本数据来设置数据库,这将使我们能够测试Sphinx搜索是否在以后工作。

让我们将样本 SQL 文件导入数据库. 首先,登录 MySQL 服务器壳。

1mysql -u root -p

当被问及时,请输入MySQL root用户的密码,您的提示将更改为MariaDB>

在这里,我们称之为 test,但你可以随心所欲命名它。

1CREATE DATABASE test;

例如,导入 SQL 文件。

1SOURCE /usr/share/doc/sphinx-2.2.11/example.sql;

然后离开MySQL壳。

1quit

现在你有一个数据库填满了样本数据,接下来,我们将定制Sphinx的配置。

步骤 3 – 配置 Sphinx

Sphinx 的配置应该在一个名为 sphinx.conf 的文件中,在 /etc/sphinx. 配置由 3 个主要块组成: index, searchdsource

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

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

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

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

1sudo vi /etc/sphinx/sphinx.conf

每个 indexsearchdsource 块都描述在下面,然后,在这个步骤的结束时,包含了整个 sphinx.conf,您可以复制和粘贴到文件中。

源块包含 MySQL 服务器的源类型、用户名和密码。 sql_query 的第一列应该是一个独特的 id. SQL 查询将在每个索引上运行,并将数据投放到 Sphinx 索引文件中。

在我们的例子中,这是 mysql。 其他支持类型包括 pgsql、mssql、xmlpipe2, odbc 和更多

  • sql_host: MySQL 主机的主机名。 在我们的例子中,这是 localhost。 这可能是域名或 IP 地址
  • sql_user: MySQL 登录的用户名。 在我们的例子中,这是 root.
  • sql_pass: MySQL 用户的密码。 在我们的例子中,这是 root MySQL 用户的密码
  • sql_db:存储数据的数据库名。 在我们的例子中,这是

这里是源区块:

 1[label source block for sphinx.conf]
 2source src1
 3{
 4  type			= mysql
 5
 6  #SQL settings (for ‘mysql’ and ‘pgsql’ types)
 7
 8  sql_host		= localhost
 9  sql_user		= root
10  sql_pass		= password
11  sql_db	    = test
12  sql_port		= 3306 # optional, default is 3306
13
14  sql_query		= \
15  SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
16  FROM documents
17
18  sql_attr_uint			= group_id
19  sql_attr_timestamp	= date_added
20}

索引组件包含数据存储的源和路径

  • source:源块名称 在我们的例子中,这是 src1.
  • path: 保存索引的路径
1[label index block for sphinx.conf]
2index test1
3{
4  source		= src1
5  path			= /var/lib/sphinx/test1
6  docinfo		= extern
7}

**searchd 组件包含端口和其他变量来运行 Sphinx Daemon。

  • listen: Sphinx Daemon 将运行的端口,其次是协议. 在我们的示例中,这是 9306:mysql41

已知的协议是 :sphinx (SphinxAPI) 和 :mysql41 (SphinxQL)

  • query_log: 保存查询日志的路径.
  • pid_file: Sphinx daemon 的 PID 文件的路径.
  • seamless_rotate: 在旋转大量数据的索引时防止搜索站点进行预存
  • preopen_indexes: 是否强迫在初创
  • unlink_old: 是否在成功旋转时删除旧索引副本。
 1[label searchd block for sphinx.conf]
 2searchd
 3{
 4  listen			= 9312:sphinx		#SphinxAPI port
 5  listen			= 9306:mysql41		#SphinxQL port
 6  log				= /var/log/sphinx/searchd.log
 7  query_log			= /var/log/sphinx/query.log
 8  read_timeout		= 5
 9  max_children		= 30
10  pid_file			= /var/run/sphinx/searchd.pid
11  seamless_rotate	= 1
12  preopen_indexes	= 1
13  unlink_old		= 1
14  binlog_path		= /var/lib/sphinx/
15}

下面是复制和粘贴的完整配置,您需要更改的唯一变量是源块中的sql_pass变量,该变量被突出。

 1[label The full sphinx.conf file]
 2source src1
 3{
 4  type			= mysql
 5
 6  sql_host		= localhost
 7  sql_user		= root
 8  sql_pass		= your_root_mysql_password
 9  sql_db		= test
10  sql_port		= 3306
11
12  sql_query		= \
13  SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
14  FROM documents
15
16  sql_attr_uint			= group_id
17  sql_attr_timestamp	= date_added
18}
19index test1
20{
21  source			= src1
22  path				= /var/lib/sphinx/test1
23  docinfo			= extern
24}
25searchd
26{
27  listen			= 9306:mysql41
28  log				= /var/log/sphinx/searchd.log
29  query_log			= /var/log/sphinx/query.log
30  read_timeout		= 5
31  max_children		= 30
32  pid_file			= /var/run/sphinx/searchd.pid
33  seamless_rotate	= 1
34  preopen_indexes	= 1
35  unlink_old		= 1
36  binlog_path		= /var/lib/sphinx/
37}

要探索更多配置,您可以查看 /usr/share/doc/sphinx-2.2.11/sphinx.conf.dist 文件,其中包含所有变量详细解释。

步骤4:管理指数

在此步骤中,我们将将数据添加到Sphinx索引中,并确保索引使用cron保持最新状态。

首先,使用我们之前创建的配置将数据添加到索引中。

1sudo indexer --all

你应该得到一个看起来如下的东西。

 1[secondary_label Output]
 2Sphinx 2.2.11-id64-release (95ae9a6)
 3Copyright (c) 2001-2016, Andrew Aksyonoff
 4Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
 5
 6using config file '/etc/sphinx/sphinx.conf'...
 7indexing index 'test1'...
 8collected 4 docs, 0.0 MB
 9sorted 0.0 Mhits, 100.0% done
10total 4 docs, 193 bytes
11total 0.006 sec, 29765 bytes/sec, 616.90 docs/sec
12total 4 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
13total 12 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg

在生产环境中,必须保持指数的最新状态。 为了做到这一点,让我们创建一个Cron工作。

1crontab -e

下面的 Cron 任务将每小时运行,并使用我们之前创建的配置文件添加新数据到索引中。

1[label crontab]
2@hourly /usr/bin/indexer --rotate --config /etc/sphinx/sphinx.conf --all

现在Sphinx已完全设置和配置,我们可以启动服务并试用。

第5步:开始Sphinx

使用systemctl来启动Sphinx大象。

1sudo systemctl start searchd

要检查Sphinx大象是否正确运行,请运行:

1sudo systemctl status searchd

你应该得到一个看起来如下的东西。

1[secondary_label Output]
2  searchd.service - SphinxSearch Search Engine
3   Loaded: loaded (/usr/lib/systemd/system/searchd.service; disabled; vendor preset: disabled)
4   Active: active (running) since Fri 2016-08-19 17:48:39 UTC; 5s ago
5   . . .

Sphinx是完全定制和运行,所以我们会检查它是否在下一个工作正确。

步骤6:测试搜索功能

现在一切已经设置好了,让我们测试搜索功能。 使用MySQL接口连接到SphinxQL。 您的提示将更改为MySQL>

1mysql -h0 -P9306

让我们来寻找一个句子。

1SELECT * FROM test1 WHERE MATCH('test document'); SHOW META;

你应该得到一个看起来如下的东西。

 1[secondary_label Output]
 2+------+----------+------------+
 3| id   | group_id | date_added |
 4+------+----------+------------+
 5|    1 |        1 | 1465979047 |
 6|    2 |        1 | 1465979047 |
 7+------+----------+------------+
 82 rows in set (0.00 sec)
 9
10+---------------+----------+
11| Variable_name | Value    |
12+---------------+----------+
13| total         | 2        |
14| total_found   | 2        |
15| time          | 0.000    |
16| keyword[0]    | test     |
17| docs[0]       | 3        |
18| hits[0]       | 5        |
19| keyword[1]    | document |
20| docs[1]       | 2        |
21| hits[1]       | 2        |
22+---------------+----------+
239 rows in set (0.00 sec)

在上面的结果中,你可以看到Sphinx从我们的test1索引中找到2个匹配,用于我们的测试句子。

让我们来搜索一些关键词。

1CALL KEYWORDS ('test one three', 'test1', 1);

你应该得到一个看起来如下的东西。

1[secondary_label Output]
2+------+-----------+------------+------+------+
3| qpos | tokenized | normalized | docs | hits |
4+------+-----------+------------+------+------+
5| 1    | test      | test       | 3    | 5    |
6| 2    | one       | one        | 1    | 2    |
7| 3    | three     | three      | 0    | 0    |
8+------+-----------+------------+------+------+
93 rows in set (0.00 sec)

在上面的结果中,你可以看到在 test1索引中,Sphinx发现:

  • 關鍵字 'test' 的 5 個文件中的匹配* 關鍵字 'one' 的 2 個文件中的匹配* 關鍵字 'three' 的 0 個文件中的 0 個文件中的匹配

现在您已经测试了 Sphinx,您可以使用DROP DATABASE 测试;删除测试数据库。

当你完成时,离开MySQL壳。

1quit

结论

在本教程中,我们向您展示了如何安装Sphinx,并使用SphinxQL和MySQL进行简单的搜索。

您还可以找到官方的 PHP、Perl、Python、Ruby 和 Java 的原生 SphinxAPI 实现

通过使用Sphinx,您可以轻松地添加自定义搜索到您的网站. 有关使用Sphinx的更多信息,请访问 项目网站

Published At
Categories with 技术
comments powered by Disqus