zoukankan      html  css  js  c++  java
  • 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对中文文本的按字建索引与搜索
  • 相关阅读:
    工业相机基础知识
    软件测试最常用的 SQL 命令 | 掌握基本查询、条件查询、聚合查询
    一文掌握软件测试常用SQL命令
    PageObject设计模式在 UI 自动化中的实践(QQ 邮箱登陆为例)
    测试开发必备--搞定PO设计模式
    Junit5 + YAML 参数化和数据驱动,让 App 自动化测试更高效(一)
    快速搞定APP移动端自动化测试
    接口自动化测试的 “能” 与 “不能”
    如何精通接口测试?
    测试开发必备:Dubbo-admin+Zookeeper 的环境搭建实操
  • 原文地址:https://www.cnblogs.com/cy163/p/1214777.html
Copyright © 2011-2022 走看看