»
S
I
D
E
B
A
R
«
Tokyo Dystopia:基于Tokyo Cabinet的一个全文检索系统
Aug 17th, 2008 by 一米六二

项目主页:
http://tokyocabinet.sourceforge.net/dystopiadoc/
介绍:
Tokyo Dystopia 是一个全文检索系统,你可以搜索包含某短语的一系列记录,它的特性如下:
1.搜索的高效。
2.目标文标的高可靠性
3.N-gram 法的高召回率 (我加的,原文中没有:召回率是搜索引擎中对搜索结果能否全面的量化,召回率越高,搜索结果中包含相关文档越多,同时一般来说搜索结果越不精确,精确率越低。)
4.短语匹配,前缀匹配,后缀匹配搜索.
5.Unicode下多语种支持。
6.API的分层架构支持。
值得一提的是,印象中Tokyo Dystopia好像在日本国内社交网站老大mixi.jp上应用了。

社区全文检索引擎Hyper Estraier 学习笔记[4]
Jul 12th, 2008 by 一米六二

如何搭建一个Web界面的搜索界面
现在我的硬盘上有Linux帮助,php中文文档,mysql文档,C函数手册等文档等,它们一共有500M.
我需要一个索引工具。但是明显在命令行不是太方便。因为这些文档全是HTML格式的,我需要用浏览器来打开它们查看。
我决定在本机架设一个apache,利用hyperestraier来进行索引,提供像Google/baidu那样的web界面。
这是我的操作步骤:
1 准备目录:
我在www目录下新建了两个目录,search/tool和search/search_doc目录,将属主改为apache(这是我的apache运行的用户名).
search/tool/用来放置hyperestraier的程序和索引数据库,search_doc/下放置原始的各种帮助文档。
2.索引帮助文档:
在search/tool/目录下:

estcmd create man_docs_db
find ../search_doc/ -name “*.html” -type f|estcmd gather -cl -fm -cm ./man_docs_db -

然后Hyperestraier就哗啦哗啦地索引这500多M的文要资料。很快就索引完了。
3.进行CGI和estseek.cgi的相关设置。
我们将编译hyperestraier目录下产生的estseek.*复制到search_tool目录下,并修改apache的关于CGI的配置:


Options +ExecCGI
addHandler cgi-script cgi pl


现在search_tool目录下的estseek.cgi能被执行了.当然你得执行chmod a+x estseek.cgi或是chmod 0755 estseek.cgi给这个文件加上执行权屯限。
接着编辑search_tool目录下的estseek.conf文件:

indexname: man_docs_db
tmplfile: estseek.tmpl
topfile: estseek.top
helpfile: estseek.help
lockindex: true
pseudoindex:
replace: ^file:///home/y/www/search_doc/{{!}}/search_doc/
replace: /index\.html?${{!}}/
showlreal: false
deftitle: Hyper Estraier: a full-text search system for communities
formtype: normal
perpage: 10 100 10
attrselect: false
#genrecheck: private{{!}}private
#genrecheck: business{{!}}business
#genrecheck: misc{{!}}miscellaneous
attrwidth: 80
showscore: true
extattr: author|Author
extattr: from|From
extattr: to|To
extattr: cc|Cc
extattr: date|Date
snipwwidth: 480
sniphwidth: 96
snipawidth: 96
condgstep: 2
dotfidf: true
scancheck: 3
phraseform: 2
dispproxy:
candetail: true
candir: false
auxmin: 32
smlrvnum: 32
smlrtune: 16 1024 4096
clipview: 2
clipweight: none
relkeynum: 0
spcache:
wildmax: 256
qxpndcmd:
logfile:
logformat: {time}\t{REMOTE_ADDR}:{REMOTE_PORT}\t{cond}\t{hnum}\n


这里主要要修改indexname和replace.
说明:
indexname是你前面用estcmd create命令创建的索引数据库的名字.
replace可以多行,能对搜索结果中显示的文件路径做一个正则替换。因为索引入库的URL是file:///home/***类似
的路径,在web中显示出来没法访问。
好的,现在在search_tool/目录创建一个首页index.html,并给一个表单:


现在就可以通过http://localhost/search_tool/来搜索你的帮助文档了。


后记:
但是,很快我发现几个问题:
1:Hyperestraier在处理gb2312的文档时,似乎有时侦测文档的编码类型会失败。搜索的时候对应的结果没有。
2.在显示搜索结果的摘要时,没有过滤HTML标签。这是我问题:我在检索的时候应该用的是:

find ../search_doc/ -name “*.html” -type f|estcmd gather -cl -fm -cm -fh ./man_docs_db -

这才能按照html来解析,否则是按mime来解析的。
3.搜两个词时,我期望的是同时包含其中任何一个词的网页都能出来,但是Hyperestraier就只搜同时包含这两个词的网页,所以搜长点的词经常结果为空。
4.对于有些词,比如中文的”的”,英文的”the”,没有进行忽略。当然这对目前的应用来说不是太大的问题。
但是无论如何,前三个问题,迫切需要解决。下一次就来抓一个出来处理掉。

