Loading include/ft_global.h +1 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ extern const char *ft_precompiled_stopwords[]; extern ulong ft_min_word_len; extern ulong ft_max_word_len; extern ulong ft_max_word_len_for_sort; extern char *ft_boolean_syntax; int ft_init_stopwords(const char **); void ft_free_stopwords(void); Loading myisam/ft_boolean_search.c +37 −20 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ static double _wghts[11]={ 3.375000000000000, 5.062500000000000, 7.593750000000000}; static double *wghts=_wghts+5; // wghts[i] = 1.5**i static double *wghts=_wghts+5; /* wghts[i] = 1.5**i */ static double _nwghts[11]={ -0.065843621399177, Loading @@ -50,7 +50,7 @@ static double _nwghts[11]={ -1.687500000000000, -2.531250000000000, -3.796875000000000}; static double *nwghts=_nwghts+5; // nwghts[i] = -0.5*1.5**i static double *nwghts=_nwghts+5; /* nwghts[i] = -0.5*1.5**i */ typedef struct st_ftb_expr FTB_EXPR; struct st_ftb_expr { Loading Loading @@ -114,20 +114,7 @@ void _ftb_parse_query(FTB *ftb, byte **start, byte *end, byte r=param.plusminus; float weight=(param.pmsign ? nwghts : wghts)[(r>5)?5:((r<-5)?-5:r)]; switch (res) { case FTB_LBR: ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR)); ftbe->yesno=param.yesno; ftbe->weight=weight; ftbe->up=up; ftbe->ythresh=0; ftbe->docid=HA_POS_ERROR; if (ftbe->yesno > 0) up->ythresh++; _ftb_parse_query(ftb, start, end, ftbe, depth+1, (param.yesno<0 ? depth+1 : ndepth)); break; case FTB_RBR: return; case 1: case 1: /* word found */ ftbw=(FTB_WORD *)alloc_root(&ftb->mem_root, sizeof(FTB_WORD) + (param.trunc ? MI_MAX_KEY_BUFF : w.len+extra)); ftbw->len=w.len+1; Loading @@ -142,6 +129,19 @@ void _ftb_parse_query(FTB *ftb, byte **start, byte *end, if (ftbw->yesno > 0) up->ythresh++; queue_insert(& ftb->queue, (byte *)ftbw); break; case 2: /* left bracket */ ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR)); ftbe->yesno=param.yesno; ftbe->weight=weight; ftbe->up=up; ftbe->ythresh=0; ftbe->docid=HA_POS_ERROR; if (ftbe->yesno > 0) up->ythresh++; _ftb_parse_query(ftb, start, end, ftbe, depth+1, (param.yesno<0 ? depth+1 : ndepth)); break; case 3: /* right bracket */ return; } } return; Loading Loading @@ -339,7 +339,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) /* curdoc matched ! */ info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); /* why is this ? */ /* info->lastpos=curdoc; */ /* do I need this ? */ info->lastpos=curdoc; if (!(*info->read_record)(info,curdoc,record)) { info->update|= HA_STATE_AKTIV; /* Record is read */ Loading @@ -348,6 +348,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) return my_errno; } } ftb->state=INDEX_DONE; return my_errno=HA_ERR_END_OF_FILE; } Loading @@ -359,17 +360,33 @@ float ft_boolean_find_relevance(FT_INFO *ftb, my_off_t docid, byte *record) FTB_EXPR *ftbe; uint i; if (ftb->state == READY) if (ftb->state == READY || ftb->state == INDEX_DONE) { for (i=1; i<=ftb->queue.elements; i++) { ftbw=(FTB_WORD *)(ftb->queue.root[i]); ftbw->docid=HA_POS_ERROR; for (ftbe=ftbw->up; ftbe; ftbe=ftbe->up) { if (ftbe->docid != HA_POS_ERROR) { ftbe->cur_weight=ftbe->yesses=ftbe->nos=0; ftbe->docid=HA_POS_ERROR; } else break; } } queue_fix(& ftb->queue); ftb->state=SCAN; } else if (ftb->state != SCAN) return -1.0; return -2.0; bzero(&ptree, sizeof(ptree)); if (_mi_ft_parse(& ptree, ftb->info, ftb->keynr, record)) return -1.0; return -3.0; for (i=1; i<=ftb->queue.elements; i++) { Loading myisam/ft_nlq_search.c +1 −1 Original line number Diff line number Diff line Loading @@ -253,7 +253,7 @@ float ft_nlq_find_relevance(FT_INFO *handler, my_off_t docid, int a,b,c; FT_DOC *docs=handler->doc; // Assuming docs[] is sorted by dpos... /* Assuming docs[] is sorted by dpos... */ for (a=0, b=handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2) { Loading myisam/ft_parser.c +18 −20 Original line number Diff line number Diff line Loading @@ -33,9 +33,6 @@ typedef struct st_ft_docstat { double max, nsum, nsum2; #endif /* EVAL_RUN */ // MI_INFO *info; // uint keynr; // byte *keybuf; } FT_DOCSTAT; static int FT_WORD_cmp(void* cmp_arg, FT_WORD *w1, FT_WORD *w2) Loading Loading @@ -63,9 +60,7 @@ static int walk_and_copy(FT_WORD *word,uint32 count,FT_DOCSTAT *docstat) /* transforms tree of words into the array, applying normalization */ FT_WORD * ft_linearize(//MI_INFO *info, uint keynr, //byte *keybuf, TREE *wtree) FT_WORD * ft_linearize(TREE *wtree) { FT_WORD *wlist,*p; FT_DOCSTAT docstat; Loading @@ -74,9 +69,6 @@ FT_WORD * ft_linearize(//MI_INFO *info, uint keynr, if ((wlist=(FT_WORD *) my_malloc(sizeof(FT_WORD)* (1+wtree->elements_in_tree),MYF(0)))) { // docstat.info=info; // docstat.keynr=keynr; // docstat.keybuf=keybuf; docstat.list=wlist; docstat.uniq=wtree->elements_in_tree; #ifdef EVAL_RUN Loading Loading @@ -122,12 +114,20 @@ FT_WORD * ft_linearize(//MI_INFO *info, uint keynr, #endif #define word_char(X) (true_word_char(X) || misc_word_char(X)) /* returns: * 0 - eof * 1 - word found * 2 - left bracket * 3 - right bracket */ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param) { byte *doc=*start; int mwc; param->yesno=param->plusminus=param->pmsign=0; param->yesno=(FTB_YES==' ')?1:0; param->plusminus=param->pmsign=0; while (doc<end) { Loading @@ -138,18 +138,16 @@ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param) { /* param->prev=' '; */ *start=doc+1; return *doc; return (*doc == FTB_RBR)+2; } if (param->prev == ' ') { switch (*doc) { case FTB_YES: param->yesno=+1; continue; case FTB_NO: param->yesno=-1; continue; case FTB_INC: param->plusminus++; continue; case FTB_DEC: param->plusminus--; continue; case FTB_NEG: param->pmsign=!param->pmsign; continue; default: break; } if (*doc == FTB_YES ) { param->yesno=+1; continue; } else if (*doc == FTB_EGAL) { param->yesno= 0; continue; } else if (*doc == FTB_NO ) { param->yesno=-1; continue; } else if (*doc == FTB_INC ) { param->plusminus++; continue; } else if (*doc == FTB_DEC ) { param->plusminus--; continue; } else if (*doc == FTB_NEG ) { param->pmsign=!param->pmsign; continue; } } param->prev=*doc; param->yesno=param->plusminus=param->pmsign=0; Loading @@ -162,7 +160,7 @@ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param) else if (!misc_word_char(*doc) || mwc++) break; param->prev='A'; // be sure *prev is true_word_char param->prev='A'; /* be sure *prev is true_word_char */ word->len= (uint)(doc-word->pos) - mwc; if ((param->trunc=(doc<end && *doc == FTB_TRUNC))) doc++; Loading myisam/ft_static.c +1 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ ulong ft_min_word_len=4; ulong ft_max_word_len=HA_FT_MAXLEN; ulong ft_max_word_len_for_sort=20; char *ft_boolean_syntax="+ -><()~*"; const MI_KEYSEG ft_keysegs[FT_SEGS]={ { Loading Loading
include/ft_global.h +1 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ extern const char *ft_precompiled_stopwords[]; extern ulong ft_min_word_len; extern ulong ft_max_word_len; extern ulong ft_max_word_len_for_sort; extern char *ft_boolean_syntax; int ft_init_stopwords(const char **); void ft_free_stopwords(void); Loading
myisam/ft_boolean_search.c +37 −20 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ static double _wghts[11]={ 3.375000000000000, 5.062500000000000, 7.593750000000000}; static double *wghts=_wghts+5; // wghts[i] = 1.5**i static double *wghts=_wghts+5; /* wghts[i] = 1.5**i */ static double _nwghts[11]={ -0.065843621399177, Loading @@ -50,7 +50,7 @@ static double _nwghts[11]={ -1.687500000000000, -2.531250000000000, -3.796875000000000}; static double *nwghts=_nwghts+5; // nwghts[i] = -0.5*1.5**i static double *nwghts=_nwghts+5; /* nwghts[i] = -0.5*1.5**i */ typedef struct st_ftb_expr FTB_EXPR; struct st_ftb_expr { Loading Loading @@ -114,20 +114,7 @@ void _ftb_parse_query(FTB *ftb, byte **start, byte *end, byte r=param.plusminus; float weight=(param.pmsign ? nwghts : wghts)[(r>5)?5:((r<-5)?-5:r)]; switch (res) { case FTB_LBR: ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR)); ftbe->yesno=param.yesno; ftbe->weight=weight; ftbe->up=up; ftbe->ythresh=0; ftbe->docid=HA_POS_ERROR; if (ftbe->yesno > 0) up->ythresh++; _ftb_parse_query(ftb, start, end, ftbe, depth+1, (param.yesno<0 ? depth+1 : ndepth)); break; case FTB_RBR: return; case 1: case 1: /* word found */ ftbw=(FTB_WORD *)alloc_root(&ftb->mem_root, sizeof(FTB_WORD) + (param.trunc ? MI_MAX_KEY_BUFF : w.len+extra)); ftbw->len=w.len+1; Loading @@ -142,6 +129,19 @@ void _ftb_parse_query(FTB *ftb, byte **start, byte *end, if (ftbw->yesno > 0) up->ythresh++; queue_insert(& ftb->queue, (byte *)ftbw); break; case 2: /* left bracket */ ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR)); ftbe->yesno=param.yesno; ftbe->weight=weight; ftbe->up=up; ftbe->ythresh=0; ftbe->docid=HA_POS_ERROR; if (ftbe->yesno > 0) up->ythresh++; _ftb_parse_query(ftb, start, end, ftbe, depth+1, (param.yesno<0 ? depth+1 : ndepth)); break; case 3: /* right bracket */ return; } } return; Loading Loading @@ -339,7 +339,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) /* curdoc matched ! */ info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); /* why is this ? */ /* info->lastpos=curdoc; */ /* do I need this ? */ info->lastpos=curdoc; if (!(*info->read_record)(info,curdoc,record)) { info->update|= HA_STATE_AKTIV; /* Record is read */ Loading @@ -348,6 +348,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) return my_errno; } } ftb->state=INDEX_DONE; return my_errno=HA_ERR_END_OF_FILE; } Loading @@ -359,17 +360,33 @@ float ft_boolean_find_relevance(FT_INFO *ftb, my_off_t docid, byte *record) FTB_EXPR *ftbe; uint i; if (ftb->state == READY) if (ftb->state == READY || ftb->state == INDEX_DONE) { for (i=1; i<=ftb->queue.elements; i++) { ftbw=(FTB_WORD *)(ftb->queue.root[i]); ftbw->docid=HA_POS_ERROR; for (ftbe=ftbw->up; ftbe; ftbe=ftbe->up) { if (ftbe->docid != HA_POS_ERROR) { ftbe->cur_weight=ftbe->yesses=ftbe->nos=0; ftbe->docid=HA_POS_ERROR; } else break; } } queue_fix(& ftb->queue); ftb->state=SCAN; } else if (ftb->state != SCAN) return -1.0; return -2.0; bzero(&ptree, sizeof(ptree)); if (_mi_ft_parse(& ptree, ftb->info, ftb->keynr, record)) return -1.0; return -3.0; for (i=1; i<=ftb->queue.elements; i++) { Loading
myisam/ft_nlq_search.c +1 −1 Original line number Diff line number Diff line Loading @@ -253,7 +253,7 @@ float ft_nlq_find_relevance(FT_INFO *handler, my_off_t docid, int a,b,c; FT_DOC *docs=handler->doc; // Assuming docs[] is sorted by dpos... /* Assuming docs[] is sorted by dpos... */ for (a=0, b=handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2) { Loading
myisam/ft_parser.c +18 −20 Original line number Diff line number Diff line Loading @@ -33,9 +33,6 @@ typedef struct st_ft_docstat { double max, nsum, nsum2; #endif /* EVAL_RUN */ // MI_INFO *info; // uint keynr; // byte *keybuf; } FT_DOCSTAT; static int FT_WORD_cmp(void* cmp_arg, FT_WORD *w1, FT_WORD *w2) Loading Loading @@ -63,9 +60,7 @@ static int walk_and_copy(FT_WORD *word,uint32 count,FT_DOCSTAT *docstat) /* transforms tree of words into the array, applying normalization */ FT_WORD * ft_linearize(//MI_INFO *info, uint keynr, //byte *keybuf, TREE *wtree) FT_WORD * ft_linearize(TREE *wtree) { FT_WORD *wlist,*p; FT_DOCSTAT docstat; Loading @@ -74,9 +69,6 @@ FT_WORD * ft_linearize(//MI_INFO *info, uint keynr, if ((wlist=(FT_WORD *) my_malloc(sizeof(FT_WORD)* (1+wtree->elements_in_tree),MYF(0)))) { // docstat.info=info; // docstat.keynr=keynr; // docstat.keybuf=keybuf; docstat.list=wlist; docstat.uniq=wtree->elements_in_tree; #ifdef EVAL_RUN Loading Loading @@ -122,12 +114,20 @@ FT_WORD * ft_linearize(//MI_INFO *info, uint keynr, #endif #define word_char(X) (true_word_char(X) || misc_word_char(X)) /* returns: * 0 - eof * 1 - word found * 2 - left bracket * 3 - right bracket */ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param) { byte *doc=*start; int mwc; param->yesno=param->plusminus=param->pmsign=0; param->yesno=(FTB_YES==' ')?1:0; param->plusminus=param->pmsign=0; while (doc<end) { Loading @@ -138,18 +138,16 @@ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param) { /* param->prev=' '; */ *start=doc+1; return *doc; return (*doc == FTB_RBR)+2; } if (param->prev == ' ') { switch (*doc) { case FTB_YES: param->yesno=+1; continue; case FTB_NO: param->yesno=-1; continue; case FTB_INC: param->plusminus++; continue; case FTB_DEC: param->plusminus--; continue; case FTB_NEG: param->pmsign=!param->pmsign; continue; default: break; } if (*doc == FTB_YES ) { param->yesno=+1; continue; } else if (*doc == FTB_EGAL) { param->yesno= 0; continue; } else if (*doc == FTB_NO ) { param->yesno=-1; continue; } else if (*doc == FTB_INC ) { param->plusminus++; continue; } else if (*doc == FTB_DEC ) { param->plusminus--; continue; } else if (*doc == FTB_NEG ) { param->pmsign=!param->pmsign; continue; } } param->prev=*doc; param->yesno=param->plusminus=param->pmsign=0; Loading @@ -162,7 +160,7 @@ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param) else if (!misc_word_char(*doc) || mwc++) break; param->prev='A'; // be sure *prev is true_word_char param->prev='A'; /* be sure *prev is true_word_char */ word->len= (uint)(doc-word->pos) - mwc; if ((param->trunc=(doc<end && *doc == FTB_TRUNC))) doc++; Loading
myisam/ft_static.c +1 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ ulong ft_min_word_len=4; ulong ft_max_word_len=HA_FT_MAXLEN; ulong ft_max_word_len_for_sort=20; char *ft_boolean_syntax="+ -><()~*"; const MI_KEYSEG ft_keysegs[FT_SEGS]={ { Loading