/// <summary> /// Searches the datasource using the specified criteria. Criteria is parsed by the query builder specified by /// <typeparamref /> /// . /// </summary> /// <param name="scope">Name of the application.</param> /// <param name="criteria">The criteria.</param> /// <returns></returns> /// <exception cref="VirtoCommerce.Search.Providers.Lucene.LuceneSearchException"></exception> public virtual ISearchResults Search(string scope, ISearchCriteria criteria) { TopDocs docs; var folderName = GetFolderName(scope, criteria.DocumentType); var dir = FSDirectory.Open(new DirectoryInfo(GetDirectoryPath(folderName))); var searcher = new IndexSearcher(dir); var q = (QueryBuilder)QueryBuilder.BuildQuery(criteria); // filter out empty value var filter = q.Filter.ToString().Equals("BooleanFilter()") ? null : q.Filter; Debug.WriteLine("Search Lucene Query:{0}", (object)q.ToString()); try { var numDocs = criteria.StartingRecord + criteria.RecordsToRetrieve; if (criteria.Sort != null) { var fields = criteria.Sort.GetSort(); docs = searcher.Search( q.Query, filter, numDocs, new Sort( fields.Select(field => new SortField(field.FieldName, field.DataType, field.IsDescending)) .ToArray())); } else { docs = searcher.Search(q.Query, filter, numDocs); } } catch (Exception ex) { throw new LuceneSearchException("Search exception", ex); } var results = new LuceneSearchResults(searcher, searcher.IndexReader, docs, criteria, q.Query); // Cleanup here searcher.IndexReader.Dispose(); searcher.Dispose(); return(results.Results); }
/// <summary> /// Searches the datasource using the specified criteria. Criteria is parsed by the query builder specified by /// <typeparamref /// name="QueryBuilderType" /> /// . /// </summary> /// <param name="scope">Name of the application.</param> /// <param name="criteria">The criteria.</param> /// <returns></returns> /// <exception cref="VirtoCommerce.Search.Providers.Lucene.LuceneSearchException"></exception> public virtual ISearchResults Search(string scope, ISearchCriteria criteria) { TopDocs docs = null; var folderName = this.GetFolderName(scope, criteria.DocumentType); var dir = FSDirectory.Open(new DirectoryInfo(this.GetDirectoryPath(folderName))); var searcher = new IndexSearcher(dir); var q = (Query)this.QueryBuilder.BuildQuery(criteria); Debug.WriteLine("Search Lucene Query:{0}", (object)q.ToString()); try { var numDocs = criteria.StartingRecord + criteria.RecordsToRetrieve; if (criteria.Sort != null) { var fields = criteria.Sort.GetSort(); docs = searcher.Search( q, null, numDocs, new Sort( fields.Select(field => new SortField(field.FieldName, field.DataType, field.IsDescending)) .ToArray())); } else { docs = searcher.Search(q, numDocs); } } catch (Exception ex) { throw new LuceneSearchException("Search exception", ex); } var results = new LuceneSearchResults(searcher, searcher.IndexReader, docs, criteria, q); // Cleanup here searcher.IndexReader.Dispose(); searcher.Dispose(); return results.Results; }