public static async Task<IApiResponse<Index>> RetrieveOrCreateIndexAsync()
        {
            var managementClient = GetIndexManagementClient();

            IApiResponse<Index> index = new ApiResponse<Index>();
            try
            {
                index = await managementClient.GetIndexAsync(Keys.ListingsServiceIndexName);
            }
            catch (Exception e)
            {
                Console.WriteLine("Index doesn't yet exist, create it");
            }

            if (index.Body == null)
            {
                var newIndex = new Index(Keys.ListingsServiceIndexName)
                   .WithStringField("Id", opt => opt.IsKey().IsRetrievable())
                   .WithStringField("Color", opt => opt.IsSearchable().IsSortable().IsFilterable().IsRetrievable())
                   .WithStringField("Package", opt => opt.IsSearchable().IsFilterable().IsRetrievable())
                   .WithStringField("Options", opt => opt.IsSearchable().IsFilterable().IsRetrievable())
                   .WithStringField("Type", opt => opt.IsSearchable().IsFilterable().IsRetrievable())
                   .WithStringField("Image", opt => opt.IsRetrievable());
                index = await managementClient.CreateIndexAsync(newIndex);

                if (!index.IsSuccess)
                {
                    Console.WriteLine("Error when making index");
                }
            }

            return index;
        }
        /// <summary>
        /// PUT api/indexes
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public async Task<HttpResponseMessage> Put(Index index)
        {
            var result = await _managementClient.UpdateIndexAsync(index);
            if (!result.IsSuccess)
            {
                return Request.CreateResponse(result.StatusCode, result);
            }

            return Request.CreateResponse(HttpStatusCode.OK, result);
        }
 /// <summary>
 /// Update an existing index.
 /// </summary>
 /// <param name="index"></param>
 /// <returns></returns>
 public Task<IApiResponse<Index>> UpdateIndexAsync(Index index)
 {
     return _connection.Execute<Index>(new ApiRequest("indexes/{0}", HttpMethod.Put) { Body = index }
         .WithUriParameter(index.Name));
 }
 /// <summary>
 /// Create a new index.
 /// </summary>
 /// <param name="index"></param>
 /// <returns></returns>
 public Task<IApiResponse<Index>> CreateIndexAsync(Index index)
 {
     return _connection.Execute<Index>(
         new ApiRequest("indexes", HttpMethod.Post) { Body = index });
 }
        public virtual void Index(string scope, string documentType, IDocument document)
        {
            var core = GetCoreName(scope, documentType);
            if (!_pendingDocuments.ContainsKey(core))
            {
                _pendingDocuments.Add(core, new List<AzureDocument>());
            }

            Index mapping = null;
            var indexAlreadyCreated = false;
            if (!_mappings.ContainsKey(core))
            {
                Thread.Sleep(3000);

                // Get mapping info
                mapping = Client.GetIndex(scope).Result;
                if (mapping != null)
                {
                    indexAlreadyCreated = true;
                    _mappings.Add(core, mapping);
                }
            }
            else
            {
                indexAlreadyCreated = true;
                mapping = _mappings[core];
            }

            var submitMapping = false;

            var localDocument = new AzureDocument();

            for (var index = 0; index < document.FieldCount; index++)
            {
                var field = document[index];

                var key = ConvertToAzureName(field.Name.ToLower());

                if (localDocument.ContainsKey(key))
                {
                    var objTemp = localDocument[key];
                    string[] objListTemp;
                    var temp = objTemp as string[];
                    if (temp != null)
                    {
                        var objList = new List<string>(temp) { ConvertToOffset(field.Value).ToString() };
                        objListTemp = objList.ToArray();
                    }
                    else
                    {
                        objListTemp = new string[] { objTemp.ToString(), ConvertToOffset(field.Value).ToString() };
                    }

                    localDocument[key] = objListTemp;
                }
                else
                {
                    if (mapping == null || !mapping.Fields.Any(x => x.Name.Equals(key)))
                    {
                        if (mapping == null)
                        {
                            mapping = new Index(scope);
                        }

                        var indexField = new IndexField(key, AzureTypeMapper.GetAzureSearchType(field));

                        indexField.IsFilterable();

                        if (key == ConvertToAzureName("__key"))
                        {
                            indexField.IsKey();
                        }

                        if (field.ContainsAttribute(IndexStore.Yes))
                        {
                            indexField.IsRetrievable();
                        }

                        if (field.ContainsAttribute(IndexType.Analyzed))
                        {
                            indexField.IsSearchable();
                        }


                        if (indexField.Type != FieldType.StringCollection)
                        {
                            indexField.IsSortable();
                        }

                        if (indexField.Type == FieldType.StringCollection || indexField.Type == FieldType.String)
                        {

                            if (field.ContainsAttribute(IndexType.Analyzed))
                            {
                                indexField.IsSearchable();
                            }
                        }

                        mapping.Fields.Add(indexField);
                        submitMapping = true;
                    }

                    if (field.ContainsAttribute(IndexDataType.StringCollection))
                        localDocument.Add(key, ConvertToOffset(field.Values.OfType<string>().ToArray()));
                    else
                        localDocument.Add(key, ConvertToOffset(field.Value));
                }
            }

            // submit mapping
            if (submitMapping)
            {
                IApiResponse<Index> result = null;
                if (indexAlreadyCreated)
                {
                    result = Client.UpdateIndex(mapping).Result;
                }
                else
                {
                    result = Client.CreateIndex(mapping).Result;
                }

                if (!result.IsSuccess)
                {
                    throw new IndexBuildException(AzureSearchHelper.FormatSearchException(result));
                }
            }

            _pendingDocuments[core].Add(localDocument);

            // Auto commit changes when limit is reached
            if (AutoCommit && _pendingDocuments[core].Count > AutoCommitCount)
            {
                Commit(scope);
            }
        }
 public async Task<IApiResponse<Index>> UpdateIndex(Index index)
 {
     var result = await IndexClient.UpdateIndexAsync(index).ConfigureAwait(false);
     return result;
 }
 /// <summary>
 /// Update an existing index.
 /// </summary>
 /// <param name="index"></param>
 /// <returns></returns>
 public Task<IApiResponse<Index>> UpdateIndexAsync(Index index)
 {
     return UpdateIndexAsync(index, default(CancellationToken));
 }