社区全文检索引擎Hyper Estraier 学习笔记[3]
Jun 22nd, 2008 by 一米六二

经过摸索,我决定给HyperEstraier加上由Hightman写的scws支持,使之支持中文分词。
实地看了代码之后,发现Hyperestraier的结构划分并不好,这可能决定了他只能是某些Hacker的心血之作,而不适用多人协作开发,大规模推广应用。这是旁话。
既然找到分词默认是使用的estraier.c的est_break_text函数,那我的目标就是改造这个函数,现在这个函数被我改成了:

scws_t seg;
/* Break a sentence of text and extract words. */
void est_break_text(const char *text, CBLIST *list, int norm, int tail){
// hack by renlu.xu
CBLIST *words;
const unsigned char *word, *next;
unsigned char *utext;
char *tmp;
int i, j, k, size, cc, wsiz, nsiz, tsiz;
assert(text && list);
if(seg==NULL)
{
seg=scws_new();
scws_set_charset(seg,”UTF-8″);
scws_set_rule(seg,”/home/y/etc/rules.utf8.ini”);
int xmode=0;
scws_set_dict(seg,”/home/y/etc/dict.xdb”,(xmode & XMODE_DICT_MEM) ? SCWS_XDICT_MEM : SCWS_XDICT_XDB);
if(seg->d == NULL && !(xmode & XMODE_NO_TIME))
fprintf(stderr, “WARNING: input dict file load failed. /home/y/etc/dict.xdb\n”);

}
int fsize;
fsize=strlen(text);
scws_send_text(seg,text,fsize);
scws_res_t res,cur;
while ((cur = res = scws_get_result(seg))!= NULL)
{
while (cur != NULL)
{
cblistpush(list,text+cur->off,cur->len);
cur = cur->next;
}
scws_free_result(res);
}
int iter_i;
int wsize=0;
fprintf(stderr,”\nsegmented words:\n”);
for(iter_i=0;iter_i word=CB_LISTVAL2(list,iter_i,wsize);
fprintf(stderr,"%s\t",word);
}
return ;
}

Ok,其中函数中最后一个for语句是为了调试,看看分词结果如何。
这里用到的scws_send_text等函数是hightman的scws中定义的,因此需要在estraier.c的文件头加上:

#include “scws.h”

并修改Hyperestraier的Makefile:

LIBS = -lqdbm -lz -lm -lc -lscws

然后make && make install
下面作个测试:

#!/bin/sh
#file:test.sh
rm -rf test_db
estcmd create test_db
find ./ -name “1.txt” -type f |estcmd gather -cl -fm -cm test_db -
estcmd search -vx -max 10 test_db ‘索引’

根据打印的结果,中文分词已经加入到索引过程中去了!

社区全文检索引擎Hyper Estraier 学习笔记[1]

社区全文检索引擎Hyper Estraier 学习笔记[2]

社区全文检索引擎Hyper Estraier 学习笔记[3]

社区全文检索引擎Hyper Estraier 学习笔记[2]
Jun 22nd, 2008 by 一米六二

hyperestraier是在前文已经介绍过一的一个开源搜索引擎程序。
分词:采用N-gram,char_category等来分词,良好地支持中文等东亚文字。
分词程序在:estraier.c中
est_break_text
est_break_text_perfng
est_break_text_chrcat
等分法。
相关的函数有
276 static int est_char_category(int c);
277 static int est_char_category_perfng(int c);
278 static int est_char_category_chrcat(int c);

分词默认采用est_break_text
当创建数据库时采用 estcmd create dbname -apn 时,采用est_break_text_perfng来分词
当创建数据库时是用 estcmd create dbname -acc 时,用est_break_text_chrcat来分词
采用est_break_text来分词时,结果这样样的:
今天 天突 突然 然想 想起 起霍 霍炬 炬曾 曾告 告诉 诉过 过我 我的 的一 一个 个日 日本 本人 人开 开发 发的 的全 全文 文检 检索 索引 引擎 擎, , 于是 是找 找他 他问 问了 了,
是双字连着的分词法,这样会占用多至少一倍的检索空间,同时精确度差一点(但是精确度比按字分词好一点)。


系列文章:
社区全文检索引擎Hyper Estraier 学习笔记[1]

社区全文检索引擎Hyper Estraier 学习笔记[2]

社区全文检索引擎Hyper Estraier 学习笔记[3]

社区全文检索引擎Hyper Estraier 学习笔记
Jul 18th, 2007 by 一米六二

今天突然想起霍炬曾告诉过我的一个日本人开发的全文检索引擎,于是找他问了,并下载下来看了看。
晚上去优酷去混脸熟,主讲的是讲品牌营销的,我不感兴趣,于是在下面打开电脑,学习Hyper Estrainer的文档,现在趁着没忘,做个笔记:

