X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=3a2491a4e09774694f0f977ffaab227c79f54c91;hb=2d8e1f86f73086330f4e9fd181d98542529ee1f9;hp=384aa1c731c109921b5db33d3a3f58c5a3d9493e;hpb=e16099ccf0ad1aab3ff7930bc4ea542357af0e38;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index 384aa1c..3a2491a 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -4,7 +4,16 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.7 1995-09-07 13:58:36 adam + * Revision 1.10 1995-09-11 15:23:26 adam + * More work on relevance search. + * + * 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 * New parameter: result-set file descriptor (RSFD) to support multiple * positions within the same result-set. * Boolean operators: and, or, not implemented. @@ -41,22 +50,90 @@ #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 = 10; + 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) { - char termz[256]; +#if 0 + Z_Term *term = zapt->term; + char termz[IT_MAX_WORD+1]; size_t sizez; struct rset_isam_parms parms; const char *info; - Z_Term *term = zapt->term; + int i; if (term->which != Z_Term_general) return NULL; sizez = term->u.general->len; - if (sizez > 255) - sizez = 255; - memcpy (termz, term->u.general->buf, sizez); - termz[sizez] = '\0'; + if (sizez > IT_MAX_WORD) + sizez = IT_MAX_WORD; + for (i = 0; iu.general->buf[i]); + termz[i] = '\0'; logf (LOG_DEBUG, "dict_lookup: %s", termz); if (!(info = dict_lookup (zi->wordDict, termz))) return rset_create (rset_kind_null, NULL); @@ -65,6 +142,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)