Example #1
0
    /// <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);
        }
    }
Example #2
0
        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;
            }
        }
Example #3
0
        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();
        }
Example #4
0
        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);
        }
Example #5
0
        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();
        }
Example #6
0
    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;
        }
    }
Example #7
0
    /// <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());
    }
Example #8
0
    /// <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);
        }
    }
Example #9
0
        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);
        }