Xapian源码研究报告(一)——Xapian的基本概念

2022-04-27 00:00:00 代码 提供 方式 文件夹 头文件
xapian的主要目录简介

1.api目录下的.ccinclude目录下的.h-文件是成对的,即include下提供了对面的使用的类。Api目录下给出该类的的实现。不过这些实现都不是真正的做事的地方。

2.backends目录

主要给出了实际对外提供类的真正的做事方法,代码通过多态的方式,通过宏或者其他的方式指定好实例化真正的类,该文件夹下都是做实事的。Xapian提供了brasschertflint等存储方式,此外inmemory的方式使用内存存储,即只是使用了4G的进程的虚拟内存,不产生实际的文件。顾使用这种方式的比较少。


3.common文件夹提供了一些公共的方法。另外还有部分的类的Internal的头文件。即把实际做事的各个真正做事的成员私有类Internal类的头文件另外写一个头文件,与对外的头文件区分开。但是与对面提供的头文件名称相同。例如:database,document.等

4.matcher文件下提供了查询时get_mset下用到的类,该文件夹下类大多继承于 Xapian::PostingIterator::Internal,通过Query的参数OP,决定实例化哪个子类。

5.net文件夹下主要是封装了网络通信类。

6.queryparser文件夹主要是queryparser类。

7.weight主要是计算term的rank方式计算的类。

8.Unicode字符串字符编码处理的类。


xapian的主要设计方式


   xapian的主要功能类中,大多有类似这样的结构:

classXAPIAN_VISIBILITY_DEFAULT Database 

  {

    public:

       class Internal;

       std::vector<Xapian::Internal::RefCntPtr<Internal>> internal;

   }

    主要是EfficvateC++中介绍的PIMPL的设计模式,Internal类继承于RefCntBase,xapian自己实现了一个带引用计数的智能指针,这个私有类指针的使用使代码的声明与实现分离,提高了类的封装以及代码的编译速度。降低了代码的耦合。而代码中真正的实现在Internal类,而这个类在Xapin很多时候被写成了抽象类,在这个类多被brass,chert,flint这三种存储模式下的各种功能类继承。Inmemory的存储方式我不明说,可以说代码主要做事的部分就在这些子类。



值得提一下的是,flint后端早在1.0版本出现,Chert后端早在1.2版本出现,brass后端早在1.4版本出现。

来自:https://mp.weixin.qq.com/s/r65JQybJoobZCkBXyS2Mmg

相关文章