Beispiel #1
0
        public Task <IEnumerable <ISearchItem> > Search(string pattern, int page)
        {
            using (Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48))
                using (Lucene.Net.Store.Directory index = new SimpleFSDirectory(Path.ChangeExtension(_bookFile.FullName,
                                                                                                     Convert.ToInt32(LuceneVersion.LUCENE_48).ToString())))
                    using (IndexReader reader = DirectoryReader.Open(index))
                    {
                        Lucene.Net.Search.Query query =
                            new QueryParser(LuceneVersion.LUCENE_48, nameof(TabHtmlText.Html), analyzer).Parse(pattern);
                        Lucene.Net.Search.TopScoreDocCollector collector =
                            Lucene.Net.Search.TopScoreDocCollector.Create(512, true);
                        Lucene.Net.Search.IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(reader);
                        searcher.Search(query, collector);
                        Lucene.Net.Search.TopDocs docs = collector.GetTopDocs(page * PageSize, PageSize);

                        QueryScorer scorer      = new QueryScorer(query);
                        Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter(), scorer) // SpanGradientFormatter
                        {
                            TextFragmenter = new SimpleSpanFragmenter(scorer, 30)
                        };

                        IEnumerable <ISearchItem> items = docs.ScoreDocs.Select(scoreDoc =>
                        {
                            Document doc       = searcher.Doc(scoreDoc.Doc);
                            string html        = doc.Get(nameof(TabHtmlText.Html));
                            string[] fragments = highlighter.GetBestFragments(new HTMLStripCharAnalyzer(),
                                                                              nameof(TabHtmlText.Html), html, 3);
                            return(new SearchItem(int.Parse(doc.Get(nameof(TabHtmlText.NumId))), string.Join("\n", fragments)));
                        });

                        return(Task.FromResult(items.ToList().AsEnumerable()));
                    }
        }
Beispiel #2
0
        public List <indexVideo> searchArticles(string queryString, int numberOfResults, bool komin)
        {
            List <indexVideo> resultsList = new List <indexVideo>();

            Lucene.Net.Store.Directory index = publicIndex;
            if (komin)
            {
                index = kominIndex;
            }

            if (!string.IsNullOrEmpty(queryString))
            {
                Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, new[] { "title", "shortDescription" }, analyser);
                try
                {
                    Lucene.Net.Search.Query query = parser.Parse(queryString + "~");

                    Lucene.Net.Search.Searcher searcher = new Lucene.Net.Search.IndexSearcher(index, true);

                    Lucene.Net.Search.TopScoreDocCollector collector = Lucene.Net.Search.TopScoreDocCollector.Create(numberOfResults, true);

                    searcher.Search(query, collector);

                    Lucene.Net.Search.ScoreDoc[] hits = collector.TopDocs().ScoreDocs;

                    if (hits.Length >= 1)
                    {
                        for (int i = 0; i < hits.Length; i++)
                        {
                            indexVideo video = new indexVideo();

                            int   docId = hits[i].Doc;
                            float score = hits[i].Score;

                            Lucene.Net.Documents.Document doc = searcher.Doc(docId);

                            video.bctid            = doc.Get("bctid");
                            video.title            = doc.Get("title");
                            video.score            = score;
                            video.shortDescription = doc.Get("shortDescription");
                            video.imageURL         = doc.Get("imageURL");

                            resultsList.Add(video);
                        }
                    }
                }
                catch (Exception e)
                {
                }
            }
            return(resultsList);
        }
Beispiel #3
0
        private bool videoExistsInIndex(string id, Lucene.Net.Store.Directory index)
        {
            bool exist = false;

            Lucene.Net.Search.TermQuery termQuery    = new Lucene.Net.Search.TermQuery(new Lucene.Net.Index.Term("bctid", id));
            Lucene.Net.Search.Searcher  termSearcher = new Lucene.Net.Search.IndexSearcher(index, true);

            Lucene.Net.Search.TopScoreDocCollector termCollector = Lucene.Net.Search.TopScoreDocCollector.Create(1, true);
            termSearcher.Search(termQuery, termCollector);
            int termResults = termCollector.TopDocs().TotalHits;

            if (termResults > 0)
            {
                exist = true;
            }
            return(exist);
        }
