]> granicus.if.org Git - postgresql/commitdiff
Fix ts_rank_cd() to ignore stripped lexemes
authorBruce Momjian <bruce@momjian.us>
Mon, 24 Mar 2014 18:36:36 +0000 (14:36 -0400)
committerBruce Momjian <bruce@momjian.us>
Mon, 24 Mar 2014 18:37:16 +0000 (14:37 -0400)
Previously, stripped lexemes got a default location and could be
considered if mixed with non-stripped lexemes.

BACKWARD INCOMPATIBILITY CHANGE

doc/src/sgml/textsearch.sgml
src/backend/utils/adt/tsrank.c
src/test/regress/expected/tsearch.out
src/test/regress/sql/tsearch.sql

index 604e54579dec28464c835ec87f47942bd4296bf7..9e78286bb59c93ec1c5f5eece553efd31d487f1f 100644 (file)
@@ -889,9 +889,13 @@ SELECT plainto_tsquery('english', 'The Fat &amp; Rats:C');
        </para>
 
        <para>
-        This function requires positional information in its input.
-        Therefore it will not work on <quote>stripped</> <type>tsvector</>
-        values &mdash; it will always return zero.
+        This function requires lexeme positional information to perform
+        its calculation.  Therefore, it ignores any <quote>stripped</>
+        lexemes in the <type>tsvector</>.  If there are no unstripped
+        lexemes in the input, the result will be zero.  (See <xref
+        linkend="textsearch-manipulate-tsvector"> for more information
+        about the <function>strip</> function and positional information
+        in <type>tsvector</>s.)
        </para>
       </listitem>
      </varlistentry>
index c9e71c9e21d1bd6e477efbf58b6ffad41cc3dca7..dcb681d085fc931e82f3a0a0f5529327e11aef24 100644 (file)
@@ -658,8 +658,9 @@ get_docrep(TSVector txt, QueryRepresentation *qr, int *doclen)
                        }
                        else
                        {
-                               dimt = POSNULL.npos;
-                               post = POSNULL.pos;
+                               /* ignore words without positions */
+                               entry++;
+                               continue;
                        }
 
                        while (cur + dimt >= len)
index 9341dbe0d77e1723f0c98f7837b5b69b7c748fc3..d22d345145806f25de71a445455ad3ebdc661edd 100644 (file)
@@ -596,6 +596,20 @@ S. T. Coleridge (1772-1834)
         0.1
 (1 row)
 
+SELECT ts_rank_cd(strip(to_tsvector('both stripped')),
+                  to_tsquery('both & stripped'));
+ ts_rank_cd 
+------------
+          0
+(1 row)
+
+SELECT ts_rank_cd(to_tsvector('unstripped') || strip(to_tsvector('stripped')),
+                  to_tsquery('unstripped & stripped'));
+ ts_rank_cd 
+------------
+          0
+(1 row)
+
 --headline tests
 SELECT ts_headline('english', '
 Day after day, day after day,
index 9fd12076acedb0b7c2a617466070b49e76f40778..fa460cd4b9b7b3834cba1bb885c469970de2f5be 100644 (file)
@@ -165,6 +165,12 @@ Water, water, every where,
 S. T. Coleridge (1772-1834)
 '), to_tsquery('english', 'ocean'));
 
+SELECT ts_rank_cd(strip(to_tsvector('both stripped')),
+                  to_tsquery('both & stripped'));
+
+SELECT ts_rank_cd(to_tsvector('unstripped') || strip(to_tsvector('stripped')),
+                  to_tsquery('unstripped & stripped'));
+
 --headline tests
 SELECT ts_headline('english', '
 Day after day, day after day,