经过摸索,我决定给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.xdbn”); } 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 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]