Я надеюсь по русски тут понимают :))

Когда в 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]

Reply via email to