예제 #1
0
        private static int DoSearch(SearchOptions opts)
        {
            var timer          = Stopwatch.StartNew();
            var documentsCount = 0;
            var matchesCount   = 0;

            using (var index = IndexFactory.OpenIndex(new PersistentIndexName(".")))
            {
                var searchQuery = index.Compile(opts.Query);
                var prevDoc     = Occurrence.NoId;
                var doc         = default(TextDocument);
                var hits        = new SortedSet <int>();
                foreach (var match in searchQuery.AsEnumerable())
                {
                    if (match.DocumentId != prevDoc)
                    {
                        if (prevDoc != Occurrence.NoId)
                        {
                            PrintConsole(ConsoleColor.Gray, String.Empty);

                            PrintConsole(ConsoleColor.Gray, "====================");
                            doc = new TextDocument(index.GetText(prevDoc, 1UL).ReadToEnd(),
                                                   index.GetPositions(prevDoc, 1UL));
                            PrintConsole(ConsoleColor.Green, doc.Annotate(hits));
                            PrintConsole(ConsoleColor.Gray, "====================");
                            PrintConsole(ConsoleColor.Gray, String.Empty);
                            hits.Clear();
                        }

                        PrintConsole(ConsoleColor.Gray, index.Fields.GetMetadata(match.DocumentId));
                        prevDoc = match.DocumentId;
                        documentsCount++;
                    }
                    ++matchesCount;
                    foreach (var o in match.GetOccurrences())
                    {
                        hits.Add((int)o.TokenId);
                    }
                    PrintConsole(ConsoleColor.Gray, $"{match} ");
                }
                if (prevDoc != Occurrence.NoId)
                {
                    PrintConsole(ConsoleColor.Gray, String.Empty);

                    PrintConsole(ConsoleColor.Gray, "====================");
                    doc = new TextDocument(index.GetText(prevDoc, 1UL).ReadToEnd(),
                                           index.GetPositions(prevDoc, 1UL));
                    PrintConsole(ConsoleColor.Green, doc.Annotate(hits));
                    PrintConsole(ConsoleColor.Gray, "====================");
                    PrintConsole(ConsoleColor.Gray, String.Empty);
                    hits.Clear();
                }
            }

            PrintConsole(ConsoleColor.White, $"Documents found: {documentsCount}, matches: {matchesCount}, time: {timer.Elapsed}");
            return(0);
        }