王者禁地-自己的生活自己主宰
面试之旅第四站
罗银有面试之旅第四站——未名
时间:2008-07-16 10:00 - 10:50
地点:上地嘉华大厦F座501
过程&&感受:本来早上是安排要去网际快车公司面试,可是还是因为距离(网际快车在建外SOHO),所以还是不得已选择了到这家公司的面试。打哪天偶不想住海淀了,距离将不再是个问题。
想想去年的某个时候俺到过F座,好像也是501,今天看来貌似记错了,上次的应该是601,反正那家公司在我印象中地位很差。
进了公司俺愣了一下,几台电脑,2排桌子,几个话务员……在同一间里面(汗,相信那些有电脑的员工工作的时候应该很受影响)。一贵州的哥们和我开始谈,才了解到公司是刚创业2个月,做基金股票之类的,他也是刚来一个多月。可能是年龄差距较少吧,很聊的开。听说他们经常加班,我点点头表示没啥意见。听说没合同,没社保,没住房公积金。我只能无语,没办法再继续,唉……,哦对了,没有牌子,都忘记问一下公司的名字是什么了。
- Comments: 1
- Trackbacks: 0
面试之旅第三站
罗银有面试之旅第三站——随锐科技集团
时间:2008-07-15 15:00 - 16:55
地点:学清路8号科技财富中心B座502
过程&&感受:
以为会堵车,早过去了会,所以在外面抽根烟顺便游荡一下。准时上去之后,怎么也看不出是集团的样子(可能最近视力有点下降)。简历没了,只好让他们下血本打印了一份。做笔试的地方也没有,只好借用了一下空的办公桌(-_-!)。
简要的笔试描述:
- 一张个人信息表
- 好几张思维逻辑题(20道。还别说,这些题很有意思,懒得打字,所以这里就不描述都是些什么题了。)
- 技术题【5道选择,2道简答,1道类的补充】,依稀记得这么几道题:传值与引用;不同php版本注意事项;接口编程及好处;登录类,cookie类等等
总结:这回还真做的不好,面谈的时候我还有点不好意思,嘿嘿。没办法啊,毕竟笔试还是没感觉。最后砍了一下工资(砍偶近2K),也只能说考虑考虑了。虽然是集团,感觉企业文化不够好~~~回了,第三站到此结束。现在没投简历也就抱着随便逛逛,随便看看的心态。休息休息等我自己去投简历找公司D时候再多注意注意吧……
- Comments: 1
- Trackbacks: 0
面试之旅第二站
罗银有面试之旅第二站——中国新闻社
时间:2008-07-15 10:00 - 10:45
地点:甘家口百万庄南街12号中国新闻社6楼
过程&&感受:
啥也别说,眼泪哗哗,都快跑到北京西客站了。可能是因为前一天晚上在“正宗东北菜”馆吃了一顿饭之后,早上的坐车简直就是煎熬,实在不行了,只好在白石桥南下车,还想在外头找“家”公厕,造物弄人啊。没办法,去了旁边的电工设备总公司大楼解决了煎熬的问题。继续前往新闻社,虽然到甘家口这很多次了,不过还是走反了,又绕了一圈,终于找到了陈旧的新闻社大楼。经过保安的身份确认之后顺利上电梯,低着头见电梯开了就直接出去,没想到才三楼(注:TNND,有人提醒偶了,但没注意听),爬楼梯~~
到了,见了一位PLMM(*_*)。看上去他们的办公电脑还是那么地悠久(-_-!),没有做试题之类的,把俺唯一打印一份较完整的简历递给“和蔼可亲”的赵 ~~先生之后开始一些杂边及技术上的交谈。听说老总还是福建老乡,很多员工也是福建的~~~
总结:依我看来,结果应该比较满意,面试人比较特别(和电视上的记者在采访的时候咄咄逼人那种真的是一个在天,一个在地~~~),只是我的工作年限并不长,要砍俺1K的工资,俺考虑到居住地离他们也很远(公交线21公里),只好遗憾地说考虑考虑。
- Comments: 1
- Trackbacks: 0
电脑病毒26岁了
- 2008-07-13 (Sun)
- 杂七杂八的
7月13日,电脑病毒26岁的“生日”。
第一个计算机病毒Elk Cloner,是美国匹兹堡一位高中生的恶作剧,恐吓的色彩并不严重。它主要骚扰不知情的Apple II用户,使对方的电脑屏幕显示出这样一首短诗:
It will get on all your disksIt will infiltrate your chips
Yes it’s Cloner! …(
这一年,是1982年。IBM的个人电脑刚刚诞生一年(针对PC的病毒,直到1986年才突然出现)。世界各国的科学和商业机构普遍还没有应用电脑,而计算机用户基本上是某些特定用户和技术发烧友,他们用软盘来交换文件。
从这个令人厌恶的“良性”病毒Cloner开始,电脑病毒在25年内经过了爆炸式发展,在世界各地迅速传播。尤其是互联网兴起之后,联入网络的PC和笔记本电脑都显得脆弱不堪,非常容易被恶意软件攻破,而恶意软件也从最初的小孩子的恶作剧,发展成一个巨大的产业。
全球为防治恶意软件而花费的金钱,已经无可估量。但按照美国普渡大学的计算机专家Eugene Spafford的估计,每年因恶意软件造成的直接损失,应该在几百亿到几千亿美元之间。
和最初的病毒、蠕虫(与病毒相似的程序)类似,今天的恶意软件通过电子邮件附件、网页和直接攻击等形式,将自己复制到毫无防备的电脑中。但和之前单纯破坏电脑系统不同,现在的恶意软件会监控用户对键盘的使用,获得社会保险的号码,或利用这台电脑发送那些教授人暴富秘诀的垃圾邮件。通过这些程序,攻击者甚至可以遥控被感染的电脑。
老式的恶意软件,大多是吹嘘自己的技术,在互联网网页上挂出一幅头条新闻来炫耀。2003年初,SQL Slammer蠕虫病毒使全球的网络出现故障,网速近乎于“爬行 ”。Spafford表示,新的恶意软件往往出于获取经济收益的动机,它更为狡猾,更像一条寄生虫。它也会造成伤害,但“它不会‘杀死’主机,因为这同样会杀死它自己。”
发表在《科学》上的一篇评论中,Spafford和佛罗里达理工学院(the Florida Institute of Technology)的计算机科学家Richard Ford发出警告:病毒正在侵蚀其他领 域——手机、家用电子产品日趋智能化,而且开始联接成网络,这正是病毒的新乐园。原则上,病毒利用漏洞,通过蓝牙无线网络在手机间传播。“手机病毒已经不是杞人忧天了,”研究者再次强调。
目前,恶意程序导致的后果是多方面的,也就无法用简单的方式来解决,并有可能不断变种,导致情况越来越糟糕。“大量的问题,其实是和人性有关。” Spafford表示,消费者要求电脑的功能越来越多、越来越强大,给病毒和僵尸提供的藏匿空间也就越来越大。电脑和软件应该配置相关工具,帮助它们更好抵御恶意软件,但人们常常会关掉防火墙去玩游戏。
美国一个国家研究委员会发表了他们的报告,呼吁各界投入更多精力和财力,来研究如何改善网络安全相关技术和政策。Spafford表示,未来十年内,如果这个计划受到持续关注的话,政府机构和产业界的协同努力,有望遏制恶意软件的增长速度。
早期计算机病毒发展史
早在1949年,距离第一部商用计算机的出现还有好几年时,计算机的先驱者冯.诺依曼在他的一篇论文《复杂自动机组织论》,提出了计算机程序能够在内存中自我复制,即已把病毒程序的蓝图勾勒出来,但当时, 绝大部分的计算机专家都无法想象这种会自我繁殖的程序是可能的,可是少数几个科学家默默地研究冯.诺依曼所提出的概念,直到十年之后,在美国电话电报公司(AT&T)的贝尔实验室中,三个年轻程序员道格拉斯.麦耀莱、维特.维索斯基和罗伯.莫里斯在工余想出一种电子游戏叫做”磁芯大战”。
1975年,美国科普作家约翰.布鲁勒尔写了一本名为《震荡波骑士》的书,该书第一次描写了在信息社会中,计算机为正义和邪恶双方斗争的工具的故事,成为当年最佳畅销书之一。 1977年夏天,托马斯.捷.瑞安的科幻小说《P-1的青春》成为美国的畅销书,轰动了科普界。作者幻想了世界上第一个计算机病毒,可以从一台计算机传染到另一台计算机,最终控制了7000台计算机,酿成了一场灾难, 这实际上是计算机病毒的思想基础。 1983年11月3日,弗雷德.科恩博士研制出一种在运行过程中可以复制自身的破坏性程序,伦.艾德勒曼将它命名为计算机病毒,并在每周一次的计算机安全讨论会上正式提出,8小时后专家们在VAX11/750计算机系统上运行, 第一个病毒实验成功,一周后又获准进行5个实验的演示,从而在实验上验证了计算机病毒的存在。
1983年月11月,美国计算机安全专家费雷德博士研制出一种能够自我复制的计算机程序,随后该程序在VAX/11机上进行了攻击试验,并获成功,第一例计算机病毒就此诞生了。随着世界范围内计算机系统的迅速普及,这一技术被众多的计算机应用人员、计算机爱好者等滥用,并不断发展,到了80年肛中后期,这一技术遂步成熟,最终造成了计算机病毒在世界范围内的大肆泛滥。
1986年巴基斯坦有兄弟两人为追踪非法盗版者而编制了Brain(大麻)病毒,同年,10月在美国本土出现该病毒,并以强劲的势头蔓延,PC开始有了病毒。
1988年11月2日美国康奈尔大学一年级研究生罗伯特.莫里斯(R.morris)制作了一个蠕虫计算机平素(Tap Worm),并将其投入美国Internet计算机网络,许多联网机被迫停机,直接损失达9600万美元。莫里斯也因此受到法律制裁。
1988年我国发现首例计算机病毒Pingpang(乒乓病毒)。
1990年在美国出现第一例多形性病毒260病毒,又称幽灵病毒、千面人病毒,而在保加利亚出现用于病毒交换的VXBBS。
1991年初欧洲出现病毒编写小组和俱乐部,如米兰的意大利人病毒研究实验室,英、美、澳等国家也先后成立了这样的组织。同年6月出现了第一本病毒杂志——40-HEX。
1992年初由国外传入我国的一种危害性圈套的文件型病毒DIR-II,其传染速度、传播范围及其隐蔽性堪称当时已发现的病毒之最。这是继莫里斯事件之后的第二起重大病毒。同年还出现了第一个能把普通病毒改造成多形病毒的变形引擎MTE。8月份,出现了第一个病毒开发软件包。同年还有人开始出售病毒软件包,黑色星期五、米开朗基罗等病毒也在国内外广泛流行。
1993年美国财政一个BBS站上存放着几百个病毒原代码,引起了国际舆论的批评。1993年到期994年多形性病毒越来越多,越来越容易编写,有许多病毒开发软件包能直接生成多形病毒。
1995年幽灵病毒流行中国,6月份国际上出现第一个感染数据文件的宏病毒。
1998年台湾大同工学院学生刘盈豪编制了CIH病毒,6月份首先在台湾流行,此后通过网络,相继在澳大利亚、瑞士、荷兰、俄罗斯等国流行,同年8月此病毒传入我国内地,很多计算机用户的机器受到破坏,影响了计算机信息系统的安全运行。CIH病毒是迄今为止破坏性最严重的病毒,也是世界上首例破坏硬件的病毒。它发作时不仅破坏硬盘的引导区和分区表,而且破坏计算机系统FIASHBIOS芯片中的系统程序,导致主板损坏。目前该病毒已有三个版本,即1.2、1.3、1.4,发作日期是4月26日,6月26日和每月26日。
计算机病毒26岁了!
- Comments: 0
- Trackbacks: 0
面试之旅第一站
现在省点时间,先整理了新的面试之旅。
罗银有面试之旅第一站——CNET中国
时间:2008-07-10 17:40 - 19:00(离职前一天晚上)
地点:海淀剧院旁银网中心A座9层
过程&&感受:首先进去见到了两位前台小姐,态度不咋地,卫生不咋地(可能因为设计或楼层悠久?看起来不是很干净的种),在9层填写了一张个人信息的单子后上10层。
试题:
笔试部分大概有
- mysql显示当前时间【now()】,时间格式化函数【date_format】
- php打印前一天的时间【echo date(’Y-m-d’,strtotime(”-1 day”));】
- mysql优化
- MVC认识
- mysql:类别表、产品表、点击数,显示所有的类别名称和产品名称,显示点击数前十名的产品
- 访问量大的解决方法
- 版本控制系统
- include和require的区别
- error_reporting有哪些级别
总结:除了第五题可能是他们自己出的,别的网上应该都见多了。都很基础很简单。
非笔试题(面谈):
- MVC理解哪些
- 数据库全文检索
- 数据库缓存,存储等
- 数据库优化
- javascript类库
- ajax了解多少都用在哪些方面
- XML读取方式
- php缓存
- 海量数据的优化
- apache模块(如:mod_rewrite等等)
- linux的shell编程
- 谈SEO
- 对CNET的了解
- 介绍一下自己的工作方面的情况及当前的薪资等
总结:shell编程还是弱点,apahce的模块还是要多多学习,数据库缓存,还是有很多知识不过关。
以上为CNET之行。所涉及的知识如果你还没好好掌握,希望一起学习,也希望上面的信息对你有所帮助。
- Comments: 0
- Trackbacks: 0
正式离职
- 2008-07-11 (Fri)
- 一点点想法
嘿嘿,又离职了,很惊讶?NO!很遗憾?NO!
离职心切,不得不把早上的面试给取消。早上终于把离职申请单让各级领导签完,整理了一下东西,将之前的文档打包发过去就算完事,还好之前有稍微准备了一下。下周就不来上班了,哇哈哈哈。又爽了一下下。
中午订的饭依旧那么难吃,不过将就一下。
昨天下班后去CNET中国面试了一下,改天心情更好D时候把php面试试题发出来参考参考。要开始新的一轮面试了,不过这次要慢慢找了,除非新的公司令偶很满意才去上班,要不然就呆在屋里玩游戏,嘿嘿……
开始记录我的面试生涯,与大家分享每家公司的面试试题(CNET面试题改天补上)。下一家公司-维科德信(飞信)公司,不过因为距离有可能懒得去……
- Comments: 6
- Trackbacks: 0
用php开发的web服务器
- 2008-07-04 (Fri)
- php
Nanoweb 是一个旨在小、安全、可扩展的、使用php开发的HTTP服务器。
主要特点有:
遵循HTTP/1.1
模块化架构
代理服务器扩展
……
以下为官方原文:
Nanoweb is an HTTP server written in PHP, designed to be small, secure, and extensible.GNU General Public License.
It is distributed under the terms of the
Nanoweb’s main features are :
- HTTP/1.1 compliance
- Powerful and easy configuration
- Modular architecture
- FastCGI, CGI and Server side includes support
- Name and port based virtual hosts
- Access control lists
- htpasswd, MySQL, PostgreSQL and LDAP authentication support
- Themes for server generated content
- Apache compatible log format, MySQL logging
- Directory browsing
- inetd support and SSL via external helpers
- Denial of Service protection
- Proxy Server extension
- Filters and gzip support
- RBL support (mail-abuse.org)
- Extension Protocols (request methods) support
- … and a lot moreWhy should you use it ?
It’s light, fast and robust
Also being written in PHP makes it very easily extensible with custom modules, and secure because - running inside the Zend scripting engine - it’s immune to a number of common security threats (format strings, buffer overflows, …).Thanks to its very modular architecture, Nanoweb can also be used as a framework to develop your own standalone web based applications
从http://nanoweb.si.kz/downloads/dist/下载Nanoweb并解压,执行install-sh即可。
- Comments: 0
- Trackbacks: 0
每位php开发人员应该好好利用的十个项目
- 2008-07-03 (Thu)
- php
1. 发送邮件 phpmailer
2. 管理用户 Php user class
3. 抓取RSS摘要 Magpie RSS
4. 获取访问者的地理信息 Maxmind
5. 获取远程内容 htmlSQL class
6. Trackback php trackback
7. 模板系统,当然就是Smarty 了
8. BBcode StringParser_BBcode class
9. Paypal 支付集成 paypal IPN integration class
10. 编辑器控制 tinyMCE control
以下为英文原文:
As a php web developer, you should know that php is probably the language that has the biggest code repository. So no matter what module you want to include in your project there should be an open source solution.
This can help in various ways, but just in case you can’t think of one, here I put a few :
- Open source is worked by many people, so the result is for sure better than one man’s work
- You can have free updates to your code, while otherwise you should code the updates each time something new comes up
- You save development time while your project is getting better
Anyway, after many years as a web developer, I’ve compiled a list of php classes that can be easily integrated in any project and I am regularly use.Sending Emails
Sending emails is something very common for every web site. Php’s mail() function is good for this, but what if you want to attach a file, or send through an SMTP server, etc? Well in that case you should use phpmailer
User Manipulation
Another common module is the user module. With that you can manipulate users (login, logout, register, etc.) Personally I’ve never found a project that is good enough, so I created my own
Php user class is a module that can be used even in established projects, as it uses variable data for database tables, fields, session variables, etc.
Fetching RSS Feeds
Ever wanted to fetch an rss feed from your project? Well there is always an easy way to fetch a feed but in most cases you need more than that. When that is the case you should definitely use Magpie RSS
Geotargeting
There are many times that you need to know where are your visitors coming from. Maxmind gives a solution to this. For a complete tutorial check this article
Grabbing Remote Content
Some times RSS is not enough so you need to grab the content of a web page and parse it. If you are a huge fun of preg you should not continue reading, but if you are not you definitely need the htmlSQL class The htmlSQL class allow you to access html values with SQL code. Nice huh?
Trackback
Sending and receiving trackbacks is vital for a web site in our age. And in fact it is very easy if you are using a class like php trackback
Template System
Another thing that all sites use is a template. A template engine can save you lots of time, while it can make display changes very easy. A complete template engine that most projects use is Smarty
BBcode
BBcode used to be a functionality for forums, but as more and more sites use it in order to be more friendly to their users, you might want to use BBcode to your site. The problem is that BBcode requires a lot of coding and I am not sure if you have the time for this. If you don’t you’ll find StringParser_BBcode class very useful
Paypal Payment Integration
As you may know paypal has a nice API for developers who want to integrate paypal payments in their sites. The paypal IPN integration class helps you make use of it and start accepting payments in 20 minutes.
Editor Controls
I don’t have a problem to make changes to a site using phpMyAdmin or a simple text area, but when it comes to my clients I have to give them more than that. A javascript WYSIWYG editor is a perfect solution but as it requires countless hours to get it done I would suggest you to use the tinyMCE control
Hope you enjoyed this list. If I forgot something feel free to comment above .
- Comments: 0
- Trackbacks: 1
全文检索之Sphinx速成指南
1. Sphinx简介
1.1. 什么是全文检索
全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术。检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容。
1.2. 介绍
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。
1.3. Sphinx的特性
高速索引 (在新款CPU上,近10 MB/秒);
高速搜索 (2-4G的文本量中平均查询速度不到0.1秒);
高可用性 (单CPU上最大可支持100 GB的文本,100M文档);
提供良好的相关性排名
支持分布式搜索;
提供文档摘要生成;
提供从MySQL内部的插件式存储引擎上搜索
supports boolean, phrase, and word proximity queries;
支持每个文档多个全文检索域(默认最大32个);
支持每个文档多属性;
支持断词;
支持单字节编码与UTF-8编码;
supports English stemming, Russian stemming, and Soundex for morphology;
支持MySQ(MyISAM和InnoDB 表都支持);
支持PostgreSQL.
2. Sphinx安装(For MySQL)
2.1. Windows下安装
从http://dev.mysql.com上下载MySQL5.0.45版安装配置好MySQL,采用utf-8字符集
从Sphinx官网上http://www.sphinxsearch.com/downloads.html下载mysql-5.0.45-sphinxse-r871-win32.zip和sphinx-0.9.8-svn-r985-win32.zip
如果您的MySQL服务已启动请先停止掉
解压mysql-5.0.45-sphinxse-r871-win32.zip,将里面bin与share目录覆盖掉你的mysql安装目录下的相应目录
解压sphinx-0.9.8-svn-r985-win32.zip ,将里面的文件解压到D:\sphinx
sphinx的配置与实际应用是相关的,因此以下我以例子进行说明,至此sphinx安装部分结束
2.2. Linux下安装
下载mysql-5.1.22-rc.tar.gz解压至/root/mysql-5.1.22
下载sphinx-0.9.8-svn-r985.tar.gz,解压至/root/sphinx-0.9.8-svn-r985
将/root/sphinx-0.9.8-svn-r985/mysqlse下的文件复制至/root/mysql-5.1.22/storage/sphinx
在/root/mysql-5.1.22目录下运行
-
sh BUILD/autorun.sh
-
./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all \
-
--enable-thread-safe-client --enable-assembler --with-readline --with-big-tables \
-
--with-plugins=sphinx
-
make && make install
-
groupadd mysql
-
useradd –g mysql mysql
-
chown mysql:mysql /usr/local/mysql -R
-
cd /usr/local/mysql
-
bin/mysql_install_db –user=mysql
-
(此时系统可能会提示:
-
[Warning] Storage engine 'SPHINX' has conflicting typecode. Assigning value 42.
-
可忽略,不影响使用)
-
cp /root/mysql-5.1.22/support-files/mysql.server /etc/init.d/mysqld
-
chmod 700 /etc/init.d/mysqld
-
cp /root/mysql-5.1.22/support-files/my-medium.cnf /etc/my.cnf
-
/etc/init.d/mysql start
-
(至些mysql启动了)
然后进入mysql命令行,运行show engines,看是不是有一个叫sphinx的engine,有的话就表示sphinxSE(mysql的sphinx引擎)安装正常了
进入/root/sphinx-0.9.8-svn-r985,运行
-
ldconfig /usr/local/mysql/lib/mysql
-
ldconfig /usr/local/mysql/include/mysql
-
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql
-
make && make install
3. 实例说明
为更好说明如何应用Sphinx,现结合实例说明,我们以网站的新闻文章表为例。我们想要对新闻文章表进行全文检索(主要是标题与内容),新闻文章表的相关信息如下:
-
CREATE TABLE `eht_articles` (
-
`ARTICLESID` int(11) NOT NULL AUTO_INCREMENT,
-
`TITLE` varchar(100) NOT NULL DEFAULT '',
-
`TITLECOLOR` varchar(20) DEFAULT NULL,
-
`AUTHOR` varchar(200) DEFAULT NULL,
-
`COMEFROM` varchar(200) DEFAULT NULL,
-
`KEYWORD` varchar(200) DEFAULT NULL,
-
`HTMLURL` varchar(200) DEFAULT NULL,
-
`CATALOGID` int(6) DEFAULT NULL,
-
`CONTENTS` mediumtext,
-
`EDITUSERID` int(6) DEFAULT NULL,
-
`ADDTIME` int(10) DEFAULT NULL,
-
`UPDATETIME` int(10) DEFAULT NULL,
-
`HITS` int(6) DEFAULT NULL,
-
PRIMARY KEY (`ARTICLESID`)
-
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
在这个表中,我主要想对标题(TITLE)与内容(CONTENTS)字段进行全文检索,在检索过程中可能我会根据文章的栏目(CATALOGID),编辑(EDITUSERID),时间段(ADDTIME)进行条件性的全文检索,然后可能会根据主键ID(ARTICLESID),人气(HITS)进行排序显示,如何配置Sphinx来实现呢?
4. Sphinx配置
sphinx是以sphinx.conf为配置文件,索引与搜索均以这个文件为依据进行,要进行全文检索,首先就要配置好sphinx.conf,告诉sphinx哪些字段需要进行索引,哪些字段需要在where,orderby,groupby中用到。
安装完Sphinx后,在D:/sphinx目录有一个sphinx.conf.in,这个相当于sphinx的配置例子文件,我们以这个文件为蓝本,重新创建一个空白内容的sphinx.conf,存放在d:/sphinx根目录。
sphinx.conf的内容组成
source 源名称1{
…
}
index 索引名称1{
source=源名称1
…
}
source 源名称2{
…
}
index 索引名称2{
source = 源名称2
…
}
indexer{
…
}
searchd{
…
}
提示:从组成我们可以发现sphinx可以定义多个索引与数据源,不同的索引与数据源可以应用到不同表或不同应用的全文检索。
根据前面的实例,我们配置出我们需要的sphinx.conf,如下:
-
source cgfinal
-
{
-
type = mysql
-
strip_html = 0
-
index_html_attrs =
-
sql_host = localhost
-
sql_user = root
-
sql_pass = admin
-
sql_db = test
-
sql_port= 3306 # optional, default is 3306
-
sql_query_pre= SET NAMES utf8
-
-
sql_query = SELECT ARTICLESID,TITLE,CONTENTS,AUTHOR,CATALOGID,ADDTIME,EDITUSERID,\
-
HITS FROM a.eht_news_articles
-
#sql_query = SELECT * FROM a.eht_news_articles
-
sql_attr_uint= CATALOGID
-
sql_attr_uint= EDITUSERID
-
sql_attr_uint = HITS
-
sql_attr_timestamp = ADDTIME
-
-
sql_query_post =
-
sql_ranged_throttle= 0
-
#sql_query_info = SELECT * FROM a.eht_news_articles WHERE ARTICLESID=$id
-
}
-
index cgfinal
-
{
-
source = cgfinal
-
path = d:/sphinx/data/cgfinal
-
docinfo = extern
-
mlock = 0
-
morphology = none
-
stopwords =
-
min_word_len = 1
-
charset_type = utf-8
-
charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z,\
-
A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6,\
-
U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101,\
-
U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109,\
-
U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F,\
-
U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, \
-
U+0116->U+0117,U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D,\
-
U+011D,U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, \
-
U+0134->U+0135,U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, \
-
U+013C,U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, \
-
U+0143->U+0144,U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, \
-
U+014B,U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, \
-
U+0152->U+0153,U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159,\
-
U+0159,U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, \
-
U+0160->U+0161,U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, \
-
U+0167,U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, \
-
U+016E->U+016F,U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175,\
-
U+0175,U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, \
-
U+017B->U+017C,U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, \
-
U+0430..U+044F,U+05D0..U+05EA, U+0531..U+0556->U+0561..U+0586, U+0561..U+0587, \
-
U+0621..U+063A, U+01B9,U+01BF, U+0640..U+064A, U+0660..U+0669, U+066E, U+066F, \
-
U+0671..U+06D3, U+06F0..U+06FF,U+0904..U+0939, U+0958..U+095F, U+0960..U+0963, \
-
U+0966..U+096F, U+097B..U+097F,U+0985..U+09B9, U+09CE, U+09DC..U+09E3, U+09E6..U+09EF, \
-
U+0A05..U+0A39, U+0A59..U+0A5E,U+0A66..U+0A6F, U+0A85..U+0AB9, U+0AE0..U+0AE3, \
-
U+0AE6..U+0AEF, U+0B05..U+0B39,U+0B5C..U+0B61, U+0B66..U+0B6F, U+0B71, U+0B85..U+0BB9, \
-
U+0BE6..U+0BF2, U+0C05..U+0C39,U+0C66..U+0C6F, U+0C85..U+0CB9, U+0CDE..U+0CE3, \
-
U+0CE6..U+0CEF, U+0D05..U+0D39, U+0D60,U+0D61, U+0D66..U+0D6F, U+0D85..U+0DC6, \
-
U+1900..U+1938, U+1946..U+194F, U+A800..U+A805,U+A807..U+A822, U+0386->U+03B1, \
-
U+03AC->U+03B1, U+0388->U+03B5, U+03AD->U+03B5,U+0389->U+03B7, U+03AE->U+03B7, \
-
U+038A->U+03B9, U+0390->U+03B9, U+03AA->U+03B9,U+03AF->U+03B9, U+03CA->U+03B9, \
-
U+038C->U+03BF, U+03CC->U+03BF, U+038E->U+03C5,U+03AB->U+03C5, U+03B0->U+03C5, \
-
U+03CB->U+03C5, U+03CD->U+03C5, U+038F->U+03C9,U+03CE->U+03C9, U+03C2->U+03C3, \
-
U+0391..U+03A1->U+03B1..U+03C1,U+03A3..U+03A9->U+03C3..U+03C9, U+03B1..U+03C1, \
-
U+03C3..U+03C9, U+0E01..U+0E2E,U+0E30..U+0E3A, U+0E40..U+0E45, U+0E47, U+0E50..U+0E59, \
-
U+A000..U+A48F, U+4E00..U+9FBF,U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF, \
-
U+2F800..U+2FA1F, U+2E80..U+2EFF,U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF, \
-
U+3040..U+309F, U+30A0..U+30FF,U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF, \
-
U+3130..U+318F, U+A000..U+A48F,U+A490..U+A4CF
-
min_prefix_len = 0
-
min_infix_len = 1
-
ngram_len = 1
-
-
ngrams_chars = U+4E00..U+9FBF, U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF,\
-
U+2F800..U+2FA1F, U+2E80..U+2EFF, U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF,\
-
U+3040..U+309F, U+30A0..U+30FF, U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF,\
-
U+3130..U+318F, U+A000..U+A48F, U+A490..U+A4CF
-
}
-
indexer
-
{
-
mem_limit = 32M
-
}
-
searchd
-
{
-
# address = 0.0.0.0
-
port = 3312
-
log = d:/sphinx/log/searchd.log
-
query_log = d:/sphinx/log/query.log
-
read_timeout = 5
-
max_children = 30
-
pid_file = d:/sphinx/log/searchd.pid
-
max_matches = 1000
-
seamless_rotate = 1
-
}
相关配置项说明:
Source部分配置项说明
#type 数据库类型,目前支持mysql与pgsql
#strip_html 是否去掉html标签
#sql_host 数据库主机地址
#sql_user 数据库用户名
#sql_pass 数据库密码
#sql_db 数据库名称
#sql_port 数据库采用的端口
#sql_query_pre 执行sql前要设置的字符集,用utf8必须SET NAMES utf8
#sql_query 全文检索要显示的内容,在这里尽可能不使用where或group by,将where与
groupby的内容交给sphinx,由sphinx进行条件过滤与groupby效率会更高
#注意:select 出来的字段必须至少包括一个唯一主键(ARTICLESID)以及要全文检索的
字段,你计划原本在where中要用到的字段也要select出来
#这里不用使用orderby
#sql_attr_开头的表示一些属性字段,你原计划要用在where,orderby,groupby中的字段要
在这里定义
#根据我们原先的SQL:
-
#select * from eht_articles where title like ? and catalogid=? And edituserid=? \
-
AND addtime BETWEEN ? AND ? ORDER BY hits DESC
#我们需要对catalogid,edituserid,addtime,hits进行属性定义(这四个字段也要在select的
字段列表中),定义时不同的字段类型有不同的属性名称,具体可以见sphinx.conf.in中的说明
index部分配置项说明
#source 数据源名
#path 索引记录存放目录,如d:/sphinx/data/cgfinal,实际存放时会存放在d:/sphinx/data目
录,然后创建多个cgfinal名称,不同扩展名的索引文件。
#其他的配置如min_word_len,charset_type,charset_table,ngrams_chars,ngram_len这些则是支
持中文检索需要设置的内容。
#如果检索的不是中文,则charset_table,ngrams_chars,min_word_len就要设置不同的内容,具
体官方网站的论坛中有很多,大家可以去搜索看看。
5. 运行Sphinx
首先要对数据进行索引或重建索引
进入命令行,运行d:/sphinx/bin/release/indexer --config d:/sphinx/sphinx.conf cgfinal
如果您在sphinx.conf中配置了多个数据源,想一次性全部索引则d:/sphinx/bin/release/indexer --config d:/sphinx/sphinx.conf --all
如果只是想对某个数据源进行索引,则d:/sphinx/bin/release/indexer --config d:/sphinx/sphinx.conf 索引名称(这里的索引名称是你在sphinx.conf中定义的索引名称)
运行检索守护进程searchd进入命令行,运行d:/sphinx/bin/release/searchd --config d:/sphinx/sphinx.conf,此时系统会在3312端口侦听mysql的全文检索请求,所以如果您的mysql与sphinx不在同一台机器,要保证3312端口不被防火墙阻隔。
6. 搜索(翻译)
6.1. 匹配模式
SPH_MATCH_ALL,匹配所有查询词(缺省模式)
SPH_MATCH_ANY,匹配任意查询词
SPH_MATCH_PHRASE,短语匹配
SPH_MATCH_BOOLEAN,布尔表达式匹配
SPH_MATCH_EXTENDED,查询匹配一个Sphinx内部查询语言表达式
6.2. 布尔查询语法(Boolean query syntax)
布尔查询允许使用下面特殊操作符:
AND:hello & world
OR:hello | world
NOT:hello -world或hello !world
Grouping:(hello world)
举一个使用这些操作符的例子:
( cat -dog ) | ( cat -mouse)
AND是一个隐式操作符,“hello world”就相当于“hello & world”。
OR的优先级高于AND,所以“looking for cat | dog | mouse”的意思是“looking for (cat | dog | mouse)”而不是“(looking for cat) | dog | mouse”
象“-dog”这种隐式地包含了所有查询记录,是不会被执行的。这主要是考虑到技术上与性能上的原因,从技术上来说,sphinx不能总保持所有文章的ID列表,性能上来说,当结果集巨大(10-100M),执行这样的查询将费耗较长时间。
6.3. 扩展查询语法(Extended query syntax)
扩展查询允许合我下面特殊操作符:
操作符OR:hello | world
操作符NOT:hello -world或hello !world
字段搜索操作符:@title hello @body world
短语(phrase)搜索符:"hello world"
临近(proximity)搜索符:"hello world"~10
举例:
"hello world" @title "example program"~5 @body python -(php|perl)
AND是一个隐式操作符,"hello world"表示hello与world都要出现在匹配的记录中。
OR的优先级高于AND,所以“looking for cat | dog | mouse”的意思是“looking for (cat | dog | mouse)”而不是“(looking for cat) | dog | mouse”
临近距离在串中标明了,主要是用来调整单词数量,应用在引号中的所有查询字串。"cat dog mouse"~5表示包括这三个单词在内,总共不能多于8个单词的间隔。比如"CAT aaa bbb ccc DOG eee fff MOUSE"就不能匹配这个查询,因为单词间隔刚好是8个。
象aaa | ( bbb ccc | ( ddd eee ) )这样的括号嵌套查询目前还不支持,但以后会修正的。
否定(如NOT)只允许出现在顶层,不允许出现在括号内(如groups)。这点是不会改变的。因为支持否定嵌套查询会让短语排序(phrase ranking)的实现变得过于复杂。
6.4. 权重(匹配度,Weight)
采用什么权重功能取决于搜索模式(Search mode)
在权重函数中,有两个主要部分:(短语排名)phrase rank和statistical rank(统计排名)
短语排名是基于搜索词在文档和查询短语中的最长公共子序列(LCS)的长度。所以如果在记录中有切确的短语匹配,记录的短语排名将有可能是最高的,等于查询单词的总个数。
统计排名是建立在经典的BM25算法基础之上,它只考虑词频。词在全部文档集合中以低的频度出现或高频度出现在匹配的文档中,那么它获得的权重就越大,最终的BM25权重是一个介于0到1之间的小数。
好的子短语匹配得到好的排名,最好的匹配放到最顶端。Sphinx作者的经验是:基于排名的密切短语比其它任何单独的统计方式表现出较好的搜索质量。
在SPH_MATCH_BOOLEAN 模式中,不需要计算权重,每条匹配记录的权重都是1
在SPH_MATCH_ALL和SPH_MATCH_PHRASE模式中,最终的权重是短语排名权重的总和
(TOFIX:翻译不畅)在SPH_MATCH_ANY模式中,本质上是一样的,但它也增加了每个字段的匹配单词数量,在这之前,短语排名权重乘以一个足够大的值以保证在任意一个字段的较高短语排名可以匹配排名较高者,即使它的字段权重比较低。
在SPH_MATCH_EXTENDED模式中,最终的权重是短语权重和BM25权重的总和,再乘以1000取整。
7. 如何调用Sphinx
按上面配置,第5节点对数据库进行了索引,通过Sphinx自带的search(在bin/release目录)就可以在命令行进行搜索:
-
(搜索CGArt)
-
windows上:
-
search -c d:/sphinx/sphinx.conf CGArt
-
Linux上:
-
cd /usr/local/sphinx
-
./bin/search -c sphinx.conf CGArt
-
运行后,系统提示一堆信息:
-
....
-
....
-
words:
-
1. 'cgart': 36 documents, 189 hits
-
这个表示库中有36条记录符合要求,出现CGArt的有189处。
应用程序如果想调用Sphinx,可以从两个方面:
一是通过Sphinx官方提供的API接口(接口有Python,Java,Php三种版本)
二是通过安装SphinxSE(具体见1.2部分),然后创建一个中介sphinxSE类型的表,再通过执行特定的SQL语句实现。
通过官方API调用Sphinx(以PHP为例)在sphinx安装目录有一个API目录,里面有三个PHP文件:test.php,test2.php和sphinxapi.php。sphinxapi.php是sphinx调用接口封装文件,test.php是一个在命令行下执行的查询例子文件,test2.php是一个生成摘要的例子文件。
在命令下行运行test.php(Linux上没有API目录,需要从源程序包中复制api目录至/usr/local/sphinx)
-
Windows上:
-
D:\sphinx\bin\release>c:\php5.2\php.exe -c c:\php5.2\php.ini ..\..\api\test.php -i cgfinal CGart
-
Linux上(php在/usr/local/php目录,sphinx.conf在/usr/local/sphinx目录):
-
cd /usr/local/sphinx
-
/usr/local/php/bin/php api/test.php -i cgfinal CGArt
Sphinx的API查询接口主要有这些内容(其实对照 一下sphinxapi.php就清楚了):
-
//创建Sphinx的客户端接口对象
-
$cl = new SphinxClient ();
-
-
//设置连接Sphinx主机名与端口
-
$cl->SetServer('localhost',3312);
-
-
//可选,为每一个全文检索字段设置权重,主要根据你在sql_query中定义的字段的顺序,Sphinx系统以后会调整,可以按字段名称来设定权重
-
-
//设定搜索模式,SPH_MATCH_ALL,SPH_MATCH_ANY,SPH_MATCH_BOOLEAN,SPH_MATCH_EXTENDED,SPH_MATCH_PHRASE
-
$cl->SetMatchMode(SPH_MATCH_ALL);
-
-
//设定过滤条件$attribute是属性名,相当于字段名(用SPH_MATCH_EXTENDED时),$value是值,$exclude是布尔型,
-
当为true时,相当于$attribute!=$value,默认值是false
-
$cl->SetFilter($attribute, $values, $exclude);
-
-
//设定group by
-
//根据分组方法,匹配的记录集被分流到不同的组,每个组都记录着组的匹配记录数以及根据当前排序方法本组中的最佳匹配记录。
-
//最后的结果集包含各组的一个最佳匹配记录,和匹配数量以及分组函数值
-
//结果集分组可以采用任意一个排序语句,包括文档的属性以及sphinx的下面几个内部属性
-
//@id--匹配文档ID
-
//@weight, @rank, @relevance--匹配权重
-
//@group--group by 函数值
-
//@count--组内记录数量
-
//$groupsort的默认排序方法是@group desc,就是按分组函数值大小倒序排列
-
$cl->SetGroupBy($attribute, $func, $groupsort);
-
-
//设定order by的内容,第一个参数是排序方法名,值有
-
// SPH_SORT_RELEVANCE,SPH_SORT_ATTR_DESC,SPH_SORT_ATTR_ASC,SPH_SORT_TIME_SEGMENTS,SPH_SORT_EXTENDED
-
//$sortby的值如"HITS desc"
-
$cl->SetSortMode(SPH_SORT_EXTENDED, $sortby);
-
-
//set count-distinct attribute for group-by queries,$distinct为字符串
-
$cl->SetGroupDistinct ( $distinct );
-
-
//相当于mysql的limit $offset,$limit
-
$cl->SetLimits($start,$limit)
-
-
//$q是查询的关键字,$index是索引名称,当等于*时表查询所有索引
-
$res = $cl->Query ( $q, $index );
$cl->Query()返回的内容print_r后大概是:
-
Array
-
(
-
[error] =>
-
[warning] =>
-
[status] => 0
-
[fields] => Array
-
(
-
[0] => title
-
[1] => contents
-
[2] => author
-
)