CLucene对中文文本的按字建索引与搜索
CLucene 0.9.16版本支持中文方法
1,环境:windows平台,vc8
2,项目设置:必须设置为Use Unicode Character Set。
因为使用ANSI时,汉字存在与其他语言编码重叠的问题,在分析文本时,很难判断一个char是否是半个汉字,或者是前半个汉字还是后半个汉字。同时,CLucene对UCS2编码能够提供支持,所以VC项目直接设置为Use Unicode Character Set。
3,需要对三处代码进行修改:
3-1,\src\CLucene\util\Misc.cpp,line 76的Misc::_cpycharToWide函数
这个函数是CLucene中用来将char字符串转换为wchar_t字符串,但原有代码中的转化方式是不考虑编码,因此对汉字由ANSI到UCS2转换会失效,需要修改成使用windows API的MultiByteToWideChar函数
3-2,\src\CLucene\analysis\standard\StandardTokenizer.cpp
这个类实现了最基本的切分文本功能,包含英文分词、数字提取。虽然有包含CJK单字提取,但是不够完善。
3-2-1,line 117的StandardTokenizer::next函数
这个函数用来获取下一个token。一个token可以简单地理解为一个英文单词、或一个数字、或CJK单字,是索引或搜索时的基本单位。在原有代码中,ReadAlphaNum比ReadCJK函数先执行,而在中文windows系统上,将一个UCS2编码的汉字(正好一个wchar_t)作为参数传给iswalpha函数时,返回值是true。因此,项目修改为使用Unicode编码后,ReadCJK函数不会被调用到。所以需要将原代码中的if (_CJK)的判断分支放到if (ALPHA)前面,提前执行。
3-2-2,line 261的StandardTokenizer::ReadCJK函数
这个函数用于读取一个CJK的token。在函数中加入了CONSUME_CJK的宏调用,会导致解析器一直读取下去,直到遇到CJK单字为止,相当于把整个句子做成一个token。直接把这个宏调用屏蔽,就会将每个CJK单字作为一个token。同时也意味着,在这里可以加入中文分词。
通过对上面3处的修改,就可以实现CLucene对中文文本的按字建索引与搜索
1,环境:windows平台,vc8
2,项目设置:必须设置为Use Unicode Character Set。
因为使用ANSI时,汉字存在与其他语言编码重叠的问题,在分析文本时,很难判断一个char是否是半个汉字,或者是前半个汉字还是后半个汉字。同时,CLucene对UCS2编码能够提供支持,所以VC项目直接设置为Use Unicode Character Set。
3,需要对三处代码进行修改:
3-1,\src\CLucene\util\Misc.cpp,line 76的Misc::_cpycharToWide函数
这个函数是CLucene中用来将char字符串转换为wchar_t字符串,但原有代码中的转化方式是不考虑编码,因此对汉字由ANSI到UCS2转换会失效,需要修改成使用windows API的MultiByteToWideChar函数
3-2,\src\CLucene\analysis\standard\StandardTokenizer.cpp
这个类实现了最基本的切分文本功能,包含英文分词、数字提取。虽然有包含CJK单字提取,但是不够完善。
3-2-1,line 117的StandardTokenizer::next函数
这个函数用来获取下一个token。一个token可以简单地理解为一个英文单词、或一个数字、或CJK单字,是索引或搜索时的基本单位。在原有代码中,ReadAlphaNum比ReadCJK函数先执行,而在中文windows系统上,将一个UCS2编码的汉字(正好一个wchar_t)作为参数传给iswalpha函数时,返回值是true。因此,项目修改为使用Unicode编码后,ReadCJK函数不会被调用到。所以需要将原代码中的if (_CJK)的判断分支放到if (ALPHA)前面,提前执行。
3-2-2,line 261的StandardTokenizer::ReadCJK函数
这个函数用于读取一个CJK的token。在函数中加入了CONSUME_CJK的宏调用,会导致解析器一直读取下去,直到遇到CJK单字为止,相当于把整个句子做成一个token。直接把这个宏调用屏蔽,就会将每个CJK单字作为一个token。同时也意味着,在这里可以加入中文分词。
通过对上面3处的修改,就可以实现CLucene对中文文本的按字建索引与搜索