changeset 13110:2beef586a46a

fts-solr: Added fuzzy search support.
author Timo Sirainen <tss@iki.fi>
date Tue, 26 Jul 2011 14:10:41 +0300
parents 2ab237202629
children 7417163fada0
files src/plugins/fts-solr/fts-backend-solr.c
diffstat 1 files changed, 28 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/fts-solr/fts-backend-solr.c	Tue Jul 26 14:09:49 2011 +0300
+++ b/src/plugins/fts-solr/fts-backend-solr.c	Tue Jul 26 14:10:41 2011 +0300
@@ -451,6 +451,30 @@
 	return 0;
 }
 
+static bool solr_need_escaping(const char *str)
+{
+	const char *solr_escape_chars = "+-&|!(){}[]^\"~*?:\\ ";
+
+	for (; *str != '\0'; str++) {
+		if (strchr(solr_escape_chars, *str) != NULL)
+			return TRUE;
+	}
+	return FALSE;
+}
+
+static void solr_add_str_arg(string_t *str, struct mail_search_arg *arg)
+{
+	/* currently we'll just disable fuzzy searching if there are any
+	   parameters that need escaping. solr doesn't seem to give good
+	   fuzzy results even if we did escape them.. */
+	if (!arg->fuzzy || solr_need_escaping(arg->value.str))
+		solr_quote_http(str, arg->value.str);
+	else {
+		str_append(str, arg->value.str);
+		str_append_c(str, '~');
+	}
+}
+
 static bool
 solr_add_definite_query(string_t *str, struct mail_search_arg *arg)
 {
@@ -459,9 +483,9 @@
 		if (arg->match_not)
 			str_append_c(str, '-');
 		str_append(str, "(hdr:");
-		solr_quote_http(str, arg->value.str);
+		solr_add_str_arg(str, arg);
 		str_append(str, "+OR+body:");
-		solr_quote_http(str, arg->value.str);
+		solr_add_str_arg(str, arg);
 		str_append(str, ")");
 		break;
 	}
@@ -469,7 +493,7 @@
 		if (arg->match_not)
 			str_append_c(str, '-');
 		str_append(str, "body:");
-		solr_quote_http(str, arg->value.str);
+		solr_add_str_arg(str, arg);
 		break;
 	case SEARCH_HEADER:
 	case SEARCH_HEADER_ADDRESS:
@@ -481,7 +505,7 @@
 			str_append_c(str, '-');
 		str_append(str, arg->hdr_field_name);
 		str_append_c(str, ':');
-		solr_quote_http(str, arg->value.str);
+		solr_add_str_arg(str, arg);
 		break;
 	default:
 		return FALSE;