Esempio n. 1
0
        /// <summary>
        /// Złącza pliki wynikowe obiektów tworzących w plik odwróconego indeksu
        /// 
        /// Złącza wszystkie pliki tymczasowe posortowane wszystkich obiektów celu zapisu indeksu IxStdDiskRIIndex.Writer w jeden plik
        /// posortowany wg ID tokenów rosnąco, wag wystąpień w dokumentach malejąco. Tworzy indeks na plik danych.
        /// </summary>
        private void mergeAll()
        {
            /* Posortowana lista czytaczy plików tymczasowych */
            SortedLinkedList<TmpPostingsFileReader> sordedReaders = new SortedLinkedList<TmpPostingsFileReader>();

            /* Dodaj do listy czytacze plików ze wszystkich obiektów celu zapisu indeksu */
            for (int i = 0; i < writers.Count; i++)
            {
                TmpPostingsFileReader[] readers = writers[i].getTmpPostingsFileReaders();

                foreach (TmpPostingsFileReader reader in readers)
                    sordedReaders.add(reader);
            }

            /* Utwórz strumienie binarne do zapisu danych indeksu i indeksu indeksu i używając ich */
            using (BinaryWriter postingsFileWriter = new BinaryWriter(File.Create(indexDirPath + "postings.dat")),
                                postingsIndexFileWriter = new BinaryWriter(File.Create(indexDirPath + "postings.idx")))
            {
                /* Wybierz czytacz pliku tymczasowego o najniższym ID tokenu, najwyższej wadze (tak są posortowane) */
                TmpPostingsFileReader first = sordedReaders.getFirst();

                /* Na potrzeby tworzenia indeksu */
                uint lastTokenId = first.current().tokenId;
                uint count = 0;
                long offset = 0, startOffset = 0;

                /* Nie istnieje token o ID 0, dlatego musimy mu sztucznie wstawić wpis indeksu (zerowy)
                 * aby mechanizmy działały poprawnie */
                if (lastTokenId == 1)
                    writeIndex(postingsIndexFileWriter, 0, 0);

                do
                {
                    /* Usuń z listy pierwszy czytacz */
                    sordedReaders.remove(first);

                    /* Jeśli zmienił się ID tokenu, zapisz wpis w indeksie */
                    if (first.current().tokenId != lastTokenId)
                    {
                        writeIndex(postingsIndexFileWriter, startOffset, count);
                        lastTokenId = first.current().tokenId;
                        count = 0;
                        startOffset = offset;
                    }

                    /* Zapisz wystąpienie, już bez ID tokenu, do pliku danych indeksu */
                    writePosting(postingsFileWriter, first.current().posting);

                    offset += Posting.size;
                    count++;

                    /* Spróbuj odczytać następne wystąpienie przez czytacz, jeśli to nie koniec jego pliku,
                     * dodaj go do listy (sortowanie zostanie zachowane) */
                    first.moveNext();
                    if (!first.end())
                        sordedReaders.add(first);
                }
                while ((first = sordedReaders.getFirst()) != null); // Póki jest jeszcze jakiś czytacz

                /* Zapisz ostatni wpis indeksu */
                writeIndex(postingsIndexFileWriter, startOffset, count);
            }
        }