介绍
Sphinx是一个开源搜索引擎,允许全文搜索。 最着名的是非常有效地对大数据执行搜索。 要索引的数据通常可以来自非常不同的来源:SQL数据库,纯文本文件,HTML文件,邮箱等。
Sphinx的一些主要功能包括:
- 高索引和搜索性能
- 高级索引和查询工具
- 高级结果集后处理
- 经验证的可扩展性,高达数十亿个文档,TB级数据和每秒数千个查询
- 轻松集成SQL和XML数据源,SphinxQL,SphinxAPI或SphinxSE搜索接口
- 通过分布式搜索轻松扩展
在本教程中,我们将使用包含在分发包中的示例SQL文件来设置Sphinx与MySQL服务器。 它将给你一个基本的想法如何使用Sphinx为您的项目。
先决条件
在开始本指南之前,您需要:
- 一个Ubuntu 14.04 Droplet。
- sudo的一个非root用户,您可以通过以下设置本教程 。
第1步 - 安装MySQL服务器
注意:您只需要完成此部分,如果你不已经安装了MySQL服务器。
在本节中,我们将安装MySQL服务器。 MySQL会让我们存储一个样本数据的数据库,我们可以用它来测试Sphinx的搜索能力。
更新软件包列表。
sudo apt-get update
然后安装MySQL服务器。
sudo apt-get install mysql-server
在提示时输入root用户的密码,然后再次输入相同的密码进行确认。
第2步 - 安装Sphinx
在本节中,我们将安装Sphinx。
要安装Sphinx,请运行:
sudo apt-get install sphinxsearch
现在您已经在服务器上成功安装了Sphinx。 在启动Sphinx守护进程之前,让我们进行配置。
第3步 - 创建测试数据库
在本节中,我们将使用随包提供的示例SQL文件设置数据库。
让我们将一个示例SQL文件导入数据库。
登录到MySQL服务器shell。
mysql -u root -p
在提示时输入MyQL root用户的密码。 您提示将改变为mysql>
。
创建一个数据库名为test
。
CREATE DATABASE test;
导入SQL文件。
SOURCE /etc/sphinxsearch/example.sql;
然后退出MySQL shell。
quit
现在你应该用测试数据库填充数据。
第4步 - 配置Sphinx
在本节中,我们将配置Sphinx配置文件。
创建sphinx.conf
文件。
sudo nano /etc/sphinxsearch/sphinx.conf
Sphinx配置由3个主要块组成,这些块是运行必不可少的。 它们是索引 ,searchd的 ,和源 。 每个这些块的下面描述,并在此步骤结束时,对全部sphinx.conf
被包括为你粘贴到该文件。
源块包含源代码,用户名和密码到MySQL服务器的类型。 SQL查询的第一列应该是唯一的ID。 SQL查询将在每个索引上运行,并将数据转储到Sphinx索引文件。 下面是每个字段和源块本身的描述。
-
sql_host
:主机名MySQL的主机。 在我们的例子,这是本地主机 。 这可以是域或IP地址。 -
sql_user
:用户名MySQL的登录。 在我们的例子,这是根源 。 -
sql_pass
:密码为MySQL用户。 在我们的例子,这是MySQL的root用户的密码 -
sql_db
:存储数据的数据库的名称。 在我们的例子,这是考验 。 -
sql_query
:这是查询那转储数据索引。
source src1
{
type = mysql
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
sql_query_info = SELECT * FROM documents WHERE id=$id
}
索引组件包含源和存储数据的路径。
-
source
:源块的名称。 在我们的例子,这是src1的 。 -
path
:此路径保存索引。 -
charset_type
:这是指数的字符集。 您还可以设置此为UTF-8。
index test1
{
source = src1
path = /var/lib/sphinxsearch/data/test1
docinfo = extern
charset_type = sbcs
}
该searchd的组件包含端口和其他变量来运行Sphinx守护进程。
-
listen
:这是Sphinx守护进程运行的端口。 在我们的示例中,这是9312。 -
query_log
:此路径保存查询日志。 -
pid_file
:这是路径,Sphinx守护进程的PID文件。 -
max_matches
:最大号码与每个搜索字词返回。 -
seamless_rotate
:同时旋转海量数据预缓存的指标,防止searchd的摊位。 -
preopen_indexes
:是否强行盘前在启动时的所有索引。 -
unlink_old
:是否取消链接成功的旋转旧的索引拷贝。
searchd
{
listen = 9312 # Port to listen on
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
max_matches = 1000
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 = password # change this to your root users 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
sql_query_info = SELECT * FROM documents WHERE id=$id
}
index test1
{
source = src1
path = /var/lib/sphinxsearch/data/test1
docinfo = extern
charset_type = sbcs
}
searchd
{
listen = 9312
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
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinxsearch/data
}
第5步 - 向索引添加数据
在本节中,我们将向Sphinx索引添加数据。
使用我们之前创建的配置将数据添加到索引。
sudo indexer --all
你应该得到类似下面的东西。
Sphinx 2.0.4-id64-release (r3135)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinxsearch/sphinx.conf'...
indexing index 'test1'...
WARNING: collect_hits: mem_limit=0 kb too low, increasing to 25600 kb
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.005 sec, 33788 bytes/sec, 700.28 docs/sec
total 3 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
total 9 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
要使索引保持最新,请创建一个cronjob。
打开crontab。
crontab -e
可能会询问您要使用哪个文本编辑器。 选择你喜欢的; 在本教程中,我们使用nano
。
将以下内容复制并粘贴到文件末尾,然后保存并关闭。
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
上面的cronjob将运行在每个小时,并使用默认配置文件添加新的数据到索引。
第6步 - 启动Sphinx
在本节中,我们将启动Sphinx守护进程。
默认情况下,Sphinx守护程序关闭。 为了使Sphinx,首开/etc/default/sphinxsearch
。
sudo nano /etc/default/sphinxsearch
查找行START=no
并将其设置为yes。
START=yes
然后,保存并关闭文件。
最后,启动Sphinx守护进程。
sudo service sphinxsearch start
第7步 - 测试搜索
在本节中,我们将测试我们的搜索。 输入以下命令。
search this is my test document number
你应该得到类似下面的东西。
Sphinx 2.0.4-id64-release (r3135)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinxsearch/sphinx.conf'...
index 'test1': query 'this is my test document number ': returned 2 matches of 2 total in 0.002 sec
displaying matches:
1. document=1, weight=7431, group_id=1, date_added=Tue Dec 16 09:49:04 2014
id=1
group_id=1
group_id2=5
date_added=2014-12-16 09:49:04
title=test one
content=this is my test document number one. also checking search within phrases.
2. document=2, weight=7431, group_id=1, date_added=Tue Dec 16 09:49:04 2014
id=2
group_id=1
group_id2=6
date_added=2014-12-16 09:49:04
title=test two
content=this is my test document number two
words:
1. 'this': 4 documents, 4 hits
2. 'is': 4 documents, 4 hits
3. 'my': 2 documents, 2 hits
4. 'test': 3 documents, 5 hits
5. 'document': 2 documents, 2 hits
6. 'number': 3 documents, 3 hits
上面你可以从我们的测试索引找到2个匹配的搜索项。 你也可以找到每个词的匹配。
结论
在本教程中,我们使用命令行向您展示了一个非常简单的搜索。 您也可以找到PHP,Perl,Python和Ruby和Java的官方原生SphinxAPI实现这里 。
如果你正在使用PHP, 这里有一些方便的例子来测试Sphinx。
通过使用Sphinx,您可以轻松地添加自定义搜索到您的网站。 有关使用Sphinx的更多信息,请访问该项目的网站 。