Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
SQL Server biedt zoekmogelijkheden voor volledige tekst waarmee geavanceerde tekstzoekopdrachten mogelijk zijn buiten eenvoudige LIKE patronen. Zoeken in volledige tekst ondersteunt linguïstische overeenkomsten, inflectionele vormen, nabijheid zoeken en gewogen rangschikking.
De SQL Server-provider van EF Core ondersteunt zowel zoekpredicaten in volledige tekst (voor filteren) als tabelwaardefuncties (voor filteren met classificatie).
Zoeken in volledige tekst instellen
Voordat u zoeken in volledige tekst gebruikt, moet u een catalogus met volledige tekst in uw database en een volledige-tekstindex maken voor de kolommen die u wilt doorzoeken.
Opmerking
Catalogus met volledige tekst en indexbeheer in migraties is geïntroduceerd in EF Core 11.
U kunt catalogi en indexen in volledige tekst rechtstreeks in uw EF-model configureren. Wanneer u een migratie toevoegt, genereert EF de juiste SQL om de catalogus en index voor u te maken (of te wijzigen).
Definieer eerst een volledige-tekstcatalogus op het model en configureer vervolgens een volledige-tekstindex voor uw entiteitstype:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasFullTextCatalog("ftCatalog");
modelBuilder.Entity<Article>()
.HasFullTextIndex(a => a.Contents)
.HasKeyIndex("PK_Articles")
.OnCatalog("ftCatalog");
}
De HasKeyIndex() methode geeft de unieke, niet-null-index met één kolom op die wordt gebruikt als de volledige-tekstsleutel voor de tabel (meestal de primaire-sleutelindex).
OnCatalog() wijst de volledige-tekstindex toe aan een specifieke catalogus.
U kunt ook meerdere kolommen en extra opties configureren, zoals talen per kolom en wijzigingen bijhouden:
modelBuilder.Entity<Article>()
.HasFullTextIndex(a => new { a.Title, a.Contents })
.HasKeyIndex("PK_Articles")
.OnCatalog("ftCatalog")
.WithChangeTracking(FullTextChangeTracking.Manual)
.HasLanguage("Title", "English")
.HasLanguage("Contents", "French");
De catalogus met volledige tekst kan ook worden geconfigureerd als de standaardcatalogus en met accentgevoeligheid:
modelBuilder.HasFullTextCatalog("ftCatalog")
.IsDefault()
.IsAccentSensitive(false);
Zie de zoekdocumentatie voor volledige tekst van SQL Server voor meer informatie.
Predicaten voor volledige tekst
EF Core ondersteunt de FREETEXT() en CONTAINS() predicaten, die in Where() clausules worden gebruikt om resultaten te filteren.
FREETEXT()
FREETEXT() voert een minder strikte overeenkomst uit, waarbij wordt gezocht naar woorden op basis van hun betekenis, inclusief inflectionele vormen (zoals werkwoordsvakken en meervouden voor zelfstandig naamwoorden):
var articles = await context.Articles
.Where(a => EF.Functions.FreeText(a.Contents, "veggies"))
.ToListAsync();
Dit vertaalt zich in:
SELECT [a].[Id], [a].[Title], [a].[Contents]
FROM [Articles] AS [a]
WHERE FREETEXT([a].[Contents], N'veggies')
U kunt desgewenst een taalterm opgeven:
var articles = await context.Articles
.Where(a => EF.Functions.FreeText(a.Contents, "veggies", "English"))
.ToListAsync();
CONTAINS()
CONTAINS() voert nauwkeurigere overeenkomsten uit en ondersteunt geavanceerdere zoekcriteria, waaronder voorvoegseltermen, nabijheidszoekopdrachten en gewogen termen:
// 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();
Dit vertaalt zich in:
SELECT [a].[Id], [a].[Title], [a].[Contents]
FROM [Articles] AS [a]
WHERE CONTAINS([a].[Contents], N'veggies')
Zie de CONTAINS() voor meer informatie over de syntaxis van query's.
Functies met tabelwaarden in volledige tekst
Opmerking
Functies met volledige teksttabelwaarden worden geïntroduceerd in EF Core 11.
Hoewel de bovenstaande predicaten handig zijn voor filteren, bieden ze geen classificatie-informatie. De tabelwaardefuncties FREETEXTTABLE() van SQL Server en CONTAINSTABLE() retourneren zowel overeenkomende rijen als een classificatiescore die aangeeft hoe goed elke rij overeenkomt met de zoekquery.
FreeTextTable()
FreeTextTable() is de tabelwaardefunctieversie van FreeText(). Het retourneert FullTextSearchResult<TEntity>, dat zowel de entiteit als de classificatiewaarde bevat:
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}");
}
Houd er rekening mee dat u de algemene typeparameters moet opgeven; Article komt overeen met het entiteitstype dat wordt doorzocht, waarbij int de zoeksleutel voor volledige tekst is opgegeven bij het maken van de index en die wordt geretourneerd door FREETEXTTABLE().
In het bovenstaande wordt er automatisch gezocht in alle kolommen die zijn geregistreerd voor een volledige-tekst-zoekopdracht en worden de top 10 resultaten geretourneerd. U kunt ook een specifieke kolom opgeven om te zoeken:
var results = await context.Articles
.Join(
context.Articles.FreeTextTable<Article, int>(a => a.Contents, "veggies"),
a => a.Id,
ftt => ftt.Key,
(a, ftt) => new { Article = a, ftt.Rank })
.OrderByDescending(r => r.Rank)
.ToListAsync();
... of meerdere kolommen:
var results = await context.Articles
.FreeTextTable(a => new { a.Title, a.Contents }, "veggies")
.Select(r => new { Article = r.Value, Rank = r.Rank })
.OrderByDescending(r => r.Rank)
.ToListAsync();
ContainsTable()
ContainsTable() is de functieversie van de tabelwaarde van Contains(), die dezelfde geavanceerde zoeksyntaxis ondersteunt, terwijl ook classificatie-informatie wordt verstrekt:
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();
Resultaten beperken
Beide tabelwaardefuncties ondersteunen een topN parameter om het aantal resultaten te beperken:
var results = await context.Articles
.FreeTextTable(a => a.Contents, "veggies", topN: 10)
.Select(r => new { Article = r.Value, Rank = r.Rank })
.OrderByDescending(r => r.Rank)
.ToListAsync();
Een taal opgeven
Beide tabelwaardefuncties ondersteunen het opgeven van een taalterm voor taalkundige overeenkomsten:
var results = await context.Articles
.FreeTextTable(a => a.Contents, "veggies", languageTerm: "English")
.Select(r => new { Article = r.Value, Rank = r.Rank })
.ToListAsync();
Wanneer predicaten versus tabelwaardefuncties gebruiken
| Feature | Predicaten (FreeText(), Contains()) |
Tabelwaardefuncties (FreeTextTable(), ContainsTable()) |
|---|---|---|
| Biedt classificatie | ❌ Nee | ✅ Ja |
| Prestaties voor grote resultatensets | Beter voor filteren | Beter voor rangschikking en sortering |
| Combineren met andere entiteiten | Via-verbindingen | Resultaat van ingebouwde entiteit |
Where() clausule gebruiken |
✅ Ja | ❌ Nee (gebruiken als bron) |
Gebruik predicaten wanneer u alleen resultaten wilt filteren op basis van zoekcriteria in volledige tekst. Gebruik tabelwaardefuncties wanneer u classificatiegegevens nodig hebt om resultaten te ordenen op relevantie of relevantiescores weer te geven aan gebruikers.