in demo-dotnet/DotNetVectorDemo/Program.cs [99:229]
internal static async Task Search(SearchClient searchClient, string query, int k = 50, int top = 3, string filter = null, bool textOnly = false, bool exhaustive = false, bool hybrid = false, bool semantic = false, string debug = "disabled")
{
// Perform the vector similarity search
var searchOptions = new SearchOptions
{
Filter = filter,
Size = top,
Select = { "title", "id", "content", },
IncludeTotalCount = true
};
if (!textOnly)
{
searchOptions.VectorSearch = new()
{
Queries = {
new VectorizableTextQuery(text: query)
{
KNearestNeighborsCount = k,
Fields = { "titleVector" },
Exhaustive = exhaustive
},
new VectorizableTextQuery(text: query)
{
KNearestNeighborsCount = k,
Fields = { "contentVector" },
Exhaustive = exhaustive
},
},
};
}
if (semantic)
{
searchOptions.QueryType = SearchQueryType.Semantic;
searchOptions.SemanticSearch = new SemanticSearchOptions
{
SemanticConfigurationName = "my-semantic-config",
QueryCaption = new QueryCaption(QueryCaptionType.Extractive),
QueryAnswer = new QueryAnswer(QueryAnswerType.Extractive),
};
}
if (!string.IsNullOrEmpty(debug) && debug != "disabled")
{
if (!semantic)
{
searchOptions.SemanticSearch = new SemanticSearchOptions();
}
searchOptions.SemanticSearch.Debug = new QueryDebugMode(debug);
}
string queryText = (textOnly || hybrid || semantic) ? query : null;
SearchResults<SearchDocument> response = await searchClient.SearchAsync<SearchDocument>(queryText, searchOptions);
if (response.SemanticSearch?.Answers?.Count > 0)
{
Console.WriteLine("Query Answers:");
foreach (QueryAnswerResult answer in response.SemanticSearch.Answers)
{
Console.WriteLine($"Answer Highlights: {answer.Highlights}");
Console.WriteLine($"Answer Text: {answer.Text}");
}
}
await foreach (SearchResult<SearchDocument> result in response.GetResultsAsync())
{
Console.WriteLine($"Title: {result.Document["title"]}");
Console.WriteLine($"Score: {result.Score}\n");
Console.WriteLine($"Content: {result.Document["content"]}");
if (result.SemanticSearch?.Captions?.Count > 0)
{
QueryCaptionResult firstCaption = result.SemanticSearch.Captions[0];
Console.WriteLine($"First Caption Highlights: {firstCaption.Highlights}");
Console.WriteLine($"First Caption Text: {firstCaption.Text}");
}
DocumentDebugInfo debugInfo = result.DocumentDebugInfo?.FirstOrDefault();
if (debugInfo != null)
{
if (debugInfo.Semantic != null)
{
var getFieldMessage = (QueryResultDocumentSemanticField field) => $"Field {field.Name}, State {field.State}";
if (debugInfo.Semantic.TitleField != null)
{
Console.WriteLine($"Title {getFieldMessage(debugInfo.Semantic.TitleField)}");
}
if (debugInfo.Semantic.ContentFields != null)
{
foreach (var contentField in debugInfo.Semantic.ContentFields)
{
Console.WriteLine($"Content {getFieldMessage(contentField)}");
}
}
if (debugInfo.Semantic.KeywordFields != null)
{
foreach (var keywordField in debugInfo.Semantic.KeywordFields)
{
Console.WriteLine($"Keyword {getFieldMessage(keywordField)}");
}
}
}
if (debugInfo.Vectors?.Subscores != null)
{
if (debugInfo.Vectors.Subscores.DocumentBoost != null)
{
Console.WriteLine($"Document Boost: {debugInfo.Vectors.Subscores.DocumentBoost}");
}
if (debugInfo.Vectors.Subscores.Text != null)
{
Console.WriteLine($"Document Text Score: {debugInfo.Vectors.Subscores.Text.SearchScore}");
}
int index = 1;
foreach (IDictionary<string, SingleVectorFieldResult> querySubscore in debugInfo.Vectors.Subscores.Vectors)
{
Console.WriteLine($"Vector Query {index} Debug Info:");
foreach (KeyValuePair<string, SingleVectorFieldResult> fieldSubscore in querySubscore) {
Console.WriteLine($"Vector Field: {fieldSubscore.Key}");
Console.WriteLine($"Vector Field @search.score: {fieldSubscore.Value.SearchScore}");
Console.WriteLine($"Vector Field similarity: {fieldSubscore.Value.VectorSimilarity}");
}
index++;
}
}
}
}
Console.WriteLine($"Total Results: {response.TotalCount}");
}