Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
SQL Server, basit desenlerin ötesinde gelişmiş metin araması sağlayan LIKE arama özellikleri sağlar. Tam metin araması dilsel eşleştirmeyi, çekimli formları, yakınlık aramasını ve ağırlıklı sıralamayı destekler.
EF Core'un SQL Server sağlayıcısı hem tam metin arama koşullarını (filtreleme için) hem de tablo değerli işlevleri (derecelendirmeli filtreleme için) destekler.
Tam metin araması ayarlama
Tam metin aramasını kullanmadan önce veritabanınızda bir tam metin kataloğu ve aramak istediğiniz sütunlarda tam metin dizini oluşturmanız gerekir.
Uyarı
Geçişlerde tam metin kataloğu ve dizin yönetimi EF Core 11'de kullanıma sunulmuştur.
Tam metin katalogları ve dizinleri doğrudan EF modelinizde yapılandırabilirsiniz. Geçiş eklediğinizde EF, kataloğu ve dizini sizin için oluşturmak (veya değiştirmek) için uygun SQL'i oluşturur.
İlk olarak, modelde bir tam metin kataloğu tanımlayın ve ardından varlık türünüzde bir tam metin dizini yapılandırın:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasFullTextCatalog("ftCatalog");
modelBuilder.Entity<Article>()
.HasFullTextIndex(a => a.Contents)
.UseKeyIndex("PK_Articles")
.UseCatalog("ftCatalog");
}
UseKeyIndex() yöntemi, tablonun tam metin anahtarı (genellikle birincil anahtar dizini) olarak kullanılan benzersiz, null atanamaz, tek sütunlu dizini belirtir.
UseCatalog() tam metin dizinini belirli bir kataloğa atar.
Ayrıca birden çok sütun ve sütun başına diller ve değişiklik izleme gibi ek seçenekler de yapılandırabilirsiniz:
modelBuilder.Entity<Article>()
.HasFullTextIndex(a => new { a.Title, a.Contents })
.UseKeyIndex("PK_Articles")
.UseCatalog("ftCatalog")
.HasChangeTracking(FullTextChangeTracking.Manual)
.UseLanguage("Title", "English")
.UseLanguage("Contents", "French");
Tam metin kataloğu, varsayılan katalog olarak ve vurgu duyarlılığıyla da yapılandırılabilir:
modelBuilder.HasFullTextCatalog("ftCatalog")
.IsDefault()
.IsAccentSensitive(false);
Daha fazla bilgi için SQL Server tam metin arama belgelerine bakın.
Tam metin önermesi
EF Core, FREETEXT() ve CONTAINS() koşullarını destekler ve bunlar sonuçları filtrelemek için Where() yan tümcelerinde kullanılır.
FREETEXT()
FREETEXT() daha az katı bir eşleştirme gerçekleştirir ve işlevsel formlar (fiil zamanları ve isim çoğulları gibi) dahil olmak üzere anlamlarına göre sözcükleri arar:
var articles = await context.Articles
.Where(a => EF.Functions.FreeText(a.Contents, "veggies"))
.ToListAsync();
Bu, şu şekilde çevrilir:
SELECT [a].[Id], [a].[Title], [a].[Contents]
FROM [Articles] AS [a]
WHERE FREETEXT([a].[Contents], N'veggies')
İsteğe bağlı olarak bir dil terimi belirtebilirsiniz:
var articles = await context.Articles
.Where(a => EF.Functions.FreeText(a.Contents, "veggies", "English"))
.ToListAsync();
CONTAINS()
CONTAINS() daha hassas eşleştirme gerçekleştirir ve ön ek terimleri, yakınlık araması ve ağırlıklı terimler de dahil olmak üzere daha karmaşık arama ölçütlerini destekler:
// Simple search
var articles = await context.Articles
.Where(a => EF.Functions.Contains(a.Contents, "veggies"))
.ToListAsync();
// Prefix search (words starting with "vegg")
var articles = await context.Articles
.Where(a => EF.Functions.Contains(a.Contents, "\"vegg*\""))
.ToListAsync();
// Phrase search
var articles = await context.Articles
.Where(a => EF.Functions.Contains(a.Contents, "\"fresh vegetables\""))
.ToListAsync();
Bu, şu şekilde çevrilir:
SELECT [a].[Id], [a].[Title], [a].[Contents]
FROM [Articles] AS [a]
WHERE CONTAINS([a].[Contents], N'veggies')
Sorgu söz dizimi hakkında CONTAINS() daha fazla bilgi için SQL Server CONTAINS belgelerine bakın.
Tam metin tablo değerli fonksiyonlar
Uyarı
EF Core 11'de tam metin tablo değerli işlevler kullanıma sunulmuştur.
Yukarıdaki koşul filtreleme için yararlı olsa da derecelendirme bilgileri sağlamaz. SQL Server'ın tablo değerli işlevleri FREETEXTTABLE() ve CONTAINSTABLE() hem eşleşen satırları hem de her satırın arama sorgusuyla ne kadar iyi eşleşdiğini gösteren bir derecelendirme puanı döndürür.
FreeTextTable()
FreeTextTable() , FreeText()'in tablo değerli işlev versiyonudur. Hem varlığı hem de derecelendirme değerini içeren değerini döndürür FullTextSearchResult<TEntity>:
var results = await context.Articles
.Join(
context.Articles.FreeTextTable<Article, int>("veggies", topN: 10),
a => a.Id,
ftt => ftt.Key,
(a, ftt) => new { Article = a, ftt.Rank })
.OrderByDescending(r => r.Rank)
.ToListAsync();
foreach (var result in results)
{
Console.WriteLine($"Article {result.Article.Id} with rank {result.Rank}");
}
Genel tür parametrelerini sağlamanız gerektiğini unutmayın; Article aranmakta olan varlık türüne karşılık gelir; burada int dizini oluştururken belirtilen ve tarafından FREETEXTTABLE()döndürülen tam metin arama anahtarıdır.
Yukarıdaki, tam metin araması için kayıtlı tüm sütunlarda otomatik olarak arama yapıp ilk 10 eşleşmeyi döndürür. Ayrıca, arama yapmak için belirli bir sütun da sağlayabilirsiniz:
var results = await context.Articles
.Join(
context.Articles.FreeTextTable<Article, int>("veggies", a => a.Contents),
a => a.Id,
ftt => ftt.Key,
(a, ftt) => new { Article = a, ftt.Rank })
.OrderByDescending(r => r.Rank)
.ToListAsync();
... veya birden çok sütun:
var results = await context.Articles
.FreeTextTable("veggies", a => new { a.Title, a.Contents })
.Select(r => new { Article = r.Value, Rank = r.Rank })
.OrderByDescending(r => r.Rank)
.ToListAsync();
ContainsTable()
ContainsTable() , aynı karmaşık arama söz dizimini Contains()desteklerken aynı zamanda derecelendirme bilgilerini de sağlayan tablo değerli işlev sürümüdür:
var results = await context.Articles
.Join(
context.Articles.ContainsTable<Article, int>( "veggies OR fruits"),
a => a.Id,
ftt => ftt.Key,
(a, ftt) => new { Article = a, ftt.Rank })
.OrderByDescending(r => r.Rank)
.ToListAsync();
Sonuçları sınırlama
Her iki tablo değerli işlev de sonuç sayısını sınırlamak için bir topN parametreyi destekler:
var results = await context.Articles
.FreeTextTable("veggies", a => a.Contents, topN: 10)
.Select(r => new { Article = r.Value, Rank = r.Rank })
.OrderByDescending(r => r.Rank)
.ToListAsync();
Dil belirtme
Her iki tablo değerli işlev de dil eşleştirmesi için bir dil terimi belirtmeyi destekler:
var results = await context.Articles
.FreeTextTable("veggies", a => a.Contents, languageTerm: "English")
.Select(r => new { Article = r.Value, Rank = r.Rank })
.ToListAsync();
Predicate'lar ve tablo değerli işlevler ne zaman kullanılır?
| Özellik | Predikat (FreeText(), Contains()) |
Tablo değerli işlevler (FreeTextTable(), ContainsTable()) |
|---|---|---|
| Derecelendirme sağlar | ❌ Hayır | ✅ Evet |
| Büyük sonuç kümeleri için performans | Filtreleme için daha iyi | Derecelendirme ve sıralama için daha iyi |
| Diğer varlıklarla birleştirme | Birleşimler aracılığıyla | Yerleşik varlık sonucu |
Where() yan tümcesinde kullanın |
✅ Evet | ❌ Hayır (kaynak olarak kullan) |
Tam metin arama ölçütlerine göre sonuçları filtrelemeniz gerektiğinde predikatlar kullanın. Sonuçları ilgi düzeyine göre sıralamak veya kullanıcılara ilgi puanlarını görüntülemek için derecelendirme bilgilerine ihtiyacınız olduğunda tablo değerli işlevleri kullanın.