X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=51d8510f8cba6c4b79e2b1fb7ce3a0a91a309e1b;hb=0b7781e8c428a4bca098fff6f074fef83c06e560;hp=6a30f80085bfdc6bb0aec83c2e96e739ae2703f7;hpb=7eefa059dbe0c2d4ba24060421940df637d9cca8;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index 6a30f80..51d8510 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.8 1995-09-08 14:52:27 adam + * Revision 1.9 1995-09-11 13:09:35 adam + * More work on relevance feedback. + * + * Revision 1.8 1995/09/08 14:52:27 adam * Minor changes. Dictionary is lower case now. * * Revision 1.7 1995/09/07 13:58:36 adam @@ -44,15 +47,81 @@ #include #include #include +#include + +int split_term (ZServerInfo *zi, Z_Term *term, ISAM_P **isam_ps, int *no) +{ + static ISAM_P isam_p[16]; + int isam_p_indx = 0; + char termz[IT_MAX_WORD+1]; + char term_sub[IT_MAX_WORD+1]; + int sizez, i; + char *p0, *p1; + const char *info; + + if (term->which != Z_Term_general) + return 0; + sizez = term->u.general->len; + if (sizez > IT_MAX_WORD) + sizez = IT_MAX_WORD; + for (i = 0; iu.general->buf[i]); + termz[i] = '\0'; + + p0 = termz; + while (1) + { + if ((p1 = strchr (p0, ' '))) + { + memcpy (term_sub, p0, p1-p0); + term_sub[p1-p0] = '\0'; + } + else + strcpy (term_sub, p0); + logf (LOG_DEBUG, "dict_lookup: %s", term_sub); + if ((info = dict_lookup (zi->wordDict, term_sub))) + { + logf (LOG_DEBUG, " found"); + assert (*info == sizeof(*isam_p)); + memcpy (isam_p + isam_p_indx, info+1, sizeof(*isam_p)); + isam_p_indx++; + } + if (!p1) + break; + p0 = p1+1; + } + *isam_ps = isam_p; + *no = isam_p_indx; + logf (LOG_DEBUG, "%d positions", *no); + return 1; +} + +static RSET rpn_search_APT_relevance (ZServerInfo *zi, + Z_AttributesPlusTerm *zapt) +{ + rset_relevance_parms parms; + + parms.key_size = sizeof(struct it_key); + parms.max_rec = 100; + parms.cmp = key_compare; + parms.is = zi->wordIsam; + split_term (zi, zapt->term, &parms.isam_positions, + &parms.no_isam_positions); + if (parms.no_isam_positions > 0) + return rset_create (rset_kind_relevance, &parms); + else + return rset_create (rset_kind_null, NULL); +} static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt) { +#if 0 + Z_Term *term = zapt->term; char termz[IT_MAX_WORD+1]; size_t sizez; struct rset_isam_parms parms; const char *info; int i; - Z_Term *term = zapt->term; if (term->which != Z_Term_general) return NULL; @@ -70,6 +139,9 @@ static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt) parms.is = zi->wordIsam; logf (LOG_DEBUG, "rset_create isam"); return rset_create (rset_kind_isam, &parms); +#else + return rpn_search_APT_relevance (zi, zapt); +#endif } static RSET rpn_search_ref (ZServerInfo *zi, Z_ResultSetId *resultSetId)