in src/WebJobs.Extensions.OpenAI.AzureAISearch/AzureAISearchProvider.cs [188:243]
async Task CreateIndexIfDoesntExist(SearchIndexClient searchIndexClient, string searchIndexName, CancellationToken cancellationToken = default)
{
AsyncPageable<string> indexNames = searchIndexClient.GetIndexNamesAsync();
await foreach (Page<string> page in indexNames.AsPages())
{
if (page.Values.Any(indexName => string.Equals(indexName, searchIndexName, StringComparison.OrdinalIgnoreCase)))
{
this.logger.LogDebug("Search index - {searchIndexName} already exists", searchIndexName);
return;
}
}
SearchIndex index = new(searchIndexName)
{
VectorSearch = new()
{
Algorithms =
{
new HnswAlgorithmConfiguration(vectorSearchConfigName)
},
Profiles =
{
new VectorSearchProfile(vectorSearchProfile, vectorSearchConfigName)
}
},
Fields =
{
new SimpleField("id", SearchFieldDataType.String) { IsKey = true },
new SearchableField("text") { AnalyzerName = LexicalAnalyzerName.EnMicrosoft },
new SimpleField("title", SearchFieldDataType.String) { IsFacetable = true },
new SearchField("embeddings", SearchFieldDataType.Collection(SearchFieldDataType.Single))
{
VectorSearchDimensions = this.vectorSearchDimensions,
IsSearchable = true,
VectorSearchProfileName = vectorSearchProfile,
},
new SimpleField("timestamp", SearchFieldDataType.DateTimeOffset) { IsFacetable = true }
},
SemanticSearch = new()
{
Configurations =
{
new SemanticConfiguration("default", new()
{
ContentFields =
{
new SemanticField("text")
},
TitleField = new SemanticField("title")
})
}
}
};
await searchIndexClient.CreateIndexAsync(index, cancellationToken);
}