]> granicus.if.org Git - postgresql/commitdiff
The attached patch implements the soundex difference function which
authorNeil Conway <neilc@samurai.com>
Wed, 26 Jan 2005 08:04:04 +0000 (08:04 +0000)
committerNeil Conway <neilc@samurai.com>
Wed, 26 Jan 2005 08:04:04 +0000 (08:04 +0000)
compares two strings' soundex values for similarity, from Kris Jurka.
Also mark the text_soundex() function as STRICT, to avoid crashing
on NULL input.

contrib/fuzzystrmatch/README.fuzzystrmatch
contrib/fuzzystrmatch/README.soundex
contrib/fuzzystrmatch/fuzzystrmatch.c
contrib/fuzzystrmatch/fuzzystrmatch.h
contrib/fuzzystrmatch/fuzzystrmatch.sql.in

index 876bdef28425c0cb7af7b155a9ec3d65adb19376..ad2d12c3885b205d5682abd3191f23cf45f17383 100644 (file)
  * Folded existing soundex contrib into this one. Renamed text_soundex() (C function)
  * to soundex() for consistency.
  *
+ * difference()
+ * ------------
+ * Return the difference between two strings' soundex values.  Kris Jurka
+ *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation for any purpose, without fee, and without a written agreement
  * is hereby granted, provided that the above copyright notice and this
index ec4f50fd1df9aa49ebecb75b796fd7968a8cd756..5a58655cdcf68ede92085ab4f3620fbd466dc9b5 100644 (file)
@@ -7,15 +7,25 @@ United States Census in 1880, 1900, and 1910, but it has little use
 beyond English names (or the English pronunciation of names), and
 it is not a linguistic tool.
 
+When comparing two soundex values to determine similarity, the
+difference function reports how close the match is on a scale
+from zero to four, with zero being no match and four being an
+exact match.
+
 The following are some usage examples:
 
 SELECT soundex('hello world!');
 
+SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann');
+SELECT soundex('Anne'), soundex('Andrew'), difference('Anne', 'Andrew');
+SELECT soundex('Anne'), soundex('Margaret'), difference('Anne', 'Margaret');
+
 CREATE TABLE s (nm text)\g
 
 insert into s values ('john')\g
 insert into s values ('joan')\g
 insert into s values ('wobbly')\g
+insert into s values ('jack')\g
 
 select * from s
 where soundex(nm) = soundex('john')\g
@@ -58,5 +68,10 @@ FROM s
 WHERE text_sx_eq(nm,'john')\g
 
 SELECT *
-from s
-where s.nm #= 'john';
+FROM s
+WHERE s.nm #= 'john';
+
+SELECT *
+FROM s
+WHERE difference(s.nm, 'john') > 2;
+
index d3627097cfcb05fbeee4f078ff1bb6bc6aba061b..90505a8b2c7ecb9409ca4550956720bfa630585a 100644 (file)
@@ -755,3 +755,23 @@ _soundex(const char *instr, char *outstr)
                ++count;
        }
 }
+
+PG_FUNCTION_INFO_V1(difference);
+
+Datum
+difference(PG_FUNCTION_ARGS)
+{
+       char sndx1[SOUNDEX_LEN+1], sndx2[SOUNDEX_LEN+1];
+       int i, result;
+
+       _soundex(_textout(PG_GETARG_TEXT_P(0)), sndx1);
+       _soundex(_textout(PG_GETARG_TEXT_P(1)), sndx2);
+
+       result = 0;
+       for (i=0; i<SOUNDEX_LEN; i++) {
+               if (sndx1[i] == sndx2[i])
+                       result++;
+       }
+
+       PG_RETURN_INT32(result);
+}
index 05c2022aecbf338d4d798feb1b9001741839b5e3..8253e60ac2277d68fc711d49c4fde9e93989a983 100644 (file)
@@ -60,6 +60,7 @@
 extern Datum levenshtein(PG_FUNCTION_ARGS);
 extern Datum metaphone(PG_FUNCTION_ARGS);
 extern Datum soundex(PG_FUNCTION_ARGS);
+extern Datum difference(PG_FUNCTION_ARGS);
 
 /*
  * Soundex
index 07e6dce7e3304c21b7dda7ad2989b5a18689d8c9..b4e4fadc44949e197eb301d83abe1aacd7dc32ac 100644 (file)
@@ -1,28 +1,30 @@
 -- Adjust this setting to control where the objects get created.
 SET search_path = public;
 
-CREATE FUNCTION levenshtein (text,text)
-RETURNS int
+CREATE FUNCTION levenshtein (text,text) RETURNS int
 AS 'MODULE_PATHNAME','levenshtein'
-LANGUAGE 'C' WITH (iscachable, isstrict);
+LANGUAGE C IMMUTABLE STRICT;
 
-CREATE FUNCTION metaphone (text,int)
-RETURNS text
+CREATE FUNCTION metaphone (text,int) RETURNS text
 AS 'MODULE_PATHNAME','metaphone'
-LANGUAGE 'C' WITH (iscachable, isstrict);
+LANGUAGE C IMMUTABLE STRICT;
 
 CREATE FUNCTION soundex(text) RETURNS text
 AS 'MODULE_PATHNAME', 'soundex'
-LANGUAGE 'C' WITH (iscachable, isstrict);
+LANGUAGE C IMMUTABLE STRICT;
 
 CREATE FUNCTION text_soundex(text) RETURNS text
 AS 'MODULE_PATHNAME', 'soundex'
-LANGUAGE 'C';
+LANGUAGE C IMMUTABLE STRICT;
+
+CREATE FUNCTION difference(text,text) RETURNS int
+AS 'MODULE_PATHNAME', 'difference'
+LANGUAGE C IMMUTABLE STRICT;
 
 CREATE FUNCTION dmetaphone (text) RETURNS text 
-LANGUAGE C IMMUTABLE STRICT
-AS 'MODULE_PATHNAME', 'dmetaphone';
+AS 'MODULE_PATHNAME', 'dmetaphone'
+LANGUAGE C IMMUTABLE STRICT;
 
 CREATE FUNCTION dmetaphone_alt (text) RETURNS text 
-LANGUAGE C IMMUTABLE STRICT
-AS 'MODULE_PATHNAME', 'dmetaphone_alt';
+AS 'MODULE_PATHNAME', 'dmetaphone_alt'
+LANGUAGE C IMMUTABLE STRICT;