lucene的又一问题

    这段时间在项目中又发现lucene的一个问题,例如搜索某一个关键词"愤怒的小鸟太空版",在屏蔽lengNorm全命中的情况下,原则上说score值肯定会一样,但是会出现score值不一样的时候,只是之间的差值很小很小,基本上可以忽略不计,可最终也会影响排序,比如5.232345 5.2323448 之间的差值只有0.0000002。
    分析lucene源代码发现是在搜索时候idf值不一样导致了结果的不对,由于修改lucene的源代码不太现实,最后的解决办事是扩展Similarity,将idf值的小数点后4位之后的全部去掉,比如值为:5.2323448,改为5.2323扩展源码如下:
   
        public float idf(int docFreq, int numDocs) {
      float idf = (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
      idf=(int)(idf*10000)/10000.0000f;
      return idf;
    }      

    

    这样处理并一定是最好的解决方案,但暂时解决了项目中遇到的问题,如果要完美的解决这个问题,要么等lucene更新,要么自己修改lucene的源代码。

猜你喜欢

转载自hufuli.iteye.com/blog/1530251