如何在Ubuntu14.04上安装和配置Sphinx

来自菜鸟教程
跳转至:导航、​搜索

介绍

Sphinx 是一个允许全文搜索的开源搜索引擎。 它以非常有效地对大数据执行搜索而闻名。 要索引的数据通常可以来自非常不同的来源:SQL 数据库、纯文本文件、HTML 文件、邮箱等。

狮身人面像的一些主要特点是:

  • 高索引和搜索性能
  • 高级索引和查询工具
  • 高级结果集后处理
  • 经过验证的可扩展性高达每秒数十亿个文档、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 服务器外壳。

mysql -u root -p

询问时输入 MySQL 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 个主要块组成。 它们是 indexsearchdsource。 下面描述了这些块中的每一个,在此步骤结束时,将包含整个 sphinx.conf 供您粘贴到文件中。

source 块包含 MySQL 服务器的源类型、用户名和密码。 SQL 查询的第一列应该是唯一的 id。 SQL 查询将在每个索引上运行并将数据转储到 Sphinx 索引文件。 下面是每个字段和源块本身的描述。

  • sql_host:MySQL 主机的主机名。 在我们的示例中,这是 localhost。 这可以是域或 IP 地址。
  • sql_user:MySQL 登录的用户名。 在我们的示例中,这是 root
  • sql_pass:MySQL 用户的密码。 在我们的示例中,这是 root MySQL 用户的密码
  • sql_db:存储数据的数据库名称。 在我们的示例中,这是 test
  • 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
}

index 组件包含存储数据的源和路径。

  • 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:防止在将具有大量数据的索引旋转到预缓存时搜索停止。
  • 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,here 是一些方便的示例来测试 Sphinx。

通过使用 Sphinx,您可以轻松地将自定义搜索添加到您的站点。 有关使用 Sphinx 的更多信息,请访问 项目网站