Beispiel #4
0
        /// <summary> This demonstrates a typical paging search scenario, where the search engine presents
        /// pages of size n to the user. The user can then go to the next page if interested in
        /// the next hits.
        ///
        /// When the query is executed for the first time, then only enough results are collected
        /// to fill 5 result pages. If the user wants to page beyond this limit, then the query
        /// is executed another time and all hits are collected.
        ///
        /// </summary>
        public static void  DoPagingSearch(System.IO.StreamReader in_Renamed, Searcher searcher, Query query, int hitsPerPage, bool raw, bool interactive)
        {
            // Collect enough docs to show 5 pages
            TopScoreDocCollector collector = TopScoreDocCollector.create(5 * hitsPerPage, false);

            searcher.Search(query, collector);
            ScoreDoc[] hits = collector.TopDocs().scoreDocs;

            int numTotalHits = collector.GetTotalHits();

            System.Console.Out.WriteLine(numTotalHits + " total matching documents");

            int start = 0;
            int end   = System.Math.Min(numTotalHits, hitsPerPage);

            while (true)
            {
                if (end > hits.Length)
                {
                    System.Console.Out.WriteLine("Only results 1 - " + hits.Length + " of " + numTotalHits + " total matching documents collected.");
                    System.Console.Out.WriteLine("Collect more (y/n) ?");
                    System.String line = in_Renamed.ReadLine();
                    if (line.Length == 0 || line[0] == 'n')
                    {
                        break;
                    }

                    collector = TopScoreDocCollector.create(numTotalHits, false);
                    searcher.Search(query, collector);
                    hits = collector.TopDocs().scoreDocs;
                }

                end = System.Math.Min(hits.Length, start + hitsPerPage);

                for (int i = start; i < end; i++)
                {
                    if (raw)
                    {
                        // output raw format
                        System.Console.Out.WriteLine("doc=" + hits[i].doc + " score=" + hits[i].score);
                        continue;
                    }

                    Document      doc  = searcher.Doc(hits[i].doc);
                    System.String path = doc.Get("path");
                    if (path != null)
                    {
                        System.Console.Out.WriteLine((i + 1) + ". " + path);
                        System.String title = doc.Get("title");
                        if (title != null)
                        {
                            System.Console.Out.WriteLine("   Title: " + doc.Get("title"));
                        }
                    }
                    else
                    {
                        System.Console.Out.WriteLine((i + 1) + ". " + "No path for this document");
                    }
                }

                if (!interactive)
                {
                    break;
                }

                if (numTotalHits >= end)
                {
                    bool quit = false;
                    while (true)
                    {
                        System.Console.Out.Write("Press ");
                        if (start - hitsPerPage >= 0)
                        {
                            System.Console.Out.Write("(p)revious page, ");
                        }
                        if (start + hitsPerPage < numTotalHits)
                        {
                            System.Console.Out.Write("(n)ext page, ");
                        }
                        System.Console.Out.WriteLine("(q)uit or enter number to jump to a page.");

                        System.String line = in_Renamed.ReadLine();
                        if (line.Length == 0 || line[0] == 'q')
                        {
                            quit = true;
                            break;
                        }
                        if (line[0] == 'p')
                        {
                            start = System.Math.Max(0, start - hitsPerPage);
                            break;
                        }
                        else if (line[0] == 'n')
                        {
                            if (start + hitsPerPage < numTotalHits)
                            {
                                start += hitsPerPage;
                            }
                            break;
                        }
                        else
                        {
                            int page = System.Int32.Parse(line);
                            if ((page - 1) * hitsPerPage < numTotalHits)
                            {
                                start = (page - 1) * hitsPerPage;
                                break;
                            }
                            else
                            {
                                System.Console.Out.WriteLine("No such page");
                            }
                        }
                    }
                    if (quit)
                    {
                        break;
                    }
                    end = System.Math.Min(numTotalHits, start + hitsPerPage);
                }
            }
        }