// Copyright (c) Microsoft. All rights reserved.
using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.InMemory;
using Microsoft.SemanticKernel.Data;
using OpenAI;
namespace Search;
///
/// This example shows how to create and use a instance.
///
public class VectorStore_TextSearch(ITestOutputHelper output) : BaseTest(output)
{
///
/// Show how to create a and use it to perform a text search
/// on top of the .
///
[Fact]
public async Task UsingInMemoryVectorStoreRecordTextSearchAsync()
{
// Create an embedding generation service.
var embeddingGenerator = new OpenAIClient(TestConfiguration.OpenAI.ApiKey)
.GetEmbeddingClient(TestConfiguration.OpenAI.EmbeddingModelId)
.AsIEmbeddingGenerator();
// Construct an InMemory vector store.
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collectionName = "records";
// Delegate which will create a record.
static DataModel CreateRecord(string text)
{
return new()
{
Key = Guid.NewGuid(),
Text = text
};
}
// Create a record collection from a list of strings using the provided delegate.
string[] lines =
[
"Semantic Kernel is a lightweight, open-source development kit that lets you easily build AI agents and integrate the latest AI models into your C#, Python, or Java codebase. It serves as an efficient middleware that enables rapid delivery of enterprise-grade solutions.",
"Semantic Kernel is a new AI SDK, and a simple and yet powerful programming model that lets you add large language capabilities to your app in just a matter of minutes. It uses natural language prompting to create and execute semantic kernel AI tasks across multiple languages and platforms.",
"In this guide, you learned how to quickly get started with Semantic Kernel by building a simple AI agent that can interact with an AI service and run your code. To see more examples and learn how to build more complex AI agents, check out our in-depth samples."
];
var collection = await CreateCollectionFromListAsync(
vectorStore, collectionName, lines, CreateRecord);
// Create a text search instance using the InMemory vector store.
var textSearch = new VectorStoreTextSearch(collection);
await ExecuteSearchesAsync(textSearch);
// Create a text search instance using a vectorized search wrapper around the InMemory vector store.
textSearch = new VectorStoreTextSearch(collection);
await ExecuteSearchesAsync(textSearch);
}
private async Task ExecuteSearchesAsync(VectorStoreTextSearch textSearch)
{
var query = "What is the Semantic Kernel?";
// Search and return results as a string items
KernelSearchResults stringResults = await textSearch.SearchAsync(query, new() { Top = 2, Skip = 0 });
Console.WriteLine("--- String Results ---\n");
await foreach (string result in stringResults.Results)
{
Console.WriteLine(result);
WriteHorizontalRule();
}
// Search and return results as TextSearchResult items
KernelSearchResults textResults = await textSearch.GetTextSearchResultsAsync(query, new() { Top = 2, Skip = 0 });
Console.WriteLine("\n--- Text Search Results ---\n");
await foreach (TextSearchResult result in textResults.Results)
{
Console.WriteLine($"Name: {result.Name}");
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Link: {result.Link}");
WriteHorizontalRule();
}
// Search and returns results as DataModel items
KernelSearchResults