介绍
Sphinx是一个开源搜索引擎,允许全文本搜索,它以非常高效地对大数据进行搜索而闻名。要索引的数据通常可以来自非常不同的来源:SQL数据库,简单文本文件,HTML文件,邮箱等。
一些Sphinx的主要特点是:
- 高索引和搜索性能
- 先进的索引和查询工具
- 先进的结果集后处理
- 已证明可扩展到数十亿的文档,多兆字节的数据和每秒数千个查询
- 易于与 SQL 和 XML 数据源以及 SphinxQL、SphinxAPI 或 SphinxSE 搜索接口
- 易于扩展与分布式搜索
在本教程中,我们将使用分布包中包含的样本 SQL 文件来设置 Sphinx 与 MySQL 服务器,它将为您提供如何为您的项目使用 Sphinx 的基本想法。
前提条件
在开始本指南之前,您将需要:
- 一个 Ubuntu 16.04 服务器
- 一个 sudo 非根用户,您可以通过遵循 本教程来设置。
步骤1:安装Sphinx
在Ubuntu上安装Sphinx很容易,因为它位于原生包库中。
1sudo apt-get install sphinxsearch
现在你已经成功地安装了Sphinx在你的服务器上. 在启动Sphinx戴蒙之前,让我们配置它。
步骤2:创建测试数据库
接下来,我们将使用随包提供的 SQL 文件中的样本数据来设置数据库,这将使我们能够测试Sphinx 搜索是否在以后工作。
让我们将样本 SQL 文件导入数据库. 首先,登录 MySQL 服务器壳。
1mysql -u root -p
当被问及时,请输入MySQL root用户的密码,您的提示将更改为mysql>
。
在这里,我们称之为 test,但你可以随心所欲命名它。
1CREATE DATABASE test;
例如,导入 SQL 文件。
1SOURCE /etc/sphinxsearch/example.sql;
然后离开MySQL壳。
1quit
现在你有一个数据库填满了样本数据,接下来,我们将定制Sphinx的配置。
步骤 3 – 配置 Sphinx
Sphinx 的配置应该在一个名为 sphinx.conf
的文件中,在 /etc/sphinxsearch
. 配置由 3 个主要的块组成,这些块是运行必不可少的: index, searchd,和 source. 我们将为您提供一个示例配置文件,并解释每个部分,以便您稍后可自定义。
首先,创建sphinx.conf
文件。
1sudo nano /etc/sphinxsearch/sphinx.conf
这些 index、 searchd 和 source 块的每一个都是下面描述的,然后,在这个步骤的结束时,包含了整个 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/sphinxsearch/data/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/sphinxsearch/searchd.log
7 query_log = /var/log/sphinxsearch/query.log
8 read_timeout = 5
9 max_children = 30
10 pid_file = /var/run/sphinxsearch/searchd.pid
11 seamless_rotate = 1
12 preopen_indexes = 1
13 unlink_old = 1
14 binlog_path = /var/lib/sphinxsearch/data
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/sphinxsearch/data/test1
23 docinfo = extern
24}
25searchd
26{
27 listen = 9306:mysql41
28 log = /var/log/sphinxsearch/searchd.log
29 query_log = /var/log/sphinxsearch/query.log
30 read_timeout = 5
31 max_children = 30
32 pid_file = /var/run/sphinxsearch/searchd.pid
33 seamless_rotate = 1
34 preopen_indexes = 1
35 unlink_old = 1
36 binlog_path = /var/lib/sphinxsearch/data
37}
要探索更多配置,您可以看看 /etc/sphinxsearch/sphinx.conf.sample
文件,其中有所有变量更详细地解释。
步骤4:管理指数
在此步骤中,我们将将数据添加到Sphinx索引中,并确保索引使用cron
保持最新状态。
首先,使用我们之前创建的配置将数据添加到索引中。
1sudo indexer --all
你应该得到一个看起来如下的东西。
1[secondary_label Output]
2Sphinx 2.2.9-id64-release (rel22-r5006)
3Copyright (c) 2001-2015, Andrew Aksyonoff
4Copyright (c) 2008-2015, Sphinx Technologies Inc (http://sphinxsearch.com)
5
6using config file '/etc/sphinxsearch/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.010 sec, 18552 bytes/sec, 384.50 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
在生产环境中,必须保持指数的最新状态。 为了做到这一点,让我们创建一个Cronjob。
1crontab -e
您可能会被问及您想要使用的文本编辑器。选择您喜欢的编辑器;在本教程中,我们使用了nano
。
追踪 cronjob 将每小时运行,并使用我们之前创建的配置文件添加新数据到索引中。
1[label crontab]
2@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
现在Sphinx已完全设置和配置,我们可以启动服务并试用。
第5步:开始Sphinx
首先,我们将通过在/etc/default/sphinxsearch
中将字符串START=no
更改为START=yes
来激活它。
1sudo sed -i 's/START=no/START=yes/g' /etc/default/sphinxsearch
然后,使用systemctl
重新启动Sphinx大象。
1sudo systemctl restart sphinxsearch.service
要检查Sphinx大象是否正确运行,请运行。
1sudo systemctl status sphinxsearch.service
你应该得到一个看起来如下的东西。
1[secondary_label Output]
2● sphinxsearch.service - LSB: Fast standalone full-text SQL search engine
3 Loaded: loaded (/etc/init.d/sphinxsearch; bad; vendor preset: enabled)
4 Active: active (running) since Tue 2016-07-26 01:50:00 EDT; 15s ago
5 . . .
这也将确保Sphinx大象在重新启动服务器时也能启动。
步骤6:测试
现在一切已经设置好了,让我们测试搜索功能。 使用MySQL接口连接到SphinxQL(在端口9306)。 您的提示将更改为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 個文件中的匹配
现在你可以离开MySQL壳。
1quit
结论
在本教程中,我们向您展示了如何安装Sphinx,并使用SphinxQL和MySQL进行简单的搜索。
您还可以找到官方的 PHP、Perl、Python、Ruby 和 Java 的原生 SphinxAPI 实现。
通过使用Sphinx,您可以轻松地添加自定义搜索到您的网站. 有关使用Sphinx的更多信息,请访问 项目网站。