最近读BDBXML的源码的时候,发现它对w3c推荐的fulltext草案的支持功能并不全。而BDBXML对fulltext的支持,完全是调用了XQilla的fulltext部分,所以更确切的说是,XQilla对fulltext检索的支持不全,。不过,这也难怪,毕竟w3c每年都在修改草案,要是一次性就把所有的功能都支持了,估计也不太可能。
暂且不说未支持的fulltext检索的功能,比如通配符,词根查询,停用词,大小写等等。只考虑已经认为被XQilla支持的功能中,比如order,就存在一个非常致命的bug。具体分析一下:比如某个book的title内容为:Improving the Usability of a Web Site Through Expert Reviews and Usability Testing。如果针对title,查询ftcontains "of a Web",查询结构肯定是正确的,说明这个title中确实包含这三个词,而且顺序也一样。但是如果ftcontains "the Usability of"或者"and Usability Testing"的话程序就会崩溃。细心查看就会发现,后面这两个查询都包含了"Usability",而这个词在title中出现了两次。好了,问题定位已经完成。
但是要找到产生这个bug的原因,还是得研究源码。对源码分析以后,发现这和XQilla中的fulltext的底层实现策略有关。因为它对每个节点的内容,分词以后将其哈希,如果出现重复单词的话,哈希表中也只存一份,而该单词的位置信息也只是记录该单词第一次出现的位置。这就直接造成了,多个单词的位置判断出现错误。
小结一下:如果要将这个bug去除,可以考虑改变底层的实现策略,不用哈希表,或者改变哈希值的产生式。总之就是要把所有的重复单词都存储起来,更确切的说是将每个单词的所有位置信息都保存好。这样子就不会出现遗漏或者判断失误的现象了。而至于为什么在判断失误的情况下程序就崩溃了(理论上来说如果位置信息判断不满足条件的话,顶多只是说这个title不符合查询条件),有待于进一步分析其结构设计。