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())); } }
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); }
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); }
/// <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); } } }