internal static async Task Search()

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}");
        }