On Sun, 2009-11-22 at 20:35 +0700, [email protected] wrote:
> Timo, thank you for answer. Meanwhile I was trying to setup 
> horde+dovecot+search. Next step was dovecot 1.2.4 + solr 1.4. It works! Now 
> it can find 2 non-latin words.
> 1) I cannot search by substrings - neither "plane" nor "plane*" does find 
> "planet"

Try if attached patch helps?

> 2) Solr can use "plane*" to find "planet". So I think dovecot internally cuts 
> or masks metasymbols.

Yes, and I don't really like changing that. Seems like it could make
things even worse..

diff -r 6541fcc3bf54 src/plugins/fts-solr/fts-backend-solr.c
--- a/src/plugins/fts-solr/fts-backend-solr.c	Mon Nov 23 12:51:07 2009 -0500
+++ b/src/plugins/fts-solr/fts-backend-solr.c	Mon Nov 23 13:03:53 2009 -0500
@@ -157,6 +157,44 @@
 	str_append(dest, "%22");
 }
 
+static void solr_quote_http_search(string_t *dest, const char *str)
+{
+	T_BEGIN {
+		string_t *tmp = t_str_new(64);
+		const char *p;
+
+		for (p = str; *p != '\0'; p++) {
+			switch (*p) {
+			case '+':
+			case '-':
+			case '&':
+			case '|':
+			case '!':
+			case '(':
+			case ')':
+			case '{':
+			case '}':
+			case '[':
+			case ']':
+			case '^':
+			case '"':
+			case '~':
+			case '*':
+			case '?':
+			case ':':
+			case '\\':
+				str_append_c(tmp, '\\');
+				break;
+			}
+			str_append_c(tmp, *p);
+		}
+
+		/* always finish with a wildcard */
+		str_append_c(tmp, '*');
+		solr_connection_http_escape(solr_conn, dest, str_c(tmp));
+	} T_END;
+}
+
 static struct fts_backend *
 fts_backend_solr_init(struct mailbox *box)
 {
@@ -750,17 +788,17 @@
 			/* body only */
 			i_assert((fields[i].flags & FTS_LOOKUP_FLAG_BODY) != 0);
 			str_append(str, "body:");
-			solr_quote_http(str, fields[i].key);
+			solr_quote_http_search(str, fields[i].key);
 		} else if ((fields[i].flags & FTS_LOOKUP_FLAG_BODY) == 0) {
 			/* header only */
 			str_append(str, "hdr:");
-			solr_quote_http(str, fields[i].key);
+			solr_quote_http_search(str, fields[i].key);
 		} else {
 			/* both */
 			str_append(str, "(body:");
-			solr_quote_http(str, fields[i].key);
+			solr_quote_http_search(str, fields[i].key);
 			str_append(str, "+OR+hdr:");
-			solr_quote_http(str, fields[i].key);
+			solr_quote_http_search(str, fields[i].key);
 			str_append_c(str, ')');
 		}
 	}

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to