in demo-dotnet/DotNetIntegratedVectorizationDemo/Program.cs [276:336]
internal static async Task Search(SearchClient searchClient, string query, int k = 3, string filter = null, bool textOnly = false, bool exhaustive = false, bool hybrid = false, bool semantic = false)
{
// Perform the vector similarity search
var searchOptions = new SearchOptions
{
Filter = filter,
Size = k,
Select = { "title", "chunk_id", "chunk", },
IncludeTotalCount = true
};
if (!textOnly)
{
searchOptions.VectorSearch = new() {
Queries = {
new VectorizableTextQuery(text: query)
{
KNearestNeighborsCount = k,
Fields = { "vector" },
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)
};
}
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["chunk"]}");
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}");
}
}
Console.WriteLine($"Total Results: {response.TotalCount}");
}