介绍
Sphinx是一个开源搜索引擎,允许全文本搜索,它以非常高效地对大数据进行搜索而闻名。要索引的数据通常可以来自非常不同的来源:SQL数据库,简单文本文件,HTML文件,邮箱等。
Sphinx的一些关键特征是:
- 高索引和搜索性能
- 先进的索引和查询工具
- 先进的结果设置 post-processing
- 已证明可扩展到数十亿的文档,万兆数据和每秒数千个查询
- 易于与SQL和XML数据源集成,以及SphinxQL、SphinxAPI或SphinxSE搜索接口
- 易于扩展与分布式搜索
在本教程中,我们将使用分布包中包含的示例 SQL 文件来设置 Sphinx 与 MySQL 服务器,它将为您提供如何为您的项目使用 Sphinx 的基本想法。
前提条件
在开始本指南之前,您将需要:
- 一个 Ubuntu 14.04 Droplet
- 一个 sudo 非根用户,您可以通过遵循 本教程来设置。
步骤1:安装MySQL服务器
** 注意:** 如果您尚未安装 MySQL 服务器,您只需要完成此部分。
在本节中,我们将安装MySQL服务器,MySQL将允许我们存储样本数据的数据库,我们可以使用它来测试Sphinx的搜索能力。
更新包列表。
1sudo apt-get update
然后安装MySQL服务器。
1sudo apt-get install mysql-server
当被要求时,输入根用户的密码,然后再次输入相同的密码以确认。
第2步:安装Sphinx
在本节中,我们将安装Sphinx。
要安装Sphinx,运行:
1sudo apt-get install sphinxsearch
现在你已经成功地安装了Sphinx在你的服务器上. 在启动Sphinx戴蒙之前,让我们配置它。
步骤三:创建测试数据库
在本节中,我们将使用附带包的示例 SQL 文件来设置数据库。
让我们将一个示例的 SQL 文件导入数据库。
登录到 MySQL 服务器壳。
1mysql -u root -p
当被问及时,请输入MyQL root用户的密码,您的提示将更改为mysql>
。
创建一个名为测试
的数据库。
1CREATE DATABASE test;
导入 SQL 文件。
1SOURCE /etc/sphinxsearch/example.sql;
然后输出MySQL shell。
1quit
现在你应该有测试数据库填满数据。
步骤 4 – 配置 Sphinx
在本节中,我们将配置Sphinx配置文件。
创建sphinx.conf
文件。
1sudo nano /etc/sphinxsearch/sphinx.conf
Sphinx配置由3个主要的区块组成,它们是 index, searchd,和 source. 这些区块中每一个都描述在下面,在这个步骤的结束时,包含了整个sphinx.conf
,以便您将其粘贴到文件中。
源块包含 MySQL 服务器的源类型、用户名和密码。 SQL 查询的第一列应该是唯一的 ID. SQL 查询将在每个索引上运行,并将数据投放到 Sphinx 索引文件中。
sql_host
: MySQL 主机的主机名. 在我们的示例中,这是 localhost. 这可能是域名或 IP 地址sql_user
:MySQL 登录的用户名. 在我们的示例中,这是 root.sql_pass
:MySQL 用户的密码. 在我们的示例中,这是 root MySQL 用户的密码sql_db
:存储数据库的名称.在我们的示例中,这是 test.sql_query
:这是索引将数据放到索引
1source src1
2{
3 type = mysql
4
5 sql_host = localhost
6 sql_user = root
7 sql_pass = password
8 sql_db = test
9 sql_port = 3306 # optional, default is 3306
10
11 sql_query = \
12 SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
13 FROM documents
14
15 sql_attr_uint = group_id
16 sql_attr_timestamp = date_added
17
18 sql_query_info = SELECT * FROM documents WHERE id=$id
19}
索引组件包含数据存储的来源和路径。
source
: 源块的名称 在我们的例子中,这是 src1.path
: 这个保存索引的路径.charset_type
: 这是索引的序列。 您还将此设置为 utf-8
1index test1
2{
3 source = src1
4 path = /var/lib/sphinxsearch/data/test1
5 docinfo = extern
6 charset_type = sbcs
7}
**searchd 组件包含端口和其他变量来运行 Sphinx Daemon。
在我们的例子中,这是9312.
query_log
: 保存查询日志的此路径pid_file
: 这是 Sphinx daemon 的 PID 文件的路径max_matches
: 每个搜索术语返回的最大数目匹配seamless_rotate
: 防止搜索站点在旋转具有大量数据的索引时进行预存preopen_indexes
: 是否要在启动时强制开启所有索引 `unlink_old: 是否要在成功旋转时卸载旧索引副本( _
1searchd
2{
3 listen = 9312 # Port to listen on
4 log = /var/log/sphinxsearch/searchd.log
5 query_log = /var/log/sphinxsearch/query.log
6 read_timeout = 5
7 max_children = 30
8 pid_file = /var/run/sphinxsearch/searchd.pid
9 max_matches = 1000
10 seamless_rotate = 1
11 preopen_indexes = 1
12 unlink_old = 1
13 binlog_path = /var/lib/sphinxsearch/data
14}
下面是复制和粘贴的完整配置,您需要更改的唯一变量是源块中的sql_pass
,该变量被突出。
1source src1
2{
3 type = mysql
4
5 sql_host = localhost
6 sql_user = root
7 sql_pass = password # change this to your root users MySQL password
8 sql_db = test
9 sql_port = 3306
10
11 sql_query = \
12 SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
13 FROM documents
14
15 sql_attr_uint = group_id
16 sql_attr_timestamp = date_added
17
18 sql_query_info = SELECT * FROM documents WHERE id=$id
19}
20index test1
21{
22 source = src1
23 path = /var/lib/sphinxsearch/data/test1
24 docinfo = extern
25 charset_type = sbcs
26}
27searchd
28{
29 listen = 9312
30 log = /var/log/sphinxsearch/searchd.log
31 query_log = /var/log/sphinxsearch/query.log
32 read_timeout = 5
33 max_children = 30
34 pid_file = /var/run/sphinxsearch/searchd.pid
35 max_matches = 1000
36 seamless_rotate = 1
37 preopen_indexes = 1
38 unlink_old = 1
39 binlog_path = /var/lib/sphinxsearch/data
40}
步骤 5 - 将数据添加到索引中
在本节中,我们将将数据添加到Sphinx索引中。
使用我们之前创建的 config 添加数据进行索引。
1sudo indexer --all
你应该得到一个看起来如下的东西。
1Sphinx 2.0.4-id64-release (r3135)
2Copyright (c) 2001-2012, Andrew Aksyonoff
3Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
4
5using config file '/etc/sphinxsearch/sphinx.conf'...
6indexing index 'test1'...
7WARNING: collect_hits: mem_limit=0 kb too low, increasing to 25600 kb
8collected 4 docs, 0.0 MB
9sorted 0.0 Mhits, 100.0% done
10total 4 docs, 193 bytes
11total 0.005 sec, 33788 bytes/sec, 700.28 docs/sec
12total 3 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
13total 9 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
要更新索引,允许创建 cronjob。
开启Crontab。
1crontab -e
您可能会被问及您想要使用的文本编辑器。选择您喜欢的编辑器;在本教程中,我们使用了nano
。
在文件末尾复制并粘贴下列内容,然后保存并关闭它。
1@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
上面的 cronjob 将每小时运行,并使用默认 config 文件将新数据添加到索引中。
步骤6 - 开始Sphinx
在本节中,我们将开始Sphinx Daemon。
要启用 Sphinx,首先打开 /etc/default/sphinxsearch
。
1sudo nano /etc/default/sphinxsearch
查找开始=不
,然后将其设置为是
。
1START=yes
然后保存并关闭文件。
最后,开始Sphinx大象。
1sudo service sphinxsearch start
步骤7 - 测试搜索
在本节中,我们将测试我们的搜索. 输入以下命令。
1search this is my test document number
你应该得到一个看起来如下的东西。
1Sphinx 2.0.4-id64-release (r3135)
2Copyright (c) 2001-2012, Andrew Aksyonoff
3Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
4
5using config file '/etc/sphinxsearch/sphinx.conf'...
6index 'test1': query 'this is my test document number ': returned 2 matches of 2 total in 0.002 sec
7
8displaying matches:
91. document=1, weight=7431, group_id=1, date_added=Tue Dec 16 09:49:04 2014
10id=1
11group_id=1
12group_id2=5
13date_added=2014-12-16 09:49:04
14title=test one
15content=this is my test document number one. also checking search within phrases.
162. document=2, weight=7431, group_id=1, date_added=Tue Dec 16 09:49:04 2014
17id=2
18group_id=1
19group_id2=6
20date_added=2014-12-16 09:49:04
21title=test two
22content=this is my test document number two
23
24words:
251. 'this': 4 documents, 4 hits
262. 'is': 4 documents, 4 hits
273. 'my': 2 documents, 2 hits
284. 'test': 3 documents, 5 hits
295. 'document': 2 documents, 2 hits
306. 'number': 3 documents, 3 hits
上面你可以找到2匹配从我们的测试索引我们的搜索术语. 你也可以找到匹配每个单词。
结论
在本教程中,我们向您展示了使用命令行进行非常简单的搜索,您还可以找到PHP,Perl,Python,Ruby和Java的官方原生SphinxAPI实现方案。
如果你正在使用PHP, 这里是测试Sphinx的一些实用例子。
通过使用Sphinx,您可以轻松地添加自定义搜索到您的网站. 有关使用Sphinx的更多信息,请访问 项目网站。