当前位置: 首页 > 工具软件 > CLucene > 使用案例 >

准备写些clucene笔记

柳威
2023-12-01

        最近在看clucene的源码(不太会java,还是看c++的代码入门比较快。并且c++版本要简单些)。打算写点笔记记录下。

       clucene最新的版本是2.3版本,我开始从这个版本看,代码优点多,不太好投入进去。先找了个0.8.2版本的clucene,这个版本果然简单多了,同时bug也比较多。这也是一个读源码的一个经验。从最早的一个版本来入门,速度上会快很多。

        用vs2005打开0.8版本的源码时候,我开始都是设置成unicode版本,但是无论怎么编译,StringBuffer这个class总是编译出char版本,而不是wchar版本。而test工程所引用的StringBuffer是wchar版本,导致链接总是不通过。实在没办法了,我把lucence和test这2个工程都设置成“use multi-byte character set”,同时要把UNICODE的宏删除。

       同时在文件MultiTermQuery.h中 改了行代码, 即 const static bool LUCENE_STYLE_TOSTRING = true; 否则在运行test的时候tosring输出有问题。

       lucene本身的文件结构也算比较简单,没啥惊艳的地方。学习源码的重点应该放在源码实现上,实现一个查询功能不是件很难的事情,如果用过好的框架来实现才是重点,总之思路很重要。


       0.8.2版本确实有好些问题。比如:

1,类的成员变量也没加个类似“m_”的前缀。可能是个人习惯问题,现在总是第一时间通过前缀来快速反应是不是成员变量,不然总是慢半拍。包括对指针变量也是。

2,new和delete的对应关系不清晰。很多都是在一个函数里面new来返回一个指针,从而需要在函数外面来delete这个指针。有些类成员变量指针需要对象来delete,而有些不需要。这些都c++内存管理容易出错的地方。

3,对类取名字的时候用了很多单复数来区别,

        如 class FieldInfo 和 class FieldInfos

             class SegmentInfo 和 class SegmentInfos

             class SegmentTermDocs 和 class SegmentsTermDocs(segement的复数形式)

       在最开始看的时候,没注意,老是混淆了这些class,给理解上带来了很多的不便。希望大家一定要注意。他们之间的关系已好理解,基本上都是多个单数class组合成一个复数class。

4,编译器相关的一个bug

      long_t InputStream::readLong() {
        return (((long_t)readInt()) << 32) | (readInt() & 0xFFFFFFFFL);
    }

    编译器不保证对 A | B 中表达式 A和表达式B的计算顺序,即有可能先计算B,再计算A。对上面的代码而已,2个readint()有可能先执行后面那个,这样导致返回的数值的高32bit和低32bit颠倒了。


    总之,对比了后面的一些版本,这个版本保留了更多的c风格,还是觉得这个版本够简单直白,理解起来容易的多。c++用的高深时,总是把内容隐藏。通过纯代码调试的时候,总是不知道一个基类指针是啥内容的,很不利于调试理解。个人认为,通过纯代码来学习,c总是比c++更容易理解。


 类似资料: