Mercurial > dovecot > core-2.2
changeset 18474:9974c748f72a
fts-solr: fts_solr=use_libfts send data to Solr via space-separated tokens.
In this case Solr should be configured to not do any kind of filtering and
use only WhitespaceTokenizerFactory.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 24 Apr 2015 14:25:06 +0300 |
parents | 066db31d4dea |
children | daa426965e5a |
files | src/plugins/fts-solr/fts-backend-solr.c src/plugins/fts-solr/fts-solr-plugin.c src/plugins/fts-solr/fts-solr-plugin.h |
diffstat | 3 files changed, 29 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/fts-solr/fts-backend-solr.c Fri Apr 24 14:08:51 2015 +0300 +++ b/src/plugins/fts-solr/fts-backend-solr.c Fri Apr 24 14:25:06 2015 +0300 @@ -50,6 +50,7 @@ uint32_t last_indexed_uid; + unsigned int tokenized_input:1; unsigned int last_indexed_uid_set:1; unsigned int body_open:1; unsigned int documents_added:1; @@ -165,6 +166,11 @@ *error_r = "Invalid fts_solr setting"; return -1; } + if (fuser->set.use_libfts) { + /* change our flags so we get proper input */ + _backend->flags &= ~FTS_BACKEND_FLAG_FUZZY_SEARCH; + _backend->flags |= FTS_BACKEND_FLAG_TOKENIZED_INPUT; + } return solr_connection_init(fuser->set.url, fuser->set.debug, &backend->solr_conn, error_r); } @@ -249,6 +255,8 @@ ctx = i_new(struct solr_fts_backend_update_context, 1); ctx->ctx.backend = _backend; + ctx->tokenized_input = + (_backend->flags & FTS_BACKEND_FLAG_TOKENIZED_INPUT) != 0; i_array_init(&ctx->fields, 16); return &ctx->ctx; } @@ -547,13 +555,21 @@ size -= len; } xml_encode_data(ctx->cmd, data, size); + if (ctx->tokenized_input) + str_append_c(ctx->cmd, ' '); } else { - if (!ctx->truncate_header) + if (!ctx->truncate_header) { xml_encode_data(ctx->cur_value, data, size); + if (ctx->tokenized_input) + str_append_c(ctx->cur_value, ' '); + } if (ctx->cur_value2 != NULL && (!ctx->truncate_header || - str_len(ctx->cur_value2) < SOLR_HEADER_LINE_MAX_TRUNC_SIZE)) + str_len(ctx->cur_value2) < SOLR_HEADER_LINE_MAX_TRUNC_SIZE)) { xml_encode_data(ctx->cur_value2, data, size); + if (ctx->tokenized_input) + str_append_c(ctx->cur_value2, ' '); + } } if (str_len(ctx->cmd) >= SOLR_CMDBUF_FLUSH_SIZE) {
--- a/src/plugins/fts-solr/fts-solr-plugin.c Fri Apr 24 14:08:51 2015 +0300 +++ b/src/plugins/fts-solr/fts-solr-plugin.c Fri Apr 24 14:25:06 2015 +0300 @@ -6,6 +6,7 @@ #include "mail-user.h" #include "mail-storage-hooks.h" #include "solr-connection.h" +#include "fts-user.h" #include "fts-solr-plugin.h" #include <stdlib.h> @@ -30,6 +31,8 @@ set->url = p_strdup(user->pool, *tmp + 4); } else if (strcmp(*tmp, "debug") == 0) { set->debug = TRUE; + } else if (strcmp(*tmp, "use_libfts") == 0) { + set->use_libfts = TRUE; } else if (strcmp(*tmp, "break-imap-search") == 0) { /* for backwards compatibility */ } else if (strcmp(*tmp, "default_ns=") == 0) { @@ -50,12 +53,19 @@ static void fts_solr_mail_user_create(struct mail_user *user, const char *env) { struct fts_solr_user *fuser; + const char *error; fuser = p_new(user->pool, struct fts_solr_user, 1); if (fts_solr_plugin_init_settings(user, &fuser->set, env) < 0) { /* invalid settings, disabling */ return; } + if (fuser->set.use_libfts) { + if (fts_mail_user_create(user, &error) < 0) { + i_error("fts-solr: %s", error); + return; + } + } MODULE_CONTEXT_SET(user, fts_solr_user_module, fuser); }