介绍
Sphinx是一个开源搜索引擎,允许全文搜索。最着名的是非常有效地对大数据执行搜索。要索引的数据通常可以来自非常不同的来源:SQL数据库,纯文本文件,HTML文件,邮箱等。 Sphinx的一些主要功能包括:- 高索引和搜索性能
- 高级索引和查询工具
- 高级结果集后处理
- 经验证的可扩展性,高达数十亿个文档,TB级数据和每秒数千个查询
- 轻松集成SQL和XML数据源,SphinxQL,SphinxAPI或SphinxSE搜索接口
- 通过分布式搜索轻松扩展
先决条件
在开始本指南之前,您需要:第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'
DROP DATABASE test;
如果你喜欢。 完成后,离开MySQL shell。
quit