Mercurial > dovecot > core-2.2
view src/plugins/fts-lucene/fts-backend-lucene.c @ 4621:446646de0c4a HEAD
--with-lucene now enables lucene full text search indexing. Note that using
it breaks IMAP RFC. It also seems to have problems finding texts that have
special characters in them, such as email addresses.
You can anyway enable it by loading fts and fts_lucene plugins and setting
fts=lucene in plugin section.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 18 Sep 2006 02:15:53 +0300 |
parents | |
children | d0e37ed08bdb |
line wrap: on
line source
/* Copyright (C) 2006 Timo Sirainen */ #include "lib.h" #include "lucene-wrapper.h" #include "fts-lucene-plugin.h" struct lucene_fts_backend { struct fts_backend backend; struct lucene_index *index; uint32_t last_uid; }; static struct fts_backend *fts_backend_lucene_init(const char *path) { struct lucene_fts_backend *backend; backend = i_new(struct lucene_fts_backend, 1); backend->backend = fts_backend_lucene; backend->index = lucene_index_init(path); return &backend->backend; } static void fts_backend_lucene_deinit(struct fts_backend *_backend) { struct lucene_fts_backend *backend = (struct lucene_fts_backend *)_backend; lucene_index_deinit(backend->index); i_free(backend); } static struct fts_backend_build_context * fts_backend_lucene_build_init(struct fts_backend *_backend, uint32_t *last_uid_r) { struct lucene_fts_backend *backend = (struct lucene_fts_backend *)_backend; struct fts_backend_build_context *ctx; ctx = i_new(struct fts_backend_build_context, 1); ctx->backend = _backend; if (lucene_index_build_init(backend->index, &backend->last_uid) < 0) ctx->failed = TRUE; *last_uid_r = backend->last_uid; return ctx; } static int fts_backend_lucene_build_more(struct fts_backend_build_context *ctx, uint32_t uid, const unsigned char *data, size_t size) { struct lucene_fts_backend *backend = (struct lucene_fts_backend *)ctx->backend; if (ctx->failed) return -1; i_assert(uid >= backend->last_uid); backend->last_uid = uid; return lucene_index_build_more(backend->index, uid, data, size); } static int fts_backend_lucene_build_deinit(struct fts_backend_build_context *ctx) { struct lucene_fts_backend *backend = (struct lucene_fts_backend *)ctx->backend; int ret = ctx->failed ? -1 : 0; lucene_index_build_deinit(backend->index); i_free(ctx); return ret; } static int fts_backend_lucene_lookup(struct fts_backend *_backend, const char *key, ARRAY_TYPE(seq_range) *result) { struct lucene_fts_backend *backend = (struct lucene_fts_backend *)_backend; return lucene_index_lookup(backend->index, key, result); } static int fts_backend_lucene_filter(struct fts_backend *_backend, const char *key, ARRAY_TYPE(seq_range) *result) { struct lucene_fts_backend *backend = (struct lucene_fts_backend *)_backend; return lucene_index_filter(backend->index, key, result); } struct fts_backend fts_backend_lucene = { "lucene", TRUE, { fts_backend_lucene_init, fts_backend_lucene_deinit, fts_backend_lucene_build_init, fts_backend_lucene_build_more, fts_backend_lucene_build_deinit, fts_backend_lucene_lookup, fts_backend_lucene_filter } };