我的知识库

知识等于力量

« 提高Google Adsense的eCPM的常用技巧项目管理与Project2000的应用 »

中文全文检索的实现以及一些经验

最近在项目中面临中文全文检索的需求,关键需求如下:

1 支持中文、英文字词的全文检索,待检索文本是古文言文。
2 全文检索表达式支持: AND,OR,NOT,NEAR,BEFORE 运算符,支持()。
3 速度要求:400M文本,要求在2-5秒内能够检索完毕。



尝试Lucene以及放弃原因:

在尝试Lucene和不同的中文Analyzer后,终告放弃。
原因如下:
由于待检索文本是古文,中文分词技术无法派上用场。在将分隔存储每个汉字后,发现从Lucene中检索到的文本远远少于关键字实际匹配的文本,这一问题对于较长的检索关键字尤其明显。
因为对于检索准确程度要求很高,故此放弃,但是Lucene出的这个问题的原因尚不清楚,希望能够有人提出解答。



自行实现中文全文检索原理以及方法:

1 构建过程,忽略标点符号,自行计算每个汉字在每个文本文件中的偏移量,并保存。
2 检索过程,定位每个汉字的偏移量,如果检索表达式中每个汉字的预期偏移量与实际偏移量吻合,则匹配成功。
3 采用 MappedByteBuffer 加快检索速度,采用二分查找加快偏移量匹配速度,3个左右的关键字复合检索能够在3-5秒内完成匹配(要求操作系统有足够大的缓存)。



全文检索代码示例(TestFullTextQuery.java):
File storeDir = new File("C:\\temp\\fulltext\\index");
StoreSearcher searcher = new StoreSearcher(storeDir);
String str = "大?藏 & 阿难"; //同时出现 "大?藏" 和 "阿难", ?代表任意字符
searcher.queryBegin(str, true);
while(true){
    StoreSearcherResult ssr = searcher.getNextQueryResult();
    if ( ssr == null ){
        break;
    }
    System.out.println("ID "+ssr.docId+":"+ssr.matchedCount);
}
searcher.queryEnd();
searcher.close();

运行结果
ID T01n0001.TXT:320
ID T01n0002.TXT:3
ID T01n0004.TXT:2
ID T01n0005.TXT:202
ID T01n0006.TXT:131
....



附:全文检索表达式举例

关键字中间可以出现?,表明匹配任意字符。

运算符名称:运算符字符
AND:&
OR:,
BEFORE:*
NEAR:+
NOT:-

表达式举例:
(KEY1 <AND|OR|BEFORE|NEAR> KEY2) & (NOT KEY3)
KEY1 KEY2 (关键字之间无运算符假设为AND)



附:全文检索文件格式信息

DocInfoStore(文档信息)
--HEAD--
DocCount:Integer                    文档数目
--DOC HEAD(PER DOC)--
DocSeq:    Integer                        文档顺序号,内部使用
DocId:     Char[128]                    文档唯一ID,字符串格式
DocSepOfs: Integer                文档分隔符数组的Ofs
--DOC SEP OFS(PER DOC)--
DocOfs:    ArrayOfInteger        文档分隔数组


WordInfoStore(每个汉字信息)
--HEAD--
WordCount:Integer                    汉字数
--WORD IDX(Per Word)--
WordChar:Integer                    汉字的Unicode值
WordInfoOfs:Integer                汉字信息在文件中的偏移量
WordInfoSize:Integer            汉字信息大小
--WORD INFO(Per Word)--
DocCount:                                    汉字出现的文档数
DocSeq(Per Doc):                  每个文档的顺序号
WordInDocs:ArrayOfInteger 每个文档中出现的汉字的偏移数组,从小到大排列


源文件及CLASS下载地址:
http://www.blogjava.net/Files/zhugf000/foreader2_ftsearch.zip

Search

导航

热门文章

最新文章

Powered By duduwolf's wiki 1.0

Copyright 1999-2007 duduwolf.com Some Rights Reserved.