Freigeben über


Volltextsuche

Hinweis

Unterstützung für die Volltextsuche für Cosmos wurde in EF 10 eingeführt.

Azure Cosmos DB bietet jetzt Unterstützung für die Volltextsuche. Es ermöglicht effiziente und effektive Textsuchen mit erweiterten Techniken wie Stemming sowie die Auswertung der Relevanz von Dokumenten für eine bestimmte Suchabfrage. Es kann in Kombination mit der Vektorsuche (d. h. Hybridsuche) verwendet werden, um die Genauigkeit von Antworten in einigen KI-Szenarien zu verbessern. EF Core ermöglicht die Modellierung der Datenbank mit volltextfähigen Eigenschaften und die Verwendung von Volltext-Suchfunktionen in Abfragen für Azure Cosmos DB.

Modellkonfiguration

Eine Eigenschaft kann innerhalb von OnModelCreating so konfiguriert werden, dass die Volltextsuche verwendet wird, indem sie für die Eigenschaft aktiviert und ein Volltextindex definiert wird.

public class Blog
{
    ...

    public string Contents { get; set; }
}

public class BloggingContext
{
    ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>(b =>
        {
            b.Property(x => x.Contents).EnableFullTextSearch();
            b.HasIndex(x => x.Contents).IsFullTextIndex();
        });
    }
}

Hinweis

Das Konfigurieren des Indexes ist nicht obligatorisch, es wird jedoch empfohlen, da die Leistung von Volltext-Suchabfragen erheblich verbessert wird.

Volltext-Suchvorgänge sind sprachspezifisch, wobei standardmäßig Amerikanisches Englisch (en-US) verwendet wird. Sie können die Sprache für einzelne Eigenschaften im Rahmen des Aufrufs EnableFullTextSearch anpassen:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>(b =>
    {
        b.Property(x => x.Contents).EnableFullTextSearch();
        b.HasIndex(x => x.Contents).IsFullTextIndex();
        b.Property(x => x.ContentsGerman).EnableFullTextSearch("de-DE");
        b.HasIndex(x => x.ContentsGerman).IsFullTextIndex();
    });
}

Sie können auch eine Standardsprache für den Container festlegen – sofern nicht in der EnableFullTextSearch-Methode überschrieben, verwenden alle Volltexteigenschaften im Container diese Sprache.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>(b =>
    {
        b.HasDefaultFullTextLanguage("de-DE");
        b.Property(x => x.ContentsEnglish).EnableFullTextSearch("en-US");
        b.HasIndex(x => x.ContentsEnglish).IsFullTextIndex();
        b.Property(x => x.ContentsGerman).EnableFullTextSearch();
        b.HasIndex(x => x.ContentsGerman).IsFullTextIndex();
        b.Property(x => x.TagsGerman).EnableFullTextSearch();
        b.HasIndex(x => x.TagsGerman).IsFullTextIndex();
    });
}

Abfragen

Im Rahmen der Volltextsuche hat Azure Cosmos DB mehrere integrierte Funktionen eingeführt, die eine effiziente Abfrage von Inhalten innerhalb der volltextfähigen Eigenschaften ermöglichen. Diese Funktionen sind: FullTextContains, FullTextContainsAll, FullTextContainsAny, die nach bestimmten Schlüsselwörtern oder Schlüsselwörtern suchen und FullTextScoredie BM25-Bewertung basierend auf bereitgestellten Schlüsselwörtern zurückgibt.

Hinweis

FullTextScore kann nur innerhalb OrderBy verwendet werden, um die Dokumente basierend auf der Punktzahl zu bewerten.

EF Core stellt diese Funktionen als Teil von EF.Functions bereit, sodass sie in Abfragen verwendet werden können.

var cosmosBlogs = await context.Blogs.Where(x => EF.Functions.FullTextContainsAll(x.Contents, "database", "cosmos")).ToListAsync();

var keywords = new string[] { "AI", "agent", "breakthrough" };
var mostInteresting = await context.Blogs.OrderBy(x => EF.Functions.FullTextScore(x.Contents, keywords)).Take(5).ToListAsync();

Volltextsuche kann mit der Vektorsuche in derselben Abfrage verwendet werden; dies wird manchmal als "Hybridsuche" bezeichnet und umfasst die Kombination der Bewertungsergebnisse aus mehreren Suchvorgängen über die Funktion RRF (Reziprozien Rangfusion). Sobald Die Konfiguration der Vektor- und Volltextsuche ordnungsgemäß eingerichtet ist, können Sie die Hybridsuche wie folgt ausführen:

float[] myVector = /* generate vector data from text, image, etc. */
var hybrid = await context.Blogs
    .OrderBy(x => EF.Functions.Rrf(
        EF.Functions.FullTextScore(x.Contents, "database"), 
        EF.Functions.VectorDistance(x.Vector, myVector)))
    .Take(10)
    .ToListAsync();

Die RRF-Funktion ermöglicht auch das Zuweisen verschiedener Gewichtungen zu jeder Suchfunktion, sodass z. B. die Vektorsuche in den Gesamtergebnissen eine große Gewichtung hat:

float[] myVector = /* generate vector data from text, image, etc. */
var hybrid = await context.Blogs
    .OrderBy(x => EF.Functions.Rrf(
        new[]
        {
            EF.Functions.FullTextScore(x.Contents, "database"), 
            EF.Functions.VectorDistance(x.Vector, myVector)
        },
        weights: new[] { 1, 2 }))
    .Take(10)
    .ToListAsync();

Tipp

Sie können mehr als zwei Bewertungsfunktionen innerhalb des Rrf Aufrufs kombinieren sowie nur FullTextScoreVectorDistance Aufrufe verwenden.