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, ')');
}
}
signature.asc
Description: This is a digitally signed message part
