private static ResultDocument CreateDocument(string key, string name, string color, decimal price, int size, string[] outlines) { var doc = new ResultDocument(); doc.Add(new DocumentField("__key", key, new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("__type", "product", new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("__sort", "1", new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("__hidden", "false", new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("code", "prd12321", new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("name", name, new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("startdate", DateTime.UtcNow, new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("enddate", DateTime.MaxValue, new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("price_usd_default", price, new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("price_usd_default_value", price.ToString(), new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("color", color, new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("catalog", "goods", new[] { IndexStore.YES, IndexType.NOT_ANALYZED, IndexDataType.StringCollection})); doc.Add(new DocumentField("size", size, new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); doc.Add(new DocumentField("currency", "USD", new[] { IndexStore.YES, IndexType.NOT_ANALYZED })); if (outlines != null) { foreach (var outline in outlines) { doc.Add(new DocumentField("__outline", outline, new[] { IndexStore.YES, IndexType.NOT_ANALYZED, IndexDataType.StringCollection })); } } doc.Add(new DocumentField("__content", name, new[] { IndexStore.YES, IndexType.ANALYZED })); return doc; }
/// <summary> /// Creates result document collection from Lucene documents. /// </summary> /// <param name="topDocs">The hits.</param> private void CreateDocuments(Searcher searcher, TopDocs topDocs) { // if no documents found return if (topDocs == null) return; var entries = new List<ResultDocument>(); // get total hits var totalCount = topDocs.TotalHits; var recordsToRetrieve = this.Results.SearchCriteria.RecordsToRetrieve; var startIndex = this.Results.SearchCriteria.StartingRecord; if (recordsToRetrieve > totalCount) recordsToRetrieve = totalCount; for (var index = startIndex; index < startIndex + recordsToRetrieve; index++) { if (index >= totalCount) break; var document = searcher.Doc(topDocs.ScoreDocs[index].Doc); var doc = new ResultDocument(); var documentFields = document.GetFields(); using (var fi = documentFields.GetEnumerator()) { while (fi.MoveNext()) { if (fi.Current != null) { var field = fi.Current; // make sure document field doens't exist, if it does, simply add another value if (doc.ContainsKey(field.Name)) { var existingField = doc[field.Name] as DocumentField; existingField.AddValue(field.StringValue); } else // add new { doc.Add(new DocumentField(field.Name, field.StringValue)); } } } } entries.Add(doc); } var searchDocuments = new ResultDocumentSet(); searchDocuments.Name = "Items"; searchDocuments.Documents = entries.ToArray(); searchDocuments.TotalCount = totalCount; this.Results.Documents = new[] { searchDocuments }; }
public virtual ISearchResults Search(string scope, ISearchCriteria criteria) { var command = new SearchCommand(scope, criteria.DocumentType); command.Size(criteria.RecordsToRetrieve); command.From(criteria.StartingRecord); // Add spell checking // TODO: options.SpellCheck = new SpellCheckingParameters { Collate = true }; // Build query var builder = (QueryBuilder<ESDocument>)_queryBuilder.BuildQuery(criteria); SearchResult<ESDocument> resultDocs; // Add some error handling try { resultDocs = Client.Search(command, builder); } catch (Exception ex) { throw new ElasticSearchException("Search using Elastic Search server failed, check logs for more details.", ex); } // Parse documents returned var documents = new ResultDocumentSet { TotalCount = resultDocs.hits.total }; var docList = new List<ResultDocument>(); foreach (var indexDoc in resultDocs.Documents) { var document = new ResultDocument(); foreach (var field in indexDoc.Keys) document.Add(new DocumentField(field, indexDoc[field])); docList.Add(document); } documents.Documents = docList.ToArray(); // Create search results object var results = new SearchResults(criteria, new[] { documents }); // Now add facet results var groups = new List<FacetGroup>(); if (resultDocs.facets != null) { foreach (var filter in criteria.Filters) { var groupCount = 0; var group = new FacetGroup(filter.Key); if (filter is AttributeFilter) { var attributeFilter = filter as AttributeFilter; var myFilter = attributeFilter; var values = myFilter.Values; if (values != null) { var key = filter.Key.ToLower(); if (!resultDocs.facets.ContainsKey(key)) continue; var facet = resultDocs.facets[key] as TermsFacetResult; if (facet != null) { foreach (var value in values) { //facet.terms var termCount = from f in facet.terms where f.term.Equals(value.Id, StringComparison.OrdinalIgnoreCase) select f.count; var enumerable = termCount as int[] ?? termCount.ToArray(); if (!enumerable.Any()) continue; //var facet = from resultFacet var newFacet = new Facet(@group, value.Id, GetDescription(value, criteria.Locale), enumerable.SingleOrDefault()); @group.Facets.Add(newFacet); } groupCount++; } } } else if (filter is PriceRangeFilter) { var rangeFilter = filter as PriceRangeFilter; if (rangeFilter != null && rangeFilter.Currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase)) { var myFilter = rangeFilter; var values = myFilter.Values; if (values != null) { values = rangeFilter.Values; foreach (var value in values) { var key = String.Format("{0}-{1}", myFilter.Key, value.Id).ToLower(); if (!resultDocs.facets.ContainsKey(key)) continue; var facet = resultDocs.facets[key] as FilterFacetResult; if (facet != null && facet.count > 0) { if (facet.count == 0) continue; var myFacet = new Facet( @group, value.Id, GetDescription(value, criteria.Locale), facet.count); @group.Facets.Add(myFacet); groupCount++; } } } } } else if (filter is RangeFilter) { var myFilter = filter as RangeFilter; if (myFilter != null) { var values = myFilter.Values; if (values != null) { foreach (var value in values) { var facet = resultDocs.facets[filter.Key] as FilterFacetResult; if (facet == null || facet.count <= 0) { continue; } var myFacet = new Facet( @group, value.Id, GetDescription(value, criteria.Locale), facet.count); @group.Facets.Add(myFacet); groupCount++; } } } } else if (filter is CategoryFilter) { var myFilter = filter as CategoryFilter; if (myFilter != null) { var values = myFilter.Values; if (values != null) { foreach (var value in values) { var key = String.Format("{0}-{1}", myFilter.Key.ToLower(), value.Id.ToLower()).ToLower(); var facet = resultDocs.facets[key] as FilterFacetResult; if (facet == null || facet.count <= 0) { continue; } var myFacet = new Facet( @group, value.Id, GetDescription(value, criteria.Locale), facet.count); @group.Facets.Add(myFacet); groupCount++; } } } } // Add only if items exist under if (groupCount > 0) { groups.Add(group); } } } results.FacetGroups = groups.ToArray(); return results; }
public ISearchResults Search(string scope, ISearchCriteria criteria) { // Build query var builder = (SearchQuery)_queryBuilder.BuildQuery(criteria); SearchQueryResult resultDocs; // Add some error handling //try { var searchResponse = Client.Search(scope, builder).Result; if (!searchResponse.IsSuccess) { throw new AzureSearchException(AzureSearchHelper.FormatSearchException(searchResponse)); } resultDocs = searchResponse.Body; } /* catch (Exception ex) { throw ex; } * */ // Parse documents returned var documents = new ResultDocumentSet { TotalCount = resultDocs.Count }; var docList = new List<ResultDocument>(); foreach (var indexDoc in resultDocs.Records) { var document = new ResultDocument(); foreach (var field in indexDoc.Properties.Keys) { document.Add(new DocumentField(field, indexDoc.Properties[field])); } docList.Add(document); } documents.Documents = docList.ToArray(); // Create search results object var results = new SearchResults(criteria, new[] { documents }); return results; }