配置aspseek建立强大的企业级搜索引擎

建立搜索引擎 没有全文检索,企业内部的知识管理系统就不能成为成功的系统。构建一个类似 GOOGLE 的全文检索系统的是否要花费巨大呢?看看 Google 的搜索引擎软件目录吧。 我对其中的两个开放源码的搜索引擎进行了测试。htdig 是一个不错的搜索引擎软件,可惜不支持中文的检索;ASPseek 接着走入我的视线,这个软件对中文的支持非常之好,就连CGI的界面、CGI传递参数都和 GOOGLE 非常类似。 ASPseek 由三个部分组成:前端的 cgi 程序 s.cgi 提供查询界面和返回查询结果;后端的守护程序 searchd 接收cgi程序的查询请求,执行数据库查询,返回结果;后台数据库的维护则由程序 index 完成。 相关链接: Google的搜索引擎软件目录 参见:http://dir.google.com/alpha/Top/ … net/Servers/Search/ 另一个搜索引擎软件目录: Search Tools for Web Sites and Intranets :http://www.searchtools.com/tools/tools.html ASPseek 网站 ASPseek.org:http://www.aspseek.org/ ASPseek论坛 关于ASPseek的求助信息,可以访问ASPseek论坛:http://forum.aspseek.org/。 2.1. 安装 ASPSeek ASPseek 安装过程比较简单,需要注意的是 ASPseek 的安装和运行需要先安装和配置 MySQL。下面是一般的安装过程(假设MySQL已经正确的安装在路径 /usr/local/mysql/ 下): root>; tar zxvf aspseek-1.2.10.tar.gz root>; cd aspseek-1.2.10 root>; ./configure –with-mysql=/usr/local/mysql –prefix=/usr/local/aspseek root>; make && make install root>; /usr/local/aspseek/sbin/aspseek-mysql-postinstall root>; cp /usr/local/aspseek/bin/s....

2006-05-18 · 4 分钟 · admin

