/// <summary> /// This function will create the specified index. /// </summary> /// <returns>string - Results response</returns> private string CreateCatalogIndex() { try { var definition = new { Name = this.AzureSearchServiceIndexName, Fields = new[] { new { Name = "DocumentID", Type = "Edm.String", Key = true, Searchable = false, Filterable = false, Sortable = false, Facetable = false, Retrievable = true, Suggestions = false }, new { Name = "DocumentName", Type = "Edm.String", Key = false, Searchable = true, Filterable = false, Sortable = true, Facetable = false, Retrievable = true, Suggestions = true } } }; Uri uri = new Uri(_serviceUri, "/indexes"); string json = AzureSearchHelper.SerializeJson(definition); HttpResponseMessage response = AzureSearchHelper.SendSearchRequest(_httpClient, HttpMethod.Post, uri, json); response.EnsureSuccessStatusCode(); return("Index created."); } catch (Exception ex) { return("Index not created.<br />" + ex.Message); } }
private static void CreateIndexer() { // This will use the Azure Search Indexer to synchronize data from Azure SQL to Azure Search // Since the field mappings is a preview feature it is not available yet in the Azure Search .NET API so I need to make a REST call Uri _serviceUri = new Uri("https://" + searchServiceName + ".search.windows.net"); HttpClient _httpClient = new HttpClient(); _httpClient.DefaultRequestHeaders.Add("api-key", apiKey); Console.WriteLine("{0}", "Creating Data Source...\n"); Uri uri = new Uri(_serviceUri, "datasources/foodmart-rec-ds"); string json = "{ 'name' : 'foodmart-rec-ds','description' : 'FoodMart Recommendations DS','type' : 'azuresql','credentials' : { 'connectionString' : 'Server=tcp:" + azureSQLServer + ".database.windows.net,1433;Database=" + azureSQLDatabase + ";User ID=" + azureSQLUser + ";Password="******";Trusted_Connection=False;Encrypt=True;Connection Timeout=30;' },'container' : { 'name' : 'ItemRecommendationsView' }} "; HttpResponseMessage response = AzureSearchHelper.SendSearchRequest(_httpClient, HttpMethod.Put, uri, json); if (response.StatusCode != HttpStatusCode.Created && response.StatusCode != HttpStatusCode.NoContent) { Console.WriteLine("Error creating data source: {0}", response.Content.ReadAsStringAsync().Result); return; } Console.WriteLine("{0}", "Creating Indexer...\n"); uri = new Uri(_serviceUri, "indexers/foodmart-rec-indexer"); json = "{ 'name' : 'foodmart-rec-indexer','description' : 'FoodMart Recommendations indexer','dataSourceName' : 'foodmart-rec-ds','targetIndexName' : 'foodmart', " + "'parameters' : { 'maxFailedItems' : 10, 'maxFailedItemsPerBatch' : 5, 'base64EncodeKeys': false }, " + "'fieldMappings' : [ { 'sourceFieldName' : 'recommendations', 'mappingFunction' : { 'name' : 'jsonArrayToStringCollection' } } ] }"; response = AzureSearchHelper.SendSearchRequest(_httpClient, HttpMethod.Put, uri, json); if (response.StatusCode != HttpStatusCode.Created && response.StatusCode != HttpStatusCode.NoContent) { Console.WriteLine("Error creating indexer: {0}", response.Content.ReadAsStringAsync().Result); return; } }
private static void CreateCatalogIndex() { var definition = new { Name = "catalog", Fields = new[] { new { Name = "productID", Type = "Edm.String", Key = true, Searchable = false, Filterable = false, Sortable = false, Facetable = false, Retrievable = true, Suggestions = false }, new { Name = "name", Type = "Edm.String", Key = false, Searchable = true, Filterable = false, Sortable = true, Facetable = false, Retrievable = true, Suggestions = true }, new { Name = "productNumber", Type = "Edm.String", Key = false, Searchable = true, Filterable = false, Sortable = false, Facetable = false, Retrievable = true, Suggestions = true }, new { Name = "color", Type = "Edm.String", Key = false, Searchable = true, Filterable = true, Sortable = true, Facetable = true, Retrievable = true, Suggestions = false }, new { Name = "standardCost", Type = "Edm.Double", Key = false, Searchable = false, Filterable = false, Sortable = false, Facetable = false, Retrievable = true, Suggestions = false }, new { Name = "listPrice", Type = "Edm.Double", Key = false, Searchable = false, Filterable = true, Sortable = true, Facetable = true, Retrievable = true, Suggestions = false }, new { Name = "size", Type = "Edm.String", Key = false, Searchable = true, Filterable = true, Sortable = true, Facetable = true, Retrievable = true, Suggestions = false }, new { Name = "weight", Type = "Edm.Double", Key = false, Searchable = false, Filterable = true, Sortable = false, Facetable = true, Retrievable = true, Suggestions = false }, new { Name = "sellStartDate", Type = "Edm.DateTimeOffset", Key = false, Searchable = false, Filterable = true, Sortable = false, Facetable = false, Retrievable = false, Suggestions = false }, new { Name = "sellEndDate", Type = "Edm.DateTimeOffset", Key = false, Searchable = false, Filterable = true, Sortable = false, Facetable = false, Retrievable = false, Suggestions = false }, new { Name = "discontinuedDate", Type = "Edm.DateTimeOffset", Key = false, Searchable = false, Filterable = true, Sortable = false, Facetable = false, Retrievable = true, Suggestions = false }, new { Name = "categoryName", Type = "Edm.String", Key = false, Searchable = true, Filterable = true, Sortable = false, Facetable = true, Retrievable = true, Suggestions = true }, new { Name = "modelName", Type = "Edm.String", Key = false, Searchable = true, Filterable = true, Sortable = false, Facetable = true, Retrievable = true, Suggestions = true }, new { Name = "description", Type = "Edm.String", Key = false, Searchable = true, Filterable = true, Sortable = false, Facetable = false, Retrievable = true, Suggestions = false } } }; Uri uri = new Uri(_serviceUri, "/indexes"); string json = AzureSearchHelper.SerializeJson(definition); HttpResponseMessage response = AzureSearchHelper.SendSearchRequest(_httpClient, HttpMethod.Post, uri, json); response.EnsureSuccessStatusCode(); }
private static bool DeleteCatalogIndex() { Uri uri = new Uri(_serviceUri, "/indexes/catalog"); HttpResponseMessage response = AzureSearchHelper.SendSearchRequest(_httpClient, HttpMethod.Delete, uri); if (response.StatusCode == HttpStatusCode.NotFound) { return(false); } response.EnsureSuccessStatusCode(); return(true); }
private static void IndexCatalogBatch(List <Dictionary <string, object> > changes) { var batch = new { value = changes }; Uri uri = new Uri(_serviceUri, "/indexes/catalog/docs/index"); string json = AzureSearchHelper.SerializeJson(batch); HttpResponseMessage response = AzureSearchHelper.SendSearchRequest(_httpClient, HttpMethod.Post, uri, json); response.EnsureSuccessStatusCode(); }
protected void bt_Click(object sender, EventArgs e) { try { StringBuilder sb = new StringBuilder(); Button btn = sender as Button; switch (btn.ID) { case "btnCreateIndex": //Create the index in Azure Saerch Uri uri = new Uri(_serviceUri, "/indexes/" + this.AzureSearchServiceIndexName); HttpResponseMessage response = AzureSearchHelper.SendSearchRequest(_httpClient, HttpMethod.Get, uri); if (response.StatusCode == HttpStatusCode.NotFound) { CreateCatalogIndex(); sb.Append("Index created!"); } else { sb.Append("Index exists!"); } break; case "btnLoadIndex": //Populate the Azure Search Index LoadIndex(); sb.Append("Index data loaded!"); break; case "btnSearch": //Search against the Azure Search sb.Append(SearchIndex(ValidationHelper.GetString(txtSearch.Text, ""))); break; case "btnReset": //Do a whole lot of nothing, but make things look nice. txtSearch.Text = ""; sb.Clear(); break; } lblResults.Text = sb.ToString(); } catch (Exception ex) { lblResults.Text = ex.Message; } }
/// <summary> /// This function will return a formatted string of the documents mathcing the specified search value /// </summary> /// <param name="strValue">string - Search value</param> /// <returns>string - Some totally awesome search results</returns> private string SearchIndex(string strValue) { StringBuilder sb = new StringBuilder(); try { //Build up the search parameter string search = "&search=" + Uri.EscapeDataString(strValue); //Get the Azure Search records for the specified value if (strValue.Length > 2) { Uri uri = new Uri(_serviceUri, "/indexes/" + this.AzureSearchServiceIndexName + "/docs/suggest?" + search); HttpResponseMessage response = AzureSearchHelper.SendSearchRequest(_httpClient, HttpMethod.Get, uri); AzureSearchHelper.EnsureSuccessfulSearchResponse(response); dynamic results = AzureSearchHelper.DeserializeJson <dynamic>(response.Content.ReadAsStringAsync().Result); //Create a list of the results so we can loop over them and find the assoicated document IEnumerable <AzureResultItem> items = ((JArray)results["value"]).Select(x => new AzureResultItem { documentid = (string)x["DocumentID"], documentname = (string)x["@search.text"] }).ToList(); foreach (AzureResultItem item in items) { sb.Append(item.documentname + "<br />"); var doc = DocumentHelper.GetDocument(ValidationHelper.GetInteger(item.documentid, 0), null); sb.Append("<a href=\"~" + doc.NodeAliasPath + "\">" + doc.NodeAliasPath + "</a><br /><br />"); } } else { sb.Append("You must enter atleast 3 characters."); } } catch (Exception ex) { sb.Append(ex.Message); } return(sb.ToString()); }
/// <summary> /// This function will load the index with documents for the current site /// </summary> /// <returns>string - Results response.</returns> private string LoadIndex() { try { // Get documents var documents = DocumentHelper.GetDocuments() .Types("CMS.MenuItem", "CMS.Folder") .OnSite(CurrentSiteName); StringBuilder sb = new StringBuilder(); sb.Append("{"); sb.Append("\"value\": ["); int i = 1; foreach (var document in documents) { sb.Append("{"); sb.Append("\"@search.action\":\"mergeOrUpload\","); sb.Append("\"DocumentID\":\"" + document.DocumentID + "\","); sb.Append("\"DocumentName\":\"" + document.DocumentName + "\""); sb.Append("}"); if (i < documents.Count) { sb.Append(","); } i += 1; } sb.Append("]"); sb.Append("}"); Uri uri = new Uri(_serviceUri, "/indexes/" + this.AzureSearchServiceIndexName + "/docs/index"); string json = sb.ToString(); HttpResponseMessage response = AzureSearchHelper.SendSearchRequest(_httpClient, HttpMethod.Post, uri, json); response.EnsureSuccessStatusCode(); return("Index data loaded"); } catch (Exception ex) { return("Index data not created.<br />" + ex.Message); } }
public dynamic Search(string searchText, string sort, string category, string department, string portfolio, string brandName) { string search = "&search=" + Uri.EscapeDataString(searchText); string facets = "&facet=L3_NAME&facet=L1_NAME&facet=L2_NAME&facet=BRAND_NAME"; string paging = "&$top=100"; string filter = String.Empty; string orderby = String.Empty; string[] depList = department.Split(','); if (!string.IsNullOrWhiteSpace(department)) { foreach (String d in depList) { if (!String.IsNullOrEmpty(d)) { if (string.IsNullOrEmpty(filter)) { filter += "&$filter=(L1_NAME eq '" + EscapeODataString(d) + "'"; } else { filter += " or L1_NAME eq '" + EscapeODataString(d) + "'"; } } } if (!string.IsNullOrEmpty(filter)) { filter += ")"; } } if (!string.IsNullOrWhiteSpace(category)) { filter += "&$filter=L3_NAME eq '" + EscapeODataString(category) + "'"; } string[] brandList = brandName.Split(','); if (!string.IsNullOrWhiteSpace(brandName.Replace(',', ' ').Trim())) { foreach (String b in brandList) { if (!String.IsNullOrEmpty(b)) { if (string.IsNullOrEmpty(filter)) { filter += "&$filter=(BRAND_NAME eq '" + EscapeODataString(b) + "'"; } else { if (b == brandList[0]) { filter += " and (BRAND_NAME eq '" + EscapeODataString(b) + "'"; } else { filter += " or BRAND_NAME eq '" + EscapeODataString(b) + "'"; } } } } if (!string.IsNullOrEmpty(filter)) { filter += ")"; } } Uri uri = new Uri(_serviceUri, "/indexes/dpg/docs?$count=true" + search + facets + paging + filter + orderby); HttpResponseMessage response = AzureSearchHelper.SendSearchRequest(_httpClient, HttpMethod.Get, uri); AzureSearchHelper.EnsureSuccessfulSearchResponse(response); var result = AzureSearchHelper.DeserializeJson <dynamic>(response.Content.ReadAsStringAsync().Result); return(result); }