Windows 使用Sphinx 配合Mysql搜索
Sphinx特性:
- 高速的建立索引(在当代CPU上,峰值性能可达到10MB/秒);
- 高性能的搜索(在2–4GB的文本数据上,平均每次检索响应时间小于0.1秒);
- 可处理海量数据(目前已知可以处理超过100GB的文本数据,在单一CPU的系统上可处理100M文档);
- 提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法;
- 支持分布式搜索;
-
提供文件的摘录生成;
- 3
-
可作为MySQL的存储引擎提供搜索服务;
-
支持布尔、短语、词语相似度等多种检索模式;
-
文档支持多个全文检索字段(最大不超过32个);
-
文档支持多个额外的属性信息(例如:分组信息,时间戳等);
-
停止词查询;
-
支持单一字节编码和UTF-8编码;
-
原生的MySQL支持(同时支持MyISAM和InnoDB);
-
原生的PostgreSQL支持.
简单的理解:
先对数据源建立索引。采用分词技术,形成一个索引表。当查询某个单词的时候,先到sphinx建立的索引去查找,然后再去数据库用id查找。
1.直接在http://www.sphinxsearch.com/downloads.html找到最新的windows版本:
我是安装在 D:\sphinx;
2 在sphinx文件夹data里面新建存放数据得文件 我这里和数据库保持了一致:
D:\sphinx\data\jkadmin
新建log文件夹用于存放搜索日志D:\sphinx\data\log
3 在etc目录下找到sphinx-min.conf.dist 重名为sphinx.conf,将配置文件移动到bin目录下,方便操作。
4 修改配置文件
# # Minimal Sphinx configuration sample (clean, simple, functional) # source doc { type = mysql sql_host = localhost sql_user = root sql_pass = admin789 sql_db = jkadmin sql_port = 3306 # optional, default is 3306 sql_query_pre = SET NAMES utf8 sql_query = \ SELECT id, UNIX_TIMESTAMP(create_time) AS date_added, sku, name \ FROM jk_product sql_attr_uint = date_added } index jkadmin { source = doc path = D:/sphinx/data/jkadmin } index jkadminrt { type = rt rt_mem_limit = 128M path = D:/sphinx/data/jkadminrt rt_field = sku rt_field = name rt_attr_uint = id } indexer { mem_limit = 128M } searchd { listen = 9312 listen = 9306:mysql41 log = D:/sphinx/data/log/searchd.log query_log = D:/sphinx/data/log/query.log read_timeout = 5 max_children = 30 pid_file = D:/sphinx/data/log/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 workers = threads # for RT to work binlog_path = D:/sphinx/data/jkadmin }
5 然后打开终端,切换到sphinx/bin目录下
然后到data目录查看可以看到
启动sphinx服务:
6 使用搜索方式试一下
<?php require "sphinxapi.php"; $client = new SphinxClient(); $query = "BM00FIXED049"; $host = "127.0.0.1"; $port = 9312; $index = 'jkadmin'; $client->SetServer($host,$port); $client->SetConnectTimeout(60); $client->SetArrayResult(true); $res = $client->Query($query,$index); print_r($res['matches']);j
输出结果:Array ( [0] => Array ( [id] => 3393 [weight] => 13653 [attrs] => Array ( [date_added] => 0 ) ) )
结果中id 和数据库得ID结果是匹配的。
补充一下:以上不支持中文搜索
可以在索引增加以下配置:
index jkadmin
{
source = doc
path = D:/sphinx/data/jkadmin
ngram_len = 1
ngram_chars = U+3000..U+2FA1F
}