public ActionResult Search(string query, string corpusName, int? page, string searchType) { var pageNumber = page ?? 1; if (pageNumber <= 0) pageNumber = 1; Core.Index.SearchType type; if (!Enum.TryParse(searchType, true, out type)) type = Core.Index.SearchType.Morphologic; ViewBag.CurrentIndexName = corpusName; var q = new SearchQuery { IndexName = corpusName, Query = query, CurrentPage = pageNumber, SearchType = type, }; int totalResults = 0; IEnumerable<SearchResult> results = null; try { results = Core.Index.Instance.Search(q, out totalResults); } catch (ParseException ex) { ViewBag.ErrorMessage = "Error: " + ex.Message; } ViewBag.TotalResults = totalResults; ViewBag.Query = q; ViewBag.CorpusName = corpusName; return View(results ?? new List<SearchResult>()); }
public IEnumerable<SearchResult> Search(SearchQuery searchQuery, out int totalHitCount) { var searcher = GetSearcher(searchQuery.IndexName); if (searcher == null) throw new ArgumentException("Index not found: " + searchQuery.IndexName); // Parse query, possibly throwing a ParseException Query query; if (searchQuery.SearchType == SearchType.LuceneDefault) { query = MultiFieldQueryParser.Parse(Lucene.Net.Util.Version.LUCENE_29, searchQuery.Query, searchFieldsLucenesDefault, searchFlags, GetAnalyzer(searchQuery.SearchType)); } else { query = HebrewMultiFieldQueryParser.Parse(Lucene.Net.Util.Version.LUCENE_29, searchQuery.Query, searchFields, searchFlags, GetAnalyzer(searchQuery.SearchType)); } // Log search, if doc-store exists if (MvcApplication.RavenDocStore != null) { using (var session = MvcApplication.RavenDocStore.OpenSession()) { session.Store(searchQuery); session.SaveChanges(); } } // Init var fvh = new FastVectorHighlighter(FastVectorHighlighter.DEFAULT_PHRASE_HIGHLIGHT, FastVectorHighlighter.DEFAULT_FIELD_MATCH, new SimpleFragListBuilder(), new CustomFragmentsBuilder("Content", new String[] { "[b]" }, new String[] { "[/b]" })); var contentFieldName = searchQuery.SearchType == SearchType.LuceneDefault ? "ContentDefault" : "Content"; // Perform actual search var tsdc = TopScoreDocCollector.create(PageSize * searchQuery.CurrentPage, true); searcher.Search(query, tsdc); totalHitCount = tsdc.GetTotalHits(); var hits = tsdc.TopDocs().scoreDocs; var ret = new List<SearchResult>(PageSize); int i; for (i = (searchQuery.CurrentPage - 1) * PageSize; i < hits.Length; ++i) { var d = searcher.Doc(hits[i].doc); var fq = fvh.GetFieldQuery(query); var fragment = fvh.GetBestFragment(fq, searcher.GetIndexReader(), hits[i].doc, contentFieldName, 400); ret.Add(new SearchResult { Id = d.Get("Id"), Title = d.Get("Title"), Score = hits[i].score, LuceneDocId = hits[i].doc, Fragment = MvcHtmlString.Create(fragment.HtmlStripFragment()), }); } return ret; }