How to use Sphinx


发布评论 (0)

Sphinx 可以更好的进行全文索引


安装环境

ubuntu 14.04
php 5.6
mysql 5.6


安装 Sphinx

sudo apt-get update
sudo apt-get install sphinxsearch


导入测试数据

安装完成后可以直接使用自带的测试数据进行测试

mysql -uroot test < /etc/sphinxsearch/example.sql


配置 Sphinx

创建配置文件

sudo vim /etc/sphinxsearch/sphinx.conf # 同目录下有配置说明

创建一个源

source src1
{
  type          = mysql #配置数据库类型

  sql_host      = localhost
  sql_user      = root
  sql_pass      = password
  sql_db        = test #我们的表名
  sql_port      = 3306 # optional, default is 3306

  #定义一个主查询 第一个字段需要唯一 这里使用 id 即可
  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_field_string = title

  sql_query_info        = SELECT * FROM documents WHERE id=$id
}


创建索引

index test1
{
  source            = src1 # 数据源名称
  source = src2 # 如果有多个源 可以创建多个 source = source 合并至一个索引,分布式源必须结构相同
  path          = /var/lib/sphinxsearch/data/test1 # 存储位置
  docinfo           = extern
  charset_type      = sbcs #字符编码设置支持sbcs(指Single Byte Character Set)和utf-8
}


实时索引

index rt
{
    type              = rt
    path              = /usr/local/sphinx/data/rt
    rt_field          = title # 实时索引的字段 必须配置
    rt_field          = content
    rt_attr_uint      = group_id
    rt_attr_timestamp = published
    rt_mem_limit      = 256M # 最大占用内存
}


配置继承

source test2: test1{
}


配置 searchd

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
}


准备就绪,开始索引

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


通过计划任务,每小时自动更新索引文件

crontab -e

@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all


启动 Sphinx

默认配置的  sphinx 启动是关闭的

sudo vim /etc/default/sphinxsearch
# 修改行为
START=yes
# 下次启动时即可启动 sphinx


使用 service 启动

service sphinxsearch start



使用  searchd 进行测试

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

# 返回搜索到的最适合文档和分词结果


通过 API 使用 Sphinx


安装 php 扩展

sudo apt-get install libsphinxclient-dev

sudo pecl install sphinx

# 安装完成后通过 phpinfo() 看到 sphinx 即为成功


使用 API 测试

$cl = new SphinxClient();
$result = $cl->Query("this is my query", "#源名称#");
var_dump($result);

# 结果应该与 search 一致

更多高级配置

原生API提供的匹配筛选、排序和分组配置和SQL语法提供的WHERE、ORDER BY和GROUP BY语句的效果是一样的,你可以对匹配结果进行你需要的筛选、排序和分组匹配。例如,如果你要搜索MySQL中1990年代的书籍,并按照价格排序,可以这么写:

$cl = new SphinxClient();
$cl->SetFilterRange("year_published", 1990, 1999); # 查询条件
$cl->SetSortMode(SPH_SORT_EXTENDED, "price DESC"); # 排序规则
$result = $cl->Query("神笔马良", "booksindex");

上述代码不仅一目了然而且也展示了通用API的使用模式:首先创建一个客户端对象,配置所有查询设置,然后启动搜索并获取结果。当然,产品级的代码应当添加错误处理:

$cl = new SphinxClient();
$cl->SetFilterRange("year_published", 1990, 1999);
$cl->SetSortMode(SPH_SORT_EXTENDED, "price DESC");
$result = $cl->Query("mysql", "booksindex");
if (!$result)
{
    // oops, there was an error
    DisplayErrorPage($cl->GetLastError());
} else
{
    // everything was good
    DisplaySearchResult($result);
}

为了进一步完善,让我们也看看如何使用原生API来对年份来分组和计算数据:

$cl = new SphinxClient();
$cl->SetFilterRange("year_published", 1990, 1999);
$cl->SetSortMode(SPH_SORT_EXTENDED, "price DESC");
$cl->SetGroupBy("year_published", SPH_GROUPBY_ATTR);
$cl->SetSelect("*, MIN(price) AS minprice,    MAX(price) AS maxprice, AVG(price) AS avgprice");
$result = $cl->Query("mysql", "booksindex");

本文发布于: 2016-11-17 17:29:29,作者: Zack Lee。 属于: Web, PHP 分类,被贴了 sphinx 标签。


> 评论区域


还没有人参与评论