如何在CentOS 7安装和配置Sphinx

介绍

Sphinx是一个开源搜索引擎,允许全文搜索。最着名的是非常有效地对大数据执行搜索。要索引的数据通常可以来自非常不同的来源:SQL数据库,纯文本文件,HTML文件,邮箱等。 Sphinx的一些主要功能包括:
  • 高索引和搜索性能
  • 高级索引和查询工具
  • 高级结果集后处理
  • 经验证的可扩展性,高达数十亿个文档,TB级数据和每秒数千个查询
  • 轻松集成SQL和XML数据源,SphinxQL,SphinxAPI或SphinxSE搜索接口
  • 通过分布式搜索轻松扩展
在本教程中,我们将使用包含在分发包中的示例SQL文件来设置Sphinx与MySQL服务器。它将给你一个基本的想法如何使用Sphinx为您的项目。

先决条件

在开始本指南之前,您需要:
  • 一个CentOS 7服务器。
  • sudo的一个非root用户,您可以通过以下设置本教程
  • 安装在服务器上,你可以通过下面的第2步设置在MySQL 本教程

第1步 - 安装Sphinx

在写作的时候,最新的Sphinx的版本是 2.2.11。 你可以找到最新版本 的Sphinx网站上 。 在安装Sphinx之前,首先需要安装它的依赖项。
sudo yum install -y postgresql-libs unixODBC
移动到 tmp目录下载在一个不显眼的地方Sphinx的文件。
cd /tmp
通过下载最新版本的Sphinx wget
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> 。 创建虚拟数据库。在这里,我们称它为 测试 ,但你可以将其命名为任何你想要的。
CREATE DATABASE test;
导入示例SQL文件。
SOURCE /usr/share/doc/sphinx-2.2.11/example.sql;
然后离开MySQL shell。
quit
现在你有一个数据库填充样本数据。接下来,我们将定制Sphinx的配置。

第3步 - 配置Sphinx

Sphinx的配置应该是在一个文件调用 sphinx.conf/etc/sphinx 。 配置由3个主要部分: 索引 ,searchd的 ,和 来源 。 有一个最小配置已经提供,但我们将提供一个新的示例配置文件,您可以使用和解释每个部分,以便以后可以自定义。 首先,将现有 sphinx.conf文件。
sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2
创建一个新 sphinx.conf与文件 vi或你喜欢的文本编辑器。
sudo vi /etc/sphinx/sphinx.conf
每个 索引 ,searchd的 ,和 块的描述如下。 然后,在这个步骤结束时,对全部 sphinx.conf被包括为你复制并粘贴到文件中。 块包含源代码,用户名和密码到MySQL服务器的类型。 所述的第一列 sql_query应该是唯一的ID。 SQL查询将在每个索引上运行,并将数据转储到Sphinx索引文件。下面是每个字段和源块本身的描述。
  • type :数据源索引的类型。 在我们的例子,这是MySQL。其他支持的类型包括pgsql,mssql,xmlpipe2,odbc等。
  • sql_host :主机名MySQL的主机。 在我们的例子,这是localhost 。这可以是域或IP地址。
  • sql_user :用户名MySQL的登录。 在我们的例子,这是根源
  • sql_pass :密码为MySQL用户。在我们的示例中,这是根MySQL用户的密码。
  • sql_db :存储数据的数据库的名称。 在我们的例子,这是考验
  • 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
}
索引组件包含源和存储数据的路径。 在
  • 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 :同时旋转海量数据预缓存的指标,防止searchd的摊位。
  • preopen_indexes :是否强行盘前在启动时的所有索引。
  • unlink_old :是否删除成功旋转旧的索引拷贝。
searchd块的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发现从我们的2场比赛 test1索引我们的测试句子。 该 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发现:
  • 5个匹配在3个文档中的关键字'test'
  • 2在1个文档中匹配关键字“1”
  • 0匹配0个文档中的关键字'three'
现在,您已经测试过Sphinx,就可以删除与测试数据库 DROP DATABASE test;如果你喜欢。 完成后,离开MySQL shell。
quit

结论

在本教程中,我们向您展示了如何安装Sphinx,并使用SphinxQL和MySQL进行简单搜索。 您还可以找到官方 对于PHP,Perl,Python和Ruby和Java本地SphinxAPI实现 。 如果你正在使用的NodeJS,你也可以使用 该SphinxAPI包 。 通过使用Sphinx,您可以轻松地添加自定义搜索到您的网站。有关使用Sphinx的更多信息,请访问 该项目的网站
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