Azure AI Search (eski adıyla Azure Cognitive Search), tam metin aramasını vektör aramasıyla birleştiren yönetilen bir arama platformudur. .NET SDK ile dokümanları indeksleyebilir, semantik sıralama ve hibrit arama yapabilirsiniz.
Kurulum ve Bağlantı
// dotnet add package Azure.Search.Documents
using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
var indexClient = new SearchIndexClient(
new Uri("https://your-service.search.windows.net"),
new AzureKeyCredential("your-admin-key"));
var searchClient = new SearchClient(
new Uri("https://your-service.search.windows.net"),
indexName: "belgeler",
credential: new AzureKeyCredential("your-query-key"));
Index Şeması: Metin + Vektör
// Hem tam metin hem vektör arama destekli index
var index = new SearchIndex("belgeler")
{
Fields =
{
new SimpleField("id", SearchFieldDataType.String) { IsKey = true },
new SearchableField("baslik") { IsFilterable = true },
new SearchableField("icerik") { AnalyzerName = LexicalAnalyzerName.TrLucene },
new SimpleField("kategori", SearchFieldDataType.String) { IsFilterable = true, IsFacetable = true },
new SimpleField("tarih", SearchFieldDataType.DateTimeOffset) { IsFilterable = true, IsSortable = true },
// Vektör alanı (1536 boyut — text-embedding-3-small)
new VectorSearchField("icerikVektoru", vectorSearchDimensions: 1536, vectorSearchProfileName: "default-profile")
},
VectorSearch = new VectorSearch
{
Algorithms = { new HnswAlgorithmConfiguration("default-algo") },
Profiles = { new VectorSearchProfile("default-profile", "default-algo") }
},
SemanticSearch = new SemanticSearch
{
Configurations =
{
new SemanticConfiguration("default", new SemanticPrioritizedFields
{
TitleField = new SemanticField("baslik"),
ContentFields = { new SemanticField("icerik") }
})
}
}
};
await indexClient.CreateOrUpdateIndexAsync(index);
Doküman İndeksleme
public class BelgeDokümanı
{
[SimpleField(IsKey = true)] public string Id { get; set; } = "";
[SearchableField] public string Baslik { get; set; } = "";
[SearchableField(AnalyzerName = "tr.lucene")]
public string Icerik { get; set; } = "";
[SimpleField(IsFilterable = true)] public string Kategori { get; set; } = "";
[SimpleField(IsFilterable = true)] public DateTimeOffset Tarih { get; set; }
[VectorSearchField(VectorSearchDimensions = 1536, VectorSearchProfileName = "default-profile")]
public float[]? IcerikVektoru { get; set; }
}
// Embedding üret ve indexle
var embedding = await embedder.GenerateEmbeddingVectorAsync(belge.Icerik);
var dokuman = new BelgeDokümanı
{
Id = belge.Id.ToString(),
Baslik = belge.Baslik,
Icerik = belge.Icerik,
Kategori = belge.Kategori,
Tarih = belge.Tarih,
IcerikVektoru = embedding.ToArray()
};
await searchClient.IndexDocumentsAsync(
IndexDocumentsBatch.Upload(new[] { dokuman }));
Tam Metin + Filtre Araması
var sonuclar = await searchClient.SearchAsync<BelgeDokümanı>(
searchText: "dependency injection",
new SearchOptions
{
Filter = "kategori eq 'dotnet'",
OrderBy = { "tarih desc" },
Size = 10,
IncludeTotalCount = true,
Facets = { "kategori" }
});
await foreach (var sonuc in sonuclar.Value.GetResultsAsync())
{
Console.WriteLine($"[{sonuc.Score:F2}] {sonuc.Document.Baslik}");
}
Console.WriteLine($"Toplam: {sonuclar.Value.TotalCount}");
Hibrit Arama: Metin + Vektör + Semantik Sıralama
// Sorgu vektörü oluştur
var sorguVektoru = await embedder.GenerateEmbeddingVectorAsync(sorgu);
var hibridSonuc = await searchClient.SearchAsync<BelgeDokümanı>(
searchText: sorgu,
new SearchOptions
{
VectorSearch = new VectorSearchOptions
{
Queries =
{
new VectorizedQuery(sorguVektoru.ToArray())
{
KNearestNeighborsCount = 10,
Fields = { "icerikVektoru" }
}
}
},
SemanticSearch = new SemanticSearchOptions
{
SemanticConfigurationName = "default",
QueryCaption = new QueryCaption(QueryCaptionType.Extractive),
QueryAnswer = new QueryAnswer(QueryAnswerType.Extractive)
},
QueryType = SearchQueryType.Semantic,
Size = 5
});
await foreach (var r in hibridSonuc.Value.GetResultsAsync())
{
Console.WriteLine($"[{r.RerankerScore:F2}] {r.Document.Baslik}");
if (r.Captions?.Count > 0)
Console.WriteLine($" → {r.Captions[0].Text}");
}
Azure AI Search, tam metin araması ve vektör aramasını tek platformda birleştiren güçlü bir çözümdür. Hibrit arama + semantik sıralama kombinasyonu, RAG pipeline'larında hem anahtar kelime hem anlam bazlı doğruluğu sağlar. Türkçe içerik için tr.lucene analyzer desteği mevcuttur.