sphinx xmlpipe2 php,PHP+MongoDB+Coreseek/Sphinx打造搜索引擎
近几年来,Linux+Nginx+PHP+MongoDB(LNPM)这样的组合越来越火,甚至有取代Linux+Nginx/Apache+PHP+mysql这种组合的趋势。究其原因,是MongoDB强大,灵活,易扩展,更关键的易用。MongoDB不用事先设计好表结构,往里面插入什么都可以,管理还方便。所以成为创业团队的首选数据库,更是移动互联网的一枝新秀。
但MongoDB和关系型数据库也有很多相似之处,如全文索引不支持中文。在MongoDB2.6版本中开始默认支持全文索引,一如既往的不支持伟大的Chinese,因此如果需要搜索功能,就要另辟蹊径。
Sphinx与Lucene是做搜索引擎的不错的选择。个人观点Lucene对Java的支持比较好,而Sphixn对PHP的支持较好,所以我选择了Sphinx。其实Sphinx对中文的支持也不是很好,由于Sphinx是根据空格来分词(适用与英文),根本不适用中文分词。幸好有人提供了基于Sphinx的支持中文的插件Coreseek和Sphinx—for—chinese。
Coreseek有完整的文档,目前支持最新版的Sphinx,因此我选择Coreseek。
Sphinx-for-chinese严重缺乏文档。
安装:
(1)Coreseek安装。
(2)phinx-for-chinese安装。
创建索引:
Coreseek支持与Mysql直接对接,只需在Coreseek配置文件里填上Mysql的信息,Coreseek就会自动读取Mysql数据来创建索引(当然前提是你做了生成索引的相应设置或者执行生成索引的命令)。但是Sphinx不支持与MongoDB直接对接,可以把Mongo数据源转换为Python数据源或者转换成xmlpipe2数据源。
本人不会Python,因此用php些了一个xml管道用于把MongoDB数据传输到Coreseek。参考代码如下所示:
class SphinxXmlpipe{
private $xmlWriter;
private $fields = array();
private $attributes = array();
private $documents = array();
public function setFields($fields) {
$this->fields = $fields;
}
public function setAttributes($attributes) {
$this->attributes = $attributes;
}
public function beginOutput() {
//create a new xml document
$this->xmlWriter = new \XMLWriter();
$this->xmlWriter->openMemory();
$this->xmlWriter->setIndent(true);
$this->xmlWriter->startDocument('1.0', 'UTF-8');
$this->xmlWriter->startElement('sphinx:docset');
$this->xmlWriter->startElement('sphinx:schema');
// add fileds to the schma
foreach($this->fields as $field) {
$this->xmlWriter->startElement('sphinx:field');
$this->xmlWriter->writeAttribute('name', $field);
$this->xmlWriter->endElement();
}
/*
// add atttributes to the schema
foreach($this->attributes as $attributes) {
$this->xmlWriter->startElement('sphinx:attr');
foreach($attributes as $key => $value) {
$this->xmlWriter->writeAttribute($key, $value);
}
$this->xmlWriter->endElement();
}
*/
$this->xmlWriter->endElement(); // schema
}
public function addDocument($doc) {
$this->xmlWriter->startElement('sphinx:document');
$this->xmlWriter->writeAttribute('id', $doc['book_id']);
foreach($doc as $key => $value) {
$this->xmlWriter->startElement($key);
$this->xmlWriter->text($value);
$this->xmlWriter->endElement();
}
$this->xmlWriter->endElement(); // document
}
public function endOutput() {
// end sphinx:docset
$this->xmlWriter->endElement();
$this->xmlWriter->endDocument();
echo $this->xmlWriter->outputMemory();
}
public function xmlpipe2() {
$this->setfields( array(
'book_id',
'book_name',
));
$this->setAttributes( array(
array(
'name' => 'book_id',
'type' => 'int',
'bits' => '16',
'default' => '1',
),
));
$this->beginOutput();
$mBook = D('book');
$count = $mBook->count();
$limit = c('XMLPIPE_BOOKS_COUNT_PER_TIME');
$tCont = (int)$count/$limit;
$oCount = $count%$limit;
if($tCont>0) {
do {
$books = $mBook->field('book_id,book_name','_id=>0')->limit($limit)->select();
foreach($books as $book) {
$this->addDocument($book);
}
unset($books);
$tCont--;
} while($tCont>0);
$books = $mBook->field('book_id,book_name','_id=>0')->limit($oCount)->select();
foreach($books as $book) {
$this->addDocument($book);
}
unset($books);
} else {
$books = $mBook->field('book_id,book_name','_id=>0')->limit($oCount)->select();
foreach($books as $book) {
$this->addDocument($book);
}
unset($books);
}
$this->endOutput();
}
}
输出的xml格式如下所示
图1
相应的Coreseek设置,参考代码如下所示:
source src1
{
type = xmlpipe2
xmlpipe_command = cd /var/www/PHPParser && php index.php /Home/SphinxXmlpipe/xmlpipe2
xmlpipe_field = book_id
xmlpipe_field = book_name
xmlpipe_attr_timestamp = book_id
xmlpipe_attr_uint = book_id
xmlpipe_fixup_utf8 = 1
}
搜索:
(1)PHP提供了Sphinx扩展,适用于Coreseek。
(2)phinx 安装包提供了sphinxapi,在api目录下。
我用的PHP扩展
sphinx搜索代码。参考代码如下所示:
public function getResultBySearchText($search_text) {
$sphinxClient = new \SphinxClient();
$sphinxClient->setServer('localhost', 9312); // server = localhost,port = 9312.
$sphinxClient->setMatchMode(SPH_MATCH_ANY);
$sphinxClient->setMaxQueryTime(5000); // set search time 5 seconds.
$result = $sphinxClient->query($search_text);
if(isset($result['matches'])) {
$rel['time'] = $result['time'];
$rel['matches'] = $result['matches'];
return $rel;
} else {
$rel['time'] = $result['time'];
return $rel;
}
}
因为用的xmlpipe数据源,所以返回的是文档id,还需根据id去mongo提取数据。至于如何提取mongo数据,我就不写了。
sphinx xmlpipe2 php,PHP+MongoDB+Coreseek/Sphinx打造搜索引擎相关推荐
- coreseek php接口,筹建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例...
搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例 一个文档包含了安装.增量备份.扩展.api调用示例,省去了查找大量文章的时间. 搭建cor ...
- mysql coreseek_centos+php+coreseek+sphinx+mysql之一coreseek安装篇
首先附上coreseek4.1版本下载 前期准备工作: yum install make gcc g++ automake libtool MySQL-client libMySQLclient15- ...
- LNMP+coreseek(sphinx+mmseg3)搭建全文索引库_sgk
前言,为什么要安装LNMP,这个环境以及把常用的MySQL+PHP搭建好了,初学者省去一部分精力调试错误,而且LNMP已经很稳定很成熟. 一. LNMP安装. 下载:http://lnmp.org/d ...
- [coreseek/sphinx学习笔记1]--简介
[参考Coreseek 全文检索服务器 2.0 (Sphinx 0.9.8)参考手册,详情见http://www.coreseek.cn/docs/sphinx_doc_zhcn_0.9.pdf] 1 ...
- php mmseg,coreseek+sphinx+mmseg中文分词安装
由于官网挂了,找资源 下载coreseek+sphinx+mmseg中文分词安装费了很多时间 开始是在github上一阵狂搜,找了几个都安装失败,后来在csdn上找到资源,一阵折腾之后安装成功 准备工 ...
- coreseek(sphinx)错误:WARNING: attribute 'id' not found - IGNORING原因及解决方法
这里有新鲜出炉的精品教程,程序狗速度看过来! coreseek(sphinx)错误:WARNING: attribute 'id' not found - IGNORING原因及解决方法 corese ...
- sphinx 项目根目录_如何使用Sphinx工具记录Django项目
sphinx 项目根目录 I recently visited a company where I had a nice talk with one of its employees. We talk ...
- sphinx 编码 php文档,用Sphinx编写技术文档
用Sphinx编写技术文档 大家会发现,如果一个项目主要是用Python写的,其文档都很类似,比如:Python在线的HTML官方手册.这些项目的文档都来源于一个很不错的项目:Sphinx.这个Sph ...
- 基于Sphinx构建准实时更新的分布式通用搜索引擎平台
亿级数据的高并发通用搜索引擎架构设计[原创] 大 | 中 | 小 [ 2008-12-9 08:47 | by 张宴 ] [文章作者:张宴 本文版本:v1.0 最后修改:2008.12 ...
最新文章
- 计算机应用主要设计到哪些方面,大学计算机应用基础教案设计.doc
- Swift3实现的绘制股票K线库, FastImageCache提升图片的加载和渲染速度,Chameleon颜色框架
- thinkpad 61系机器(T61 X61/X61S R61)休眠掉电问题解决办法
- Matlab周期图法使用FFT实现
- 接口应用小玩具-博客园积分排名变动监控工具
- POJ 3254 Corn Fields(状态压缩)
- ICCV 2017 CREST:《CREST: Convolutional Residual Learning for Visual Tracking》论文笔记
- 数据库开发——MySQL——索引原理
- 控件不响应点击事件解决办法
- 使用 Rxjs 解决 Angular Component 之间的通信问题
- redis源码剖析(四)跳表
- c++水平制表符怎么用_怎么才能把字写得好看一些?这四个方法用对了,水平会提升...
- UVA - 208 Firetruck
- php 上传图片转base64格式,PHP实现本地图片转base64格式并上传
- linux系统怎么关闭445端口,如何关闭window 系统的445端口等方法 预防勒索病毒
- 上海企业英语培训机构排名
- IDEA设置签名与导入主题
- 计算机c盘用户里的APPDATA,appdata是什么文件夹 C盘Appdata文件能不能删除?
- Java集合移除某个元素
- HG_REPMGR autofailvoer自动故障转移
热门文章
- deepin更新启动项_Deepin系统更新的两大方法
- 计算机专业方面的论文,计算机专业毕业论文
- OpenCV4每日一练day6:Image Watch的使用
- java中文件,java中文件操作大全
- 2020身高体重标准表儿童_2020上海1-12岁男女孩最新身高标准表,你家孩子达标了吗?...
- 华中科技大学计算机应用基础作业答案,《计算机应用基础》试题.doc
- Linux项目日报,1Password推出Linux版本 现已进入公开预览阶段
- sap中查询字段长度_SAP会计科目编码的层级说明
- scrapy python下载图片_使用Scrapy自带的ImagesPipeline下载图片,并对其进行分类。
- jsp中有比nbsp更好的吗_直线导轨有不锈钢的吗?雅威达告诉您