/// <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.SearchModule.Data.Providers.Lucene.LuceneSearchException"></exception> public virtual ISearchResults Search(string scope, ISearchCriteria criteria) { ISearchResults result; var directoryInfo = new DirectoryInfo(GetDirectoryPath(GetFolderName(scope, criteria.DocumentType))); if (directoryInfo.Exists) { var dir = FSDirectory.Open(directoryInfo); 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}", q.ToString()); TopDocs docs; 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(); result = results.Results; } else { result = new SearchResults(criteria, null); } return(result); }
/// <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.SearchModule.Data.Providers.Lucene.LuceneSearchException"></exception> public virtual ISearchResults Search(string scope, ISearchCriteria criteria) { ISearchResults result; var directoryInfo = new DirectoryInfo(GetDirectoryPath(GetFolderName(scope, criteria.DocumentType))); if (directoryInfo.Exists) { var dir = FSDirectory.Open(directoryInfo); 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}", q.ToString()); TopDocs docs; 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(); result = results.Results; } else { result = new SearchResults(criteria, null); } return result; }