Mercurial > dovecot > core-2.2
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;