7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $PostgreSQL: pgsql/src/backend/utils/adt/tsrank.c,v 1.8 2007/09/20 18:10:57 teodor Exp $
10
+ * $PostgreSQL: pgsql/src/backend/utils/adt/tsrank.c,v 1.9 2007/11/14 23:43:27 tgl Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
@@ -25,13 +25,14 @@ static float weights[] = {0.1f, 0.2f, 0.4f, 1.0f};
25
25
26
26
#define wpos (wep ) ( w[ WEP_GETWEIGHT(wep) ] )
27
27
28
- #define RANK_NO_NORM 0x00
28
+ #define RANK_NO_NORM 0x00
29
29
#define RANK_NORM_LOGLENGTH 0x01
30
- #define RANK_NORM_LENGTH 0x02
31
- #define RANK_NORM_EXTDIST 0x04
32
- #define RANK_NORM_UNIQ 0x08
33
- #define RANK_NORM_LOGUNIQ 0x10
34
- #define DEF_NORM_METHOD RANK_NO_NORM
30
+ #define RANK_NORM_LENGTH 0x02
31
+ #define RANK_NORM_EXTDIST 0x04
32
+ #define RANK_NORM_UNIQ 0x08
33
+ #define RANK_NORM_LOGUNIQ 0x10
34
+ #define RANK_NORM_RDIVRPLUS1 0x20
35
+ #define DEF_NORM_METHOD RANK_NO_NORM
35
36
36
37
static float calc_rank_or (float * w , TSVector t , TSQuery q );
37
38
static float calc_rank_and (float * w , TSVector t , TSQuery q );
@@ -348,12 +349,17 @@ calc_rank(float *w, TSVector t, TSQuery q, int4 method)
348
349
res /= (float ) len ;
349
350
}
350
351
352
+ /* RANK_NORM_EXTDIST not applicable */
353
+
351
354
if ((method & RANK_NORM_UNIQ ) && t -> size > 0 )
352
355
res /= (float ) (t -> size );
353
356
354
357
if ((method & RANK_NORM_LOGUNIQ ) && t -> size > 0 )
355
358
res /= log ((double ) (t -> size + 1 )) / log (2.0 );
356
359
360
+ if (method & RANK_NORM_RDIVRPLUS1 )
361
+ res /= (res + 1 );
362
+
357
363
return res ;
358
364
}
359
365
@@ -762,7 +768,7 @@ calc_rank_cd(float4 *arrdata, TSVector txt, TSQuery query, int method)
762
768
Wdoc /= (double ) len ;
763
769
}
764
770
765
- if ((method & RANK_NORM_EXTDIST ) && SumDist > 0 )
771
+ if ((method & RANK_NORM_EXTDIST ) && NExtent > 0 && SumDist > 0 )
766
772
Wdoc /= ((double ) NExtent ) / SumDist ;
767
773
768
774
if ((method & RANK_NORM_UNIQ ) && txt -> size > 0 )
@@ -771,6 +777,9 @@ calc_rank_cd(float4 *arrdata, TSVector txt, TSQuery query, int method)
771
777
if ((method & RANK_NORM_LOGUNIQ ) && txt -> size > 0 )
772
778
Wdoc /= log ((double ) (txt -> size + 1 )) / log (2.0 );
773
779
780
+ if (method & RANK_NORM_RDIVRPLUS1 )
781
+ Wdoc /= (Wdoc + 1 );
782
+
774
783
pfree (doc );
775
784
776
785
pfree ( qr .operandexist );
0 commit comments