Sphinx是一个开源搜索引擎,允许全文搜索。众所周知,它能非常有效地对大数据进行搜索。要编制索引的数据通常来自非常不同的来源:SQL数据库,纯文本文件,HTML文件,邮箱等。
Sphinx的一些主要功能包括:
在本教程中,我们将使用分发包中包含的示例SQL文件设置Sphinx和MySQL服务器。它将为您提供有关如何将Sphinx用于您的项目的基本知识。
在开始本指南之前,您需要:
您可以在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守护程序之前,让我们配置它。
在这里,我们将使用随包提供的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的配置。
Sphinx的配置应该在/etc/sphinx
中一个名为sphinx.conf
的文件中。配置由3个主要块组成:索引,搜索和源。
已经提供了最小配置,但我们将提供一个新的示例配置文件供您使用并解释每个部分,以便您以后可以自定义。
首先,移动现有sphinx.conf
文件。
sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2
使用vi
或您喜欢的文本编辑器创建一个新文件sphinx.conf
。
sudo vi /etc/sphinx/sphinx.conf
下面依次描述索引,搜索和源块。然后,在此步骤结束时,包含sphinx.conf
的整个内容将供您复制并粘贴到文件中。
该源块包含源,用户名和密码的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
:存储数据的数据库的名称。在我们的例子中,这是测试。sql_query
:将数据从数据库转储到索引的查询。这是源块:
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
:保存索引的路径。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
:是否在成功轮换时删除旧索引副本。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
,该变量如下所示:
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
文件,其中详细说明了所有变量。
在此步骤中,我们将向Sphinx索引添加数据,并通过cron
确保索引保持最新数据。
首先,使用我们之前创建的配置将数据添加到索引。
sudo indexer --all
你应该得到类似下面的东西。
Sphinx 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作业将每小时运行一次,并使用我们之前创建的配置文件将新数据添加到索引中。将其复制并粘贴到文件末尾,然后保存并关闭该文件。
@hourly /usr/bin/indexer --rotate --config /etc/sphinx/sphinx.conf --all
现在Sphinx已完全设置和配置,我们可以启动该服务并进行试用。
使用systemctl
启动Sphinx守护进程。
sudo systemctl start searchd
要检查Sphinx守护程序是否正确运行,请运行:
sudo systemctl status searchd
你应该得到类似下面的东西。
● 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是完全自定义和运行的,因此我们将检查它是否正常工作。
现在一切都已设置好,让我们测试一下搜索功能。使用MySQL界面连接到SphinxQL。您的提示将更改为MySQL>
。
mysql -h0 -P9306
我们来搜索一个句子。
SELECT * FROM test1 WHERE MATCH('test document'); SHOW META;
你应该得到类似下面的东西。
+------+----------+------------+
| 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);
你应该得到类似下面的东西。
+------+-----------+------------+------+------+
| 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发现:
现在您已经测试了Sphinx,您可以根据需要删除测试数据库DROP DATABASE test;
。
完成后,退出MySQL shell。
quit
在本教程中,我们向您展示了如何安装Sphinx并使用SphinxQL和MySQL进行简单搜索。
通过使用Sphinx,您可以轻松地向您的网站添加自定义搜索。
想要了解更多关于安装和配置Sphinx的相关教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Install and Configure Sphinx on CentOS 7》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。