Sök och fråga med textindex i Azure DocumentDB

En av de viktigaste funktionerna som Azure DocumentDB tillhandahåller är textindexering, vilket möjliggör effektiv sökning och frågekörning av textbaserade data. Tjänsten implementerar textindex i version 2 . Version 2 stöder skiftlägeskänslighet men inte diakritisk känslighet.

Textindex i Azure DocumentDB är särskilda datastrukturer som optimerar textbaserade frågor, vilket gör dem snabbare och effektivare. De är utformade för att hantera textinnehåll som dokument, artiklar, kommentarer eller andra textintensiva data. Textindex använder tekniker som tokenisering, härstamning och stoppord för att skapa ett index som förbättrar prestandan för textbaserade sökningar.

Förutsättningar

  • En prenumeration på Azure

  • Ett befintligt Azure DocumentDB-kluster

Definiera ett textindex

För enkelhetens skull bör vi överväga ett exempel på ett bloggprogram med följande konfiguration:

  • Databasnamn: cosmicworks
  • Samlingsnamn: products

Det här exempelprogrammet lagrar artiklar som dokument med följande struktur:

{
  "_id": ObjectId("617a34e7a867530bff1b2346"),
  "title": "Azure DocumentDB - A Game Changer",
  "content": "Azure DocumentDB is a globally distributed, multi-model database service.",
  "author": "John Doe",
  "category": "Technology",
  "published": true
}
  1. createIndex Använd metoden med text alternativet för att skapa ett textindex i fältettitle.

    use cosmicworks;
    
    db.products.createIndex({ title: "text" })
    

    Anmärkning

    Du kan bara definiera ett textindex per samling, men med Azure DocumentDB kan du skapa textindex i flera fält så att du kan utföra textsökningar i olika fält i dina dokument.

  2. Du kan också skapa ett index som stöder sökning på både fälten title och content .

    db.products.createIndex({ title: "text", content: "text" })
    

Konfigurera alternativ för textindex

Textindex i Azure DocumentDB har flera alternativ för att anpassa deras beteende. Du kan till exempel ange språket för textanalys, ange vikter för att prioritera vissa fält och konfigurera skiftlägesokänsliga sökningar. Här är ett exempel på hur du skapar ett textindex med alternativ:

  1. Skapa ett index för att stödja sökning på både fälten title och content med stöd för engelska. Tilldela också högre vikter till title fältet för att prioritera det i sökresultaten.

    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

Vikter i textindex

När du skapar ett textindex kan du tilldela olika vikter till enskilda fält i indexet. Dessa vikter representerar vikten eller relevansen för varje fält i sökningen. Azure DocumentDB beräknar en poäng och tilldelade vikter för varje dokument baserat på söktermer när du kör en textsökningsfråga. Poängen representerar dokumentets relevans för sökfrågan.

  1. Skapa ett index som stöder sökning på både fälten title och content . Tilldela en vikt på 2 till fältet "rubrik" och en vikt på 1 till fältet "innehåll".

    db.products.createIndex(
    { title: "text", content: "text" },
    { weights: { title: 2, content: 1 } }
    )
    

    Anmärkning

    När en klient utför en textsökningsfråga med termen "DocumentDB" beräknas poängen för varje dokument i samlingen baserat på förekomsten och frekvensen för termen i både fälten "title" och "content", med högre prioritet för fältet "title" på grund av dess högre vikt.

Utföra en textsökning med hjälp av ett textindex

När textindexet har skapats kan du utföra textsökningar med hjälp av textoperatorn i dina frågor. Textoperatorn tar en söksträng och matchar den mot textindexet för att hitta relevanta dokument.

  1. Utför en textsökning efter frasen DocumentDB.

    db.products.find(
        { $text: { $search: "DocumentDB" } }
    )
    
  2. Du kan också använda $meta projektionsoperatorn tillsammans med fältet textScore i en fråga för att se vikten

    db.products.find(
        { $text: { $search: "DocumentDB" } },
        { score: { $meta: "textScore" } }
    )
    

Ta bort ett textindex

Om du vill släppa ett textindex i MongoDB kan du använda dropIndex() metoden i samlingen och ange indexnyckeln eller namnet för det textindex som du vill ta bort.

  1. Ta bort ett textindex genom att uttryckligen ange nyckeln.

    db.products.dropIndex({ title: "text" })
    
  2. Du kan också ta bort ett textindex genom att ange det automatiskt genererade unika namnet.

    db.products.dropIndex("title_text")
    

Begränsningar för textindex

  • Endast ett textindex kan definieras i en samling.
  • Hint() stöds inte i kombination med en fråga med $text uttryck.
  • Sorteringsåtgärder kan inte använda ordningen på textindexet i MongoDB.
  • Textindex kan vara relativt stora och förbrukar betydande lagringsutrymme jämfört med andra indextyper.

Nästa steg