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>());
		}
Ejemplo n.º 2
0
		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;
		}