如何将搜索结果高亮

用sphinx做搜索,结果返回给php,碰到两个问题.一个是如何将搜索高亮.一个是如何将带有关键词的第一段内容截取. 高亮的问题,有了一个思路.首先要将搜索内容进行分词,然后通过正则匹配将分词后的关键词全部匹配,这样的话也不会影响整个关键词的高亮. 比如说,要搜索的关键词为:我爱你中国. 这里会将关键词分词为: 我 爱 你 中国. 如果在全文中有一段是: 我爱你中国,亲爱的母亲. 那么最后的结果就是: 中国,亲的母亲 其次,对于英文的高亮,需要能做到大小写不敏感,即关键词为大写时,全文内的匹配的相应小写也会高亮,而且不会被替换成关键词的大写. mmseg已经可以完美的进行分词了,那接下来的事情就比较简单了:

- 阅读剩余部分 -

sphinxapi.php 的一些注释.

sphinxapi.php 的一些注释.和sphinx的配置以及一些常规命令.做备忘.

<?php 

include_once 'sphinxapi.php';
$s = new SphinxClient();
$s->setServer("localhost", 9312);
$s->SetConnectTimeout ( 1 );//设置链接超时


/*
$s->AddQuery();//列表查询
$s->RunQueries ();//执行列表查询
$s->ResetFilters();//清除过滤条件
$s->BuildExcerpts($docs, $index, $words);//生成简要
$s->BuildKeywords($query, $index, $hits);//生成关键字
$s->GetLastError();//错误
$s->GetLastWarning();//警告
$s->FlushAttributes();//索引刷入硬盘
$s->IsConnectError();//链接错误
$s->ResetGroupBy();//重设分组
$s->SetFieldWeights(array('sub_title'=>1));//加权最小为1
$s->SetIDRange($min, $max);//ID范围
$s->SetIndexWeights(array('test1'=>1));//索引权重
$s->Status();//服务是否可用
$s->UpdateAttributes($index, $attrs, $values);//更新硬盘索引
*/
/*
参考文档:http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html#matching-modes
SPH_MATCH_ALL, matches all query words (default mode);
SPH_MATCH_ANY, matches any of the query words;
SPH_MATCH_PHRASE, matches query as a phrase, requiring perfect match;
SPH_MATCH_BOOLEAN, matches query as a boolean expression (see Section 5.2, “Boolean query syntax”);
SPH_MATCH_EXTENDED, matches query as an expression in Sphinx internal query language (see Section 5.3, “Extended query syntax”). As of 0.9.9, this has been superceded by SPH_MATCH_EXTENDED2, providing additional functionality and better performance. The ident is retained for legacy application code that will continue to be compatible once Sphinx and its components, including the API, are upgraded.
SPH_MATCH_EXTENDED2, matches query using the second version of the Extended matching mode.
SPH_MATCH_FULLSCAN, m
*/
$s->setMatchMode(SPH_MATCH_ANY);//匹配模式
$s->setMaxQueryTime(3);//查询超时
//$s->SetSelect ( $select );//设置返回的字段
/*
$cl->SetSelect ( "*, @weight+(user_karma+ln(pageviews))*0.1 AS myweight" );
$cl->SetSelect ( "exp_years, salary_gbp*{$gbp_usd_rate} AS salary_usd,
   IF(age>40,1,0) AS over40" );
$cl->SetSelect ( "*, AVG(price) AS avgprice" );
 */

/*
$cl->SetGroupBy ( "category", SPH_GROUPBY_ATTR, "@count desc" );
$cl->SetGroupDistinct ( "vendor" );
==
SELECT id, weight, all-attributes,
    COUNT(DISTINCT vendor) AS @distinct,
    COUNT(*) AS @count
FROM products
GROUP BY category
ORDER BY @count DESC
*/
//$s->SetGroupBy ( $groupby, SPH_GROUPBY_ATTR, $groupsort );//汇总
//$s->SetGroupDistinct ( $distinct );//设置不重复字段

$s->SetArrayResult ( true );//结果是否有ID

/*
    SPH_SORT_RELEVANCE mode, that sorts by relevance in descending order (best matches first);
    SPH_SORT_ATTR_DESC mode, that sorts by an attribute in descending order (bigger attribute values first);
    SPH_SORT_ATTR_ASC mode, that sorts by an attribute in ascending order (smaller attribute values first);
    SPH_SORT_TIME_SEGMENTS mode, that sorts by time segments (last hour/day/week/month) in descending order, and then by relevance in descending order;
    SPH_SORT_EXTENDED mode, that sorts by SQL-like combination of columns in ASC/DESC order;
    SPH_SORT_EXPR mode, that sorts by an arithmetic expression.
 */