Example #8
0
        private Index GetIndexDefinition()
        {
            var index = new Index(IndexName)
                .WithStringField("id", opt =>
                    opt.IsKey().IsRetrievable().IsSearchable().IsSortable().IsFilterable())
                .WithStringField("projectid", opt =>
                    opt.IsRetrievable().IsSortable().IsFilterable())
                .WithStringField("title", opt =>
                    opt.IsRetrievable().IsSearchable())
                .WithStringField("status", opt =>
                    opt.IsRetrievable().IsSearchable().IsSortable().IsFilterable())
                .WithDateTimeField("lastupdatedate", opt =>
                    opt.IsSortable().IsFilterable())
                .WithStringField("details", opt =>
                    opt.IsSearchable())
                .WithStringCollectionField("tags", opt =>
                    opt.IsRetrievable().IsSearchable().IsFilterable())
                .WithStringCollectionField("events", opt =>
                    opt.IsSearchable());


            index.ScoringProfiles = new Collection<ScoringProfile>
            {
                new ScoringProfile
                {
                    Name = "fieldBooster",
                    Text = new ScoringProfileText
                    {
                        Weights = new Dictionary<string, double>
                        {
                            {"id", 3D},
                            {"tags", 2.5D},
                            {"title", 2D},
                            {"events", 0.75D}
                        }
                    },
                    Functions =
                    {
                        new ScoringProfileFunction
                        {
                            Type = ScoringProfileFunctionType.Freshness,
                            FieldName = "lastupdatedate",
                            Boost = 1.25d,
                            Interpolation = InterpolationType.Quadratic,
                            Freshness = new ScoringProfileFunctionFreshness
                            {
                                BoostingDuration = new TimeSpan(5, 0, 0)
                            }
                        }
                    }
                }
            };
            index.DefaultScoringProfile = "fieldBooster";
            return index;
        }