1.Hyper Estraier是一个用C语言开发的全文检索引擎,他是由一位日本人开发的.工程注册在sourceforge.net(http://hyperestraier.sourceforge.net).
2.Hyper的特性:
高速度,高稳定性,高可扩展性…(这可都是有原因的,不是瞎吹)
P2P架构(可译为端到端的,不是咱们下大片用的p2p)
自带Web Crawler
文档权重排序
良好的多字节支持(想一想,它是由日本人开发的….)
简单实用的API(我看了一遍,真是个个都实用,我能看懂的,也就算简单了)
短语,正则表达式搜索(这个有点过了,不带这个,不是好的Full text Search Engine?)
结构化文档搜索能力(大概就是指可以自行给文档加上一堆属性并搜索这些属性吧?这个我没有实验)

3.Hyper Estraier的安装
安装分两步进行:安装QDBM,再安装Hyper estrainer.
Hyper Estraier 需要QDBM来做数据库驱动.为什么不用Mysql/PGSql/Oracle?….想想吧…..我们要的是速度..速度..速度..
QDBM是与NDBM,SDBM,GDBM,TDB,TinyCDB,Berkeley DB相类似的一个,这一些驱动中有些功能欠缺,有些速度慢,作者认为,这其中,QDBM做到了一个较好的平衡.
另外…QDBM的作者也是Mikio Hirabayashi。(开始我以为Ruby的作者也是他,后来查了查Ruby programming,发现是Yukihiro Matsumoto,a.k.a “Matz”.难怪,日本人的英文名字看起来都一样的怪..
首先安装QDBM,安装完以后,再开始Hyper Estrainer的配置.Hyper Estrainer对其他组件的依赖性比较少,config,make过程都很快.一般的问题都是出在没有事先安装QDBM,或是找不到QDBM的头文件。QDBM一般个人很少直接用,所以推荐就默认安装,这样方便Hyper Estrainer 找到它的头文件.

4.Hyper Estraier的文档分为五部分:
a.简介
b.用户指南
c.编程指引
d.P2P架构主法
e.Web蜘蛛

5.使用:
find ./ -name “*.txt” -type f|estcmd gather -cl -fm -cm testdb –
这一命令,将查找当前目录下的所有txt文件,并用Hyper Estrainer索引.索引的数据库名字是testdb.
estcmd search -vx -max 10 testdb ‘Fedora core’
这一命令在testdb库中检索Fedora core,结果用xml给出,列出10个结果.

我认为最重要的就是索引文件(estcmd gather)和检索(estcmd search)这两步了.其他的可以运行estcmd 看说明.

6.p2p架构:
Hyper Estrainer 可以多组实例同时运行,不同的Node之间是可以互相通信的.当然,这一组组的node server都可以进行一个node master进行管理.不同的Node server之间可以互相通信.在查询时,可以通过任何一个node server进行查询,这个node server与其他node server间通信,将各个node server之前的search result 组合起来按某个权重排序并返回给Query 用户。同时,不同的node server可以指定不同的priority.
运行
estmaster init testdb

可以产生一个testdb配置目录.然后运行

estmaster start testdb

可以按这个配置来运行一个node master.
发果你没有修改testdb/_config中的服务器地址,那现在可以打开firefox,进入http://localhost:1978/master_ui进行管理。注意默认的用户名密码是admin/admin (我猜这个写程序的大牛一定是1978年生的,人家只比我大5岁,就能写Full-text search engine了).在这个webpage你可以进行node,managers的管理操作.
estmaster命令用来进行node master的管理,estcall 则可以对任一一个node server进行管理,比如

//该例子来自hyperestrainer.sourceforge.net网站
#file data002.est
#
@uri=data002
@title=Liberian Girl

Liberian girl
You came and you changed My world
A love so brand new

Then, register document using:
# file data002.est结果.
在命令行中运行
estcall put -auth clint tnilc http://localhost:1978/node/test2 data002.est
就直接将tile=Liberian Girl,uri=data002这样一个文档添加到test2这个node的索引中去了.

7.Web 蜘蛛
Hyper Estrainer还自行实现了一个蜘蛛。简要介绍其用法:

estwaver init testdb

将建立一个初始目录。咱们看一个testdb/_conf文件:

1 seed: 1.5|http://hyperestraier.sourceforge.net/uguide-en.html
2 seed: 1.0|http://hyperestraier.sourceforge.net/pguide-en.html
3 seed: 1.0|http://hyperestraier.sourceforge.net/nguide-en.html
4 …..

这里就设定了小蜘蛛要开始抓的网页的地址了.你可以改成你的博客啥的。

estwaver crawl testdb

这个命令将要抓取.

然后检索呢?其实与前面的用法一样,只不过数据目录变成了testdb/_index了:

estcmd search -vs casket/_index “hyper estraier”

怎么样?心动了吧?这样一套好用的东东,还是以LGPL协议发面的,商业应用起来很爽。偶都打算在我的老台式P3上用他来跑一个搜索引擎,打败Google(……你小子就做梦吧….)

社区全文检索引擎Hyper Estraier 学习笔记[1]

社区全文检索引擎Hyper Estraier 学习笔记[2]

社区全文检索引擎Hyper Estraier 学习笔记[3]

»  Substance: WordPress   »  Style: Ahren Ahimsa
16828 页面访问次数, 491 今天
7720 访问数, 161 今天
FireStats icon 由FireStats提供支持