Я надеюсь по русски тут понимают :)) Когда в indexer.conf включено несколько словарей с близкими языками (например русский и украинский) то некоторые слова попадаются в обоих, но с разными флагами естественно. Соответственно когда NormalizeWord проверяет есть ли слово в словаре он может получить либо с лово из правильного словаря с правильными флагами, либо из не правильного. Соответственно когда он получает слово из не правильного при проверке флагов оно считается не тем и мы засовываем в базу оригинальную форму, которую юзер должен угадать в запросе. Вторая проблема - когда мы грузим словарь из 200000 слов (english.dict) в постгрес без начала/конца транзакции база начинает sync'аться после каждого insert'а - что естественно приводит к тормозам неимоверным. Соответственно для борьбы с этими явлениями прилагается патчик. На истину в последней инстанции не претендую, но у меня работает :)) OS: FreeBSD-4/5 DB: PostgreSQL-7.0.2 Да, еще там qsort на mergesort заменен - mergesort на предварительно сортированных массивах (а словари именно такие как правило) значительно быстрее работает :)) PS: на рассылку еще не подписан, так что просьба CC: оставлять diff -ru ../udmsearch-3.0.19/include/udm_db.h ./include/udm_db.h --- ../udmsearch-3.0.19/include/udm_db.h Wed Jun 28 14:01:48 2000 +++ ./include/udm_db.h Sat Jul 8 22:19:37 2000 @@ -89,6 +89,8 @@ extern UDM_SPELL * UdmFindWordDB(char *); extern int UdmInsertAffix(UDM_INDEXER *,char ,char *,char *,char *,char *,char *); extern int UdmDBImportAffixes(void *); +extern int UdmBeginWork(UDM_INDEXER *); +extern int UdmEndWork(UDM_INDEXER *); extern __INDLIB__ int UdmAddTagLimit(int tag); extern __INDLIB__ int UdmAddStatusLimit(int status); diff -ru ../udmsearch-3.0.19/src/spell.c ./src/spell.c --- ../udmsearch-3.0.19/src/spell.c Mon May 15 20:44:59 2000 +++ ./src/spell.c Sun Jul 9 01:14:04 2000 @@ -35,7 +35,9 @@ static UDM_SPELL * Spell=NULL; static int cmpspell(const void *s1,const void *s2){ - return(strcmp(((UDM_SPELL*)s1)->word,((UDM_SPELL*)s2)->word)); + int r=strcmp(((UDM_SPELL*)s1)->word,((UDM_SPELL*)s2)->word); + if (r) return r; + return strncmp(((UDM_SPELL*)s1)->lang,((UDM_SPELL*)s2)->lang,2); } @@ -67,6 +69,7 @@ LCharset=UdmGetDefaultCharset(); if(!(dict=fopen(filename,"r")))return(1); + while(fgets(str,sizeof(str),dict)){ if((flag=strchr(str,'/'))){ @@ -112,7 +115,8 @@ int LCharset; LCharset=UdmGetDefaultCharset(); - if(!(dict=fopen(filename,"r")))return(1); + if(!(dict=fopen(filename,"r"))) return(1); + UdmBeginWork(Indexer); while(fgets(str,sizeof(str),dict)){ if((flag=strchr(str,'/'))){ @@ -150,9 +154,14 @@ else imp++; } + if (imp%1000==0) { + fprintf(stderr,"%d ",imp); + fflush(stderr); + }; } fclose(dict); + UdmEndWork(Indexer); if(!dump) printf("%d words imported, %d errors\n",imp,rej); return(0); @@ -189,6 +198,38 @@ return(NULL); } +UDM_SPELL * UdmFindWordLang(char *word,char *lang){ +register int l,c,r,res; + + if (ispell_mode == UDM_ISPELL_MODE_TEXT) { + l=0;r=nspell-1; + + while(l<=r){ + c=(l+r)>>1; + res=strcmp(Spell[c].word,word); + if (!res) + res=strncmp(Spell[c].lang,lang,2); + + if(res<0){ + l=c+1; + continue; + } + if(res>0){ + r=c-1; + continue; + } + if(!res){ + Spell[c].code=c; + return(&Spell[c]); + } + } + } else { + return (UDM_SPELL *)UdmFindWordDB(word); + } + + return(NULL); +} + int UdmAddAffix(char flag,char * lang,char *mask,char *find,char *repl) { #define ERRSTRSIZE 100 @@ -321,7 +362,7 @@ } void UdmSortDictionary(){ - qsort((void*)Spell,nspell,sizeof(UDM_SPELL),cmpspell); + mergesort((void*)Spell,nspell,sizeof(UDM_SPELL),cmpspell); /* c=Spell[0].word[0]; for(i=0;i<c;i++)markers[i]=0; @@ -369,7 +410,7 @@ /* Check that built newword is possibly normal form */ /* is in the dictionary */ - if((curspell=UdmFindWord(newword))){ + if((curspell=UdmFindWordLang(newword,Affix[i].lang))){ if(strchr(curspell->flag,Affix[i].flag)){ if(!(err=regexec(&(Affix[i].reg), newword,NS,subs,0))){ diff -ru ../udmsearch-3.0.19/src/sql.c ./src/sql.c --- ../udmsearch-3.0.19/src/sql.c Tue Jun 27 10:32:53 2000 +++ ./src/sql.c Sat Jul 8 22:18:40 2000 @@ -2697,6 +2697,16 @@ sql_query(((DB*)(Indexer->db)),qbuf);return(UdmDBErrorCode(Indexer->db)); } +int UdmBeginWork(UDM_INDEXER *Indexer){ + sql_query(((DB*)(Indexer->db)),"BEGIN WORK"); + return(UdmDBErrorCode(Indexer->db)); +} + +int UdmEndWork(UDM_INDEXER *Indexer){ + sql_query(((DB*)(Indexer->db)),"END WORK"); + return(UdmDBErrorCode(Indexer->db)); +} + __INDLIB__ int UdmGetStatistics(UDM_INDEXER *Indexer){ int i,j; char qbuf[UDMSTRSIZ]; ______________ If you want to unsubscribe send "unsubscribe udmsearch" to [EMAIL PROTECTED]