介绍
Sphinx是一个开源搜索引擎,允许全文搜索。 最着名的是非常有效地对大数据执行搜索。 要索引的数据通常可以来自非常不同的来源:SQL数据库,纯文本文件,HTML文件,邮箱等。
Sphinx的一些主要功能包括:
- 高索引和搜索性能
- 高级索引和查询工具
- 高级结果集后处理
- 经验证的可扩展性,高达数十亿个文档,TB级数据和每秒数千个查询
- 轻松集成SQL和XML数据源,SphinxQL,SphinxAPI或SphinxSE搜索接口
- 通过分布式搜索轻松扩展
在本教程中,我们将使用包含在分发包中的示例SQL文件来设置Sphinx与MySQL服务器。 它将给你一个基本的想法如何使用Sphinx为您的项目。
先决条件
在开始本指南之前,您需要:
第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>
。
创建虚拟数据库。 在这里,我们称它为测试 ,但你可以将其命名为任何你想要的。
CREATE DATABASE test;
导入示例SQL文件。
SOURCE /etc/sphinxsearch/example.sql;
然后离开MySQL shell。
quit
现在你有一个数据库填充样本数据。 接下来,我们将定制Sphinx的配置。
第3步 - 配置Sphinx
Sphinx的配置应该是在一个名为sphinx.conf
中/etc/sphinxsearch
。 配置包括那些运行必不可少的3个主要模块: 索引 ,searchd的 ,和来源 。 我们将提供一个示例配置文件供您使用,并解释每个部分,以便以后进行自定义。
首先,创建sphinx.conf
文件。
sudo nano /etc/sphinxsearch/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
:查询从数据库到索引那转储数据。
这是源块:
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/sphinxsearch/data/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
{
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
源块,这是高亮显示的变量。
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将每小时运行一次,并使用我们之前创建的配置文件向索引添加新数据。 将其复制并粘贴到文件末尾,然后保存并关闭文件。
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
现在Sphinx已经完全设置和配置,我们可以启动服务并尝试。
第5步 - 启动Sphinx
默认情况下,Sphinx守护程序关闭。 首先,我们将改变这一行启用START=no
到START=yes
中/etc/default/sphinxsearch
。
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发现从我们的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'
现在你可以离开MySQL shell了。
quit
结论
在本教程中,我们向您展示了如何安装Sphinx,并使用SphinxQL和MySQL进行简单搜索。
您还可以找到官方对于PHP,Perl,Python和Ruby和Java本地SphinxAPI实现 。 如果你正在使用的NodeJS,你也可以使用该SphinxAPI包 。
通过使用Sphinx,您可以轻松地添加自定义搜索到您的网站。 有关使用Sphinx的更多信息,请访问该项目的网站 。