Esempio n. 1
0
        public bool CreateSubFingerLookupIndex(string luceneIndexPath)
        {
            DateTime startTime = DateTime.Now;
            DateTime endTime   = startTime;

            Console.WriteLine("Creating SubFingerLookup index.");

            int minID;
            int maxID;

            if (!Exec_MySQL_MinAndMax_IDS(out minID, out maxID) && minID >= 1)
            {
                return(false);
            }

            if (!System.IO.Directory.Exists(luceneIndexPath))
            {
                System.IO.Directory.CreateDirectory(luceneIndexPath);
            }
            ClearFolder(luceneIndexPath);


            Lucene.Net.Store.Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(luceneIndexPath));
            IndexWriter iw          = null;
            int         fingerCount = 0;

            try
            {
                iw = new IndexWriter(directory, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED);
                iw.UseCompoundFile = false;
                iw.SetSimilarity(new CDR.Indexer.DefaultSimilarityExtended());
                iw.MergeFactor = 10;                                          // default = 10
                iw.SetRAMBufferSizeMB(512 * 3);                               // use memory to do a flush
                iw.SetMaxBufferedDocs(IndexWriter.DISABLE_AUTO_FLUSH);        // only use memory as trigger to do a flush
                iw.SetMaxBufferedDeleteTerms(IndexWriter.DISABLE_AUTO_FLUSH); // only use memory as trigger to do a flush

                Document doc = new Document();
                doc.Add(new Field("FINGERID", "", Field.Store.YES, Field.Index.NOT_ANALYZED));
                doc.Add(new Field("SUBFINGER", "", Field.Store.NO, Field.Index.ANALYZED));

                Field fFingerID = doc.GetField("FINGERID");
                fFingerID.OmitNorms = true;
                fFingerID.OmitTermFreqAndPositions = true;

                Field fSubFinger = doc.GetField("SUBFINGER");
                fSubFinger.OmitNorms = true;
                fSubFinger.OmitTermFreqAndPositions = true;

                StringBuilder sb = new StringBuilder(256 * 1024);

                int start = minID;
                int count = 5000;
                while (start <= maxID)
                {
                    DataTable dt;
                    if (Exec_MySQL_LOADSUBFINGERIDS(start, (start + count - 1), out dt))
                    {
                        foreach (DataRow row in dt.Rows)
                        {
                            fingerCount++;
                            if ((fingerCount % 100) == 0 || fingerCount <= 1)
                            {
                                Console.Write("\rIndexing subfingerprint #" + fingerCount.ToString());
                            }

                            FingerprintSignature fingerprint = new FingerprintSignature((string)row["TITELNUMMERTRACK"], Convert.ToInt64(row["TITELNUMMERTRACK_ID"]), (byte[])row["SIGNATURE"], Convert.ToInt64(row["DURATIONINMS"]));

                            sb.Clear();
                            for (int i = 0; i < fingerprint.SubFingerprintCount; i++)
                            {
                                uint subFingerValue = fingerprint.SubFingerprint(i);
                                int  bits           = AudioFingerprint.Math.SimilarityUtility.HammingDistance(subFingerValue, 0);
                                if (bits < 10 || bits > 22) // 5 27
                                {
                                    continue;
                                }
                                sb.Append(subFingerValue.ToString());
                                sb.Append(' ');
                            }
                            fFingerID.SetValue(row["TITELNUMMERTRACK_ID"].ToString());
                            fSubFinger.SetValue(sb.ToString());

                            iw.AddDocument(doc);
                        } //foreach
                        Console.Write("\rIndexing subfingerprint #" + fingerCount.ToString());

                        start += count;
                    } //if
                    else
                    {
                        if (!RetryDatabaseError())
                        {
                            return(false);
                        }
                    }
                } // while alle fingerprints
            }
            finally
            {
                Console.WriteLine();
                Console.WriteLine("Optimizing.");
                if (iw != null)
                {
                    // Optimaliseer de index nu
                    iw.Commit();
                    iw.Optimize(1, true);
                    iw.Dispose();
                    iw = null;
                    GC.WaitForPendingFinalizers();
                }
            }


            endTime = DateTime.Now;
            TimeSpan ts = (endTime - startTime);

            Console.WriteLine(String.Format("Elapsed index time {0:00}:{1:00}:{2:00}.{3:000}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds));
            Console.WriteLine();

            return(true);
        }