Exemple #1
0
        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>());
        }
Exemple #2
0
        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>();
        }