//$s->SetSortMode ( SPH_SORT_EXTENDED, $sortby );//排序模式

/*
$s->SetOverride($attrname, $attrtype, $values);
$s->ResetOverrides();*/
/*
$s->SetRetries($count);//设置失败重试
$s->SetRankingMode($ranker);//设置排名模式 均适用于SPH_MATCH_EXTENDED2搜索

//第3个参数当为true时,相当于$attribute!=$value,默认值是false
$s->SetFilter ( 'target_type', $filtervals );//设置过滤,值列表
$s->SetFilterFloatRange($attribute, $min, $max);//浮动范围
$s->SetFilterRange($attribute, $min, $max);//指定范围
$s->SetGeoAnchor($attrlat, $attrlong, $lat, $long);
*/
//link
//$s->SetFilter ( 'target_type', array(1),true );


$s->SetLimits ( 0, 10 );//显示数量:开始 量 最大量 右偏移量
$result = $s->query("good","team");//查询


print_r($result);

 

- 阅读剩余部分 -

关于MYSQL触发器

- 阅读剩余部分 -

安装phpredis扩展以及phpRedisAdmin工具

看了网上一些教程,大多都有一些老旧,这里重新记录一下,其实都是大同小异. 先从phpredis的git拿到最新的源码包:

https://github.com/nicolasff/phpredis.git

然后进入目录:

cd phpredis

编译,安装扩展:

phpize
./configure --enable-redis
make && make install

然后编辑php.ini加入 extension = redis.so 重启服务器发现php提示缺少redis.so, Installing shared extensions: /usr/lib/php5/20090626/ 而我的extension目录是 : /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626 按照提示的目录把redis.so 拷贝过去就OK了.

- 阅读剩余部分 -

PHP实现进程间通信:信号量

上一篇说了一下在PHP中利用systemv的消息队列进行子进程间的数据通信,这里介绍一下另外一种进程通信的方法:利用信号量. UNIX的IPC主要分为两大块,由AT&T主张的 system V IPC 和由BSD 主张的 socket.显然这些都是很好的东西,所以Linux把他们都完美的继承了下来. 有一张图可以清晰地显示出Linux的IPC体系. 上图非原创,socket也可以进行进程通信,但是一般不这么做. 和上一篇一样,pcntl 和 sysvshm 模块是必须的.pcntl只支持Linux和Unix,所以只能在Linux下进行:

- 阅读剩余部分 -

PHP实现进程间通信:消息队列

实际上,在PHP开发过程中,对于消息队列的应用还是很广泛的。消息队列(message queue)也是Linux系统进程间通信的一种方式。 除了现有的一些消息队列解决方案以外,PHP对共享内存段的操作有两组函数:System V IPC和Shared Memory。 其中System V IPC由AT&T的贝尔实验室对早期的UNIX系统贡献而来,现在的linux系统都完美的继承了下来,该系列函数能够更方便的操作数据,无需像Shared Memory那样必须自己掌握读写时的偏移量、长度等,也不用序列化/反序列化来回转换(因为Shared Memory函数只支持字符串格式的数据参数)。但是System V IPC系列不支持Windows,所以如果要在win环境下使用,只能选Shared Memory。 PHP的System V msg模块是对Linux系统支持的System V IPC中的System V消息队列函数族的封装。我们需要利用sysvmsg模块提供的函数来进进程间通信。  

<?php 
$message_queue_key = ftok(__FILE__, 'a'); 
$message_queue = msg_get_queue($message_queue_key, 0666);
var_dump($message_queue);

$message_queue_status = msg_stat_queue($message_queue);
print_r($message_queue_status);

//向消息队列中写
msg_send($message_queue, 1, "Hello,World!");

$message_queue_status = msg_stat_queue($message_queue);
print_r($message_queue_status);

//从消息队列中读
msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT);
print_r($message."\r\n");

msg_remove_queue($message_queue); 
?>

由于System V IPC只支持linux类操作系统,以上演示请在linux中进行.

- 阅读剩余部分 -

记一次JQuery的跨站操作实现

公司项目里遇到的一个需求,由于美工将一个活动页面做在了另外的一个系统里,所以就涉及到JS的跨站操作 getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然,究其本质还是通过script标签动态加载js。 需要说明的是,getJSON利用的jsonp需要客户端与服务端作出配合。 客户端传递的URL里要包含callback变量,以形如callback=?的形式结尾。(jquery会随机生成一个字符串替换?传递给服务端) 服务端获取客户端传递的callback的值callbackValue,和需要传递的json字符串构成 callbackValue.’(’.json.’)'传回给客户端(示例为php字符串连接方式,其他语言类似) 这种方式实际上的流程是下面这样的:

- 阅读剩余部分 -