正则表达式学习笔记

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 列目录时, dir .txt或ls .txt中的.txt就不是一个正则表达式,因为这里与正则式的*的含义是不同的。 为便于理解和记忆,先从一些概念入手,所有特殊字符或字符组合有一个总表在后面,最后一些例子供理解相应的概念。 正则表达式 是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式,即/expression/ 普通字符 由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。 非打印字符 字符 含义 \cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 \f 匹配一个换页符。等价于 \x0c 和 \cL。 \n 匹配一个换行符。等价于 \x0a 和 \cJ。 \r 匹配一个回车符。等价于 \x0d 和 \cM。 \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \t 匹配一个制表符。等价于 \x09 和 \cI。 \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 特殊字符 所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。 特别字符 说明 $ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。 ( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。 * 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 + 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 ....

2006-05-18 · 4 分钟 · admin

阿新FreeBSD服务器安装流程

如果简单安装一个web服务器 FreeBSD 安装是非常傻瓜和友好的 1,安装系统 我的分区 120G为例 256M / 2048M swap (1G内存) 10240M /var 4096M /usr 1024M /home 1025M /tmp 剩下的 /pub 实验证明 这种分区目前美掉过数据 选择MINI安装,FreeBSD安装可能是所有系统中最快的,大概 4-5分钟 2,系通更新 cvsup down回来最新的源代码 cd /usr/src make buildworld 修改内核 make buildkernel KERNCONF=NEWKERNEL make installkernel KERNCONF=NEWKERNEL make installworld mergemaster -cv 输入 i 安装新的 reboot 正常启动 系统更新ok 这是个漫长的过程,这段时间我一般都在CS 3,安装应用程序 cvsup down回最新的ports库 1,perl cd /usr/ports/lang/perl5.8 make install clean 2,apache cd /usr/ports/lang/apache13-modssl make APACHE_HARD_SERVER_LIMIT=1024 install clean APACHE_HARD_SERVER_LIMIT=1024 apache最大连接数 3,mysql cd /usr/ports/databases/mysql40-server make WITH_CHARSET=gbk WITH_XCHARSET=all WITH_OPENSSL=yes WITH_PROC_SCOPE_PTH=yes BUILD_OPTIMIZED=yes install clean 进站了 在火车上再写 继续 4....

2006-05-16 · 1 分钟 · admin

又出现Incorrect key file for table:

真不知道MYSQL最近怎么了,老是出错 解决方法还是修复一下 REPAIR TABLE xxx

2006-05-15 · 1 分钟 · admin

CLUCENE-0.9.10 索引与优化过程

一.文件索引过程 主要流程描述 IndexWriter writer("ndx", &an;, true); writer.setMergeFactor(10); writer.setMinMergeDocs(10); Document *lpDoc = new Document; lpDoc->add(*new Field("content", "This is demo content.", true, true, true) ); writer.addDocument(lpDoc); delete lpDoc; writer.close(); 下面描述该流程 1.IndexWriter writer("ndx", &an;, true); directory = FSDirectory::getDirectory("ndx", true); 从一个全局的列表中取得一个对象 如果对象不存在,则新建一个并加入到列表中 主要目的是为了使用同一个目录只使用同一个FSDirectory对象 新建目录时删除该目录下所有文件级子目录 analyzer = an; 该对象由对象外部创建 segmentInfos = _CLNEW SegmentInfos; 建立一个SegmentInfos对象,该对象包含一个SegmentInfo对象的列表 建立时指定了SegmentInfo对象的列表并不在移除指针时删除SegmentInfo对象 一个SegmentInfo对象包括其名称(用于文件名前缀)和文档数 closeDir = true; 指定是否在索引对象关闭close时,是否同时调用目录的close函数 缺省为关闭目录对象 similarity = CL_NS(search)::Similarity::getDefault(); 取得缺省的文档分值score计算对象,如果不存在则建立 可以自己实现一个Similarity的继承类,然后用Similarity::setDefault方法设置成缺省的 变量Similarity* _defaultImpl用于保存缺省对象 ramDirectory = _CLNEW TransactionalRAMDirectory; 建立一个TransactionalRAMDirectory对象,该对象包含一个事务取消时的删除文件列表及恢复文件列表 同时还包含一个当前文件列表 恢复文件列表自动删除key和value,删除文件列表和当前文件列表则不自动删除 LuceneLock* newLock = directory->makeLock("write....

2006-05-14 · 3 分钟 · admin

一个简单的中文分词 CLucene

CLucene - a C++ search engine http://sourceforge.net/projects/clucene/ 传统的全文检索都是基于数据库的,Sql Server Oracle mysql 都提供全文检索,但这些比较大,不适合单机或小应用程序(Mysql4.0以上可以作为整合开发),Mysql也不支持中文。 后来得知Apache有一个开源的全文检索引擎,而且应用比较广,Lucene是Apache旗下的JAVA版的全文检索引擎,性能相当出色,可惜是java版的,我一直在想有没有C或C++版的,终于有一天在http://sourceforge.net 淘到一个好东东,Clucene!CLucene是C++版的全文检索引擎,完全移植于Lucene,不过对中文支持不好,而且有很多的内存泄露,:P Cluene不支持中文的分词,我就写了一个简单的中文分词,大概思路就是传统的二分词法,因为中文的分词不像英文这类的语言,一遇到空格或标点就认为是一个词的结束,所以就采用二分词法,二分词法就是例如:北京市,就切成 北京 , 京市。这样一来词库就会很大,不过是一种简单的分词方法(过段时间我再介绍我对中文分词的一些思路) ,当然了,在检索时就不能输入“北京市”了,这样就检索不到,只要输入:“+北京 +京市”,就可以检索到北京市了,虽然精度不是很高,但适合简单的分词,而且不怕会漏掉某些单词。 我照着Clucene的分词模块,做了一个ChineseTokenizer,这个模块就负责分词工作了,我把主要的函数写出来 ChineseTokenizer.cpp: Token* ChineseTokenizer::next() { while(!rd.Eos()) { char_t ch = rd.GetNext(); if( isSpace((char_t)ch)!=0 ) { continue; } // Read for Alpha-Nums and Chinese if( isAlNum((char_t)ch)!=0 ) { start = rd.Column(); return ReadChinese(ch); } } return NULL; } Token* ChineseTokenizer::ReadChinese(const char_t prev) { bool isChinese = false; StringBuffer str; str.append(prev); char_t ch = prev; if(((char_t)ch>>8)&&(char_t)ch>=0xa0) isChinese = true; while(!...

2006-05-13 · 1 分钟 · admin

PECL中的clucene库

getMessage() . ‘, ‘; echo ‘File: ‘ . $e->getFile() . ‘, ‘; echo ‘Line: ‘ . $e->getLine(); exit(); } $query = ”; if (isset($_SERVER['argv'][1])) { $query = $_SERVER['argv'][1]; } else { $query = “time”; /* Should return 3 results */ } echo “Search results for: ‘$query’\n”; $hits = $searcher->search($query); $length = $hits->length(); echo “Number of results: $length\n”; for ($i = 0; $i < $length; $i++) { echo 'path: ' . $hits->get($i, ‘path’) ....

2006-05-13 · 1 分钟 · admin

php + clucene extension的安装

CLucene是SF上面的一个对Lucene(一个用Java写的全文检索引擎工具包)的移植,做为Lucene的C++的重新实现,以带来更快的检索速度,但是一直还不stable.这里仅仅是尝试php+clucene扩展的安装,具体应用先不管. 安装环境: Freebsd 6.0 + apache 2.2 + php 5.1.2 apache+php的安装就不说了,网上一抓一大把,注意clucene扩展必须在php5以上才能安装. 首先安装clucene 1.下载clucene 直奔它的首页–clucene.sourceforge.net,下载clucene 0.9.10 2.编译clucene tar xzvf clucene-0.9.10.tar.gz cd clucene-0.9.10 ./autogen.sh ./configure make 这样clucene就安装好了,为了让其它程序可以调用clucene,这里把编译好的lib放到系统lib目录下 cp src/.libs/libclucene.* /usr/local/lib cp src/CLucene.h /usr/local/include/ cp -r src/CLucene /usr/local/include/ 安装clucene php extension 1.下载clucene php extension 在pecl.php.net有下载,拖回来就是 http://pecl.php.net/package/clucene 2.编译clucene php extension tar xzvf clucene-0.0.9.tgz cd clucene-0.0.9 cp -r /usr/local/include/Clucene include/ #编译时要把clucene的include文件弄一份 cp -r /usr/local/include/Clucene.h include/ phpize ./configure make 编译完成,这里会生成一个clucene.so,我们把它放在php的extension目录下(没有就建一个),然后修改php.ini 加入 extension=clucene.so 重启apache之后看phpinfo php+clucene 至此安装就算完成了,demo嘛在examples目录下有一个,命令行调用方式(根据已有的index检索): php clucene....

2006-05-13 · 1 分钟 · admin

mysql表无法打开

出现#1016 - Can’t open file: ‘xxx.MYI’ (errno: 145) 不知怎么造成的,可能是垃圾太多了吧,优化一下就可以解决问题的 REPAIR TABLE xxx就可以了

2006-05-13 · 1 分钟 · admin

Zend Framework 手册中文版

相信Zend Framework对于很多人都有借鉴意义(即使你不支持MVC),我打算花点业余时间把Zend Framework的手册翻译过来。应该对新手,老手都有点用 翻译的路线是按我自己的的兴趣来安排的呵呵,ZF提供的那些类库,不一定会全部一一说明,因为我觉得大家可能都有自己的类库,不一定要用ZF的。主要还是看看它的框架。 目前打算在这个版块和我的Blog上同步更新,等全部完成后,打包成chm文档提供下载。 如果谁有兴趣参与,非常欢迎,请与我联系 msn & email:haohappy at msn.com (at->@) 第一章. Zend 目录 1.1. 简介 1.2. Zend::loadFile() 1.3. Zend::loadClass() 1.4. Zend::loadInterface() 1.5. Zend::isReadable() 1.6. Zend::dump() 1.7. Zend::register() 1.8. Zend::registry() 1.1.简介 Zend类是Zend Framework的基类,之所以有这个类是为了使Zend Framework遵循DRY原则(Don’t Repeat Yourself)。这个类只包含静态方法,这些类方法具有Zend Framework中的很多组件都需要的功能。 1.2. Zend::loadFile() Zend::loadFile()用来包含PHP文件。它其实是将PHP的include()函数封装而成的一个静态方法。当包含文件失败时,会抛出异常(Zend_Exception,见后面–Haohappy注)。 loadFile($filename, $dirs=null, $once=false) 参数: 文件,目录(路径),是否只包含一次 $filename参数指定需要加载的文件,注意$filename不需要指定任何路径,只需要文件名即可。ZF会对文件作安全性检查。$filename只能由字母,数字,连接符-,下划线_及英文句号.组成(半角)。$dir则不限,可以使用中文等。 $dirs参数用来指定文件所在目录,如果为空,则程序将会到系统的include_path下寻找文件是否存在(include_path可在php.ini中设置–Haohappy注) $once参数为布尔类型,只能是true或false,两者区别就和include()和include_once()的区别一样。 1.3. Zend::loadClass() Zend::loadClass()用来加载一个PHP类文件,这个文件的文件名必须和文件中的类同名。loadClass()会检查文件中的类是否存在。如果文件中的类不存在,那么就会抛出一个Zend_Exception异常。 (例:TestClass.php中有个类TestClass,使用Zend::loadClass(“TestClass”)就可加载这个类,这种作法类似于Java– Haohappy注) loadClass($class, $dirs) 参数: 类,目录 如果没有指定$dirs参数,而文件名中存在下划线,那么loadClass()会自动把下划线当成目录分隔符,去相应的目录中去查找文件。 例如:loadClass(“Zend_Example_Class”) 没指定$dirs参数 ,则 loadClass()会自动到Zend/Example/目录下去查找Class.php文件 1.4. Zend::loadInterface() Zend::loadInterface()和Zend::loadClass()的用法是一样的,区别在于loadInterface()是用来加载接口。Zend::loadClass() 不能用来加载接口,因为PHP函数class_exists()不能检查Interface是否存在(PHP 5.0.2之前版本),所以需要用Zend::loadInterface()来代替。 loadInterface($interface, $dirs) 同样,如果你没有指定目录,但是文件中含有下划线_,Zend::loadInterface()也会自动到相应目录去寻找文件,这和Zend::loadClass()是一样的。 1....

2006-05-12 · 1 分钟 · admin

于Lucene/XML的站内全文检索解决方案

关键词:Lucene xml xslt web site search engine 内容摘要: 为Lucene做一个通用XML接口一直是我最大的心愿:更方便的在WEB应用中嵌入全文检索功能 提供了XML的数据输入接口:适合将原有基于各种数据库的数据源导入到全文索引中,保证了数据源的平台无关性; 通过了基于XML的搜索结果输出:方便了通过XSLT进行前台的结果显示; MySQL \ / JSP Oracle - DB - ==> XML ==> (Lucene Index) ==> XML - ASP MSSQL / - PHP MS Word / \ / XHTML PDF / =XSLT=> - TEXT \ XML \_________WebLucene__________/ 使用过程如下: 将数据用脚本导出成XML格式; 将XML数据源导入LUCENE索引; 从WEB界面得到XML结果输出,并通过XSLT生成HTML页面 站内全文检索的必要性 虽然大型搜索引擎的功能已经越来越强大了,很多站点都使用了Google的站内检索site:domain.com代替了自己的站内数据库“全文”检索。但依靠GOOGLE这样的大型搜索引擎做站内检索会有以下弊端: 数量有限:搜索引擎并不会深度遍历一个网站,而将网站所有的内容都索引进去,比如Google就喜欢静态网页,而且是最新更新的,而不喜欢带?的动态网页,Google甚至会定期将缺少入口的网站内容逐渐抛弃; 更新慢:搜索引擎针对站点的更新频率也是有一定周期的,很多内容需要一定时间后才能进入GOOGLE的索引:目前Google Dance的周期是21天左右; 内容不精确:搜索引擎需要通过页面内容提取技术将导航条,页头页尾等内容过滤掉,反而不如直接从后台数据库提取数据来得直接,这种摘要和排重机制是很难实现的; 无法控制输出:也许有更多的输出需求,按时间排序,按价格,按点击量,按类目过滤等 系统的搭建 下载: http://sourceforge.net/projects/weblucene/ XML数据源的导入: 只要数据源可以导出成3层的XML结构,就都可以用IndexRunner这个命令行工具导入: 比如从数据库导出:news_dump.xml 标题 作者 内容 2003-06-29 My Title chedong abc 2003-06-30 … IndexRunner -i news_dump....

2006-05-12 · 2 分钟 · admin

Lucene 全文检索实践

2006-05-12 · 0 分钟 · admin

在应用中加入全文检索功能

2006-05-12 · 0 分钟 · admin

用mysql的replace函数替换字符串

用mysql的replace函数替换字符串 比如你要将 表 tb1里面的 f1字段的abc替换为def UPDATE tb1 SET f1=REPLACE(f1, ‘abc’, ‘def’);

2006-05-04 · 1 分钟 · admin

web.xml配置详细说明

1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。 DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义)。 所有部署描述符文件的顶层(根)元素为web-app。请注意,XML元素不像HTML,他们是大小写敏感的。因此,web-App和WEB-APP都是不合法的,web-app必须用小写。 2 部署描述符文件内的元素次序 XML 元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感。例如,XML头必须是文件中的第一项,DOCTYPE声明必须是第二项,而web- app元素必须是第三项。在web-app元素内,元素的次序也很重要。服务器不一定强制要求这种次序,但它们允许(实际上有些服务器就是这样做的)完全拒绝执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文件是不可移植的。 下面的列表给出了所有可直接出现在web-app元素内的合法元素所必需的次序。例如,此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意,所有这些元素都是可选的。因此,可以省略掉某一元素,但不能把它放于不正确的位置。 l icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。 l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称。 l description description元素给出与此有关的说明性文本。 l context-param context-param元素声明应用范围内的初始化参数。 l filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。 l filter-mapping 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。 l listener servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。 l servlet 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。 l servlet-mapping 服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName。但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。 l session-config 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。 l mime-mapping 如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。 l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。 l error-page error-page元素使得在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。 l taglib taglib元素对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,而不用编辑使用这些文件的JSP页面。 l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象。 l resource-ref resource-ref元素声明一个资源工厂使用的外部资源。 l security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用 l login-config 用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。...

2006-04-30 · 6 分钟 · admin