public static List <Models.SearchResult> Query(string text, int max = 8, string userId = null) { if (!string.IsNullOrEmpty(text) && !text.EndsWith(":")) { userId = string.IsNullOrEmpty(userId) ? Account.AuditId : userId; var analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29); //todo: what version? var parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", analyzer); //text is just the default field to search var query = parser.Parse(text); //var term = new Term("text", text.ToLower()); //var query = new Lucene.Net.Search.PrefixQuery(term); //parser.Parse(text); //var query = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", analyzer).Parse(text.ToLower()); using (var dir = FSDirectory.Open(new DirectoryInfo(IndexDir))) { using (var searcher = new IndexSearcher(dir, true)) { var collector = TopScoreDocCollector.create(max * 2, true); //todo: mini-hack to accomidate the post-filtering of search results - attempt to get twice as many results as we need. hopefully we won't filter out that many... searcher.Search(query, collector); var hits = collector.TopDocs().ScoreDocs; //var hits = searcher.Search(query); var ret = new List <Models.SearchResult>(); for (var i = 0; i < hits.Length; i++) { var docId = hits[i].doc; var doc = new Models.SearchDocument(searcher.Doc(docId)); var provider = GetDocumentProvider(doc.Type); if (provider != null) { if (provider.IsAuthorized(doc, userId)) { ret.Add(provider.FormatResult(doc)); } } else { throw new Exception(string.Format("Formatter for type {0} not found", doc.Type)); } if (ret.Count >= max) //todo: mini-hack to accomidate the post-filtering of search results { break; } } return(ret); } } } return(new List <SearchResult>()); }
public static List<Models.SearchResult> Query(string text, int max = 8, string userId = null) { if (!string.IsNullOrEmpty(text) && !text.EndsWith(":")) { userId = string.IsNullOrEmpty(userId) ? Account.AuditId : userId; var analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29); //todo: what version? var parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", analyzer); //text is just the default field to search var query = parser.Parse(text); //var term = new Term("text", text.ToLower()); //var query = new Lucene.Net.Search.PrefixQuery(term); //parser.Parse(text); //var query = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", analyzer).Parse(text.ToLower()); using (var dir = FSDirectory.Open(new DirectoryInfo(IndexDir))) { using (var searcher = new IndexSearcher(dir, true)) { var collector = TopScoreDocCollector.create(max * 2, true); //todo: mini-hack to accomidate the post-filtering of search results - attempt to get twice as many results as we need. hopefully we won't filter out that many... searcher.Search(query, collector); var hits = collector.TopDocs().ScoreDocs; //var hits = searcher.Search(query); var ret = new List<Models.SearchResult>(); for (var i = 0; i < hits.Length; i++) { var docId = hits[i].doc; var doc = new Models.SearchDocument(searcher.Doc(docId)); var provider = GetDocumentProvider(doc.Type); if (provider != null) { if (provider.IsAuthorized(doc, userId)) ret.Add(provider.FormatResult(doc)); } else throw new Exception(string.Format("Formatter for type {0} not found", doc.Type)); if (ret.Count >= max) //todo: mini-hack to accomidate the post-filtering of search results break; } return ret; } } } return new List<SearchResult>(); }