Dela via


Uppdatera eller återskapa ett index i Azure AI Search

Den här artikeln beskriver hur du uppdaterar ett befintligt index i Azure AI Search med schemaändringar eller innehållsändringar genom inkrementell indexering. Den förklarar de omständigheter under vilka återskapanden krävs och ger rekommendationer för att minimera effekterna av återskapanden på pågående frågebegäranden.

Under aktiv utveckling är det vanligt att släppa och återskapa index när du itererar över indexdesignen. De flesta utvecklare arbetar med ett litet representativt urval av sina data så att omindexeringen går snabbare.

För schemaändringar för program som redan är i produktion rekommenderar vi att du skapar och testar ett nytt index som körs sida vid sida med ett befintligt index. Använd ett indexalias för att växla i det nya indexet samtidigt som du undviker ändringar i programkoden.

Uppdatera innehåll

Inkrementell indexering och synkronisering av ett index mot ändringar i källdata är grundläggande för de flesta sökprogram. I det här avsnittet beskrivs arbetsflödet för uppdatering av fältinnehåll i ett sökindex.

  1. Använd samma tekniker för att läsa in dokument: Dokument – Index (REST) eller ett motsvarande API i Azure SDK:er. Mer information om indexeringstekniker finns i Läsa in dokument.

  2. Ange parametern @search.action för att fastställa effekten på befintliga dokument:

    Åtgärd Effekt
    delete Tar bort hela dokumentet från indexet. Om du vill ta bort ett enskilt fält använder du sammanfoga i stället och anger fältet i fråga till null. Borttagna dokument och fält frigör inte omedelbart utrymme i indexet. Med några minuters mellanrum utför en bakgrundsprocess den fysiska borttagningen. Oavsett om du använder portalen eller ett API för att returnera indexstatistik kan du förvänta dig en liten fördröjning innan borttagningen återspeglas i portalen och via API:er.
    merge Uppdaterar ett dokument som redan finns och misslyckas med ett dokument som inte kan hittas. Sammanslagning ersätter befintliga värden. Därför bör du söka efter samlingsfält som innehåller flera värden, till exempel fält av typen Collection(Edm.String). Om ett tags fält till exempel börjar med värdet ["budget"] och du kör en sammanslagning med ["economy", "pool"]är ["economy", "pool"]det slutliga värdet för fältet tags . Det blir det inte ["budget", "economy", "pool"].
    mergeOrUpload Fungerar som sammanslagning om dokumentet finns och ladda upp om dokumentet är nytt. Det här är den vanligaste åtgärden för inkrementella uppdateringar.
    ladda upp Liknar en "upsert" där dokumentet infogas om det är nytt och uppdateras eller ersätts om det finns. Om dokumentet saknar värden som krävs för indexet är dokumentfältets värde inställt på null.
  3. Publicera uppdateringen.

Frågor fortsätter att köras, men om du uppdaterar eller tar bort befintliga fält kan du förvänta dig blandade resultat och en högre förekomst av begränsning.

Tips för inkrementell indexering

  • Indexerare automatiserar inkrementell indexering. Om du kan använda en indexerare, och om datakällan stöder ändringsspårning, kan du köra indexeraren enligt ett återkommande schema för att lägga till, uppdatera eller skriva över sökbart innehåll så att det synkroniseras med dina externa data.

  • Om du gör indexanrop direkt använder du mergeOrUpload som sökåtgärd.

  • Nyttolasten måste innehålla nycklar eller identifierare för varje dokument som du vill lägga till, uppdatera eller ta bort.

  • Om du vill uppdatera innehållet i enkla fält och underfält i komplexa typer listar du bara de fält som du vill ändra. Om du till exempel bara behöver uppdatera ett beskrivningsfält ska nyttolasten bestå av dokumentnyckeln och den ändrade beskrivningen. Om du utelämnar andra fält bevaras deras befintliga värden.

  • Om du vill sammanfoga infogade ändringar i strängsamlingen anger du hela värdet. Kom ihåg fältexemplet tags från föregående avsnitt. Nya värden skriver över de gamla värdena för ett helt fält och det finns ingen sammanslagning i innehållet i ett fält.

Här är ett REST API-exempel som visar följande tips:

### Get Secret Point Hotel by ID
GET  {{baseUrl}}/indexes/hotels-vector-quickstart/docs('1')?api-version=2023-11-01  HTTP/1.1
    Content-Type: application/json
    api-key: {{apiKey}}

### Change the description, city, and tags for Secret Point Hotel
POST {{baseUrl}}/indexes/hotels-vector-quickstart/docs/search.index?api-version=2023-11-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}

    {
        "value": [
            {
            "@search.action": "mergeOrUpload",
            "HotelId": "1",
            "Description": "I'm overwriting the description for Secret Point Hotel.",
            "Tags": ["my old item", "my new item"],
            "Address": {
                "City": "Gotham City"
                }
            }
        ]
    }
       
### Retrieve the same document, confirm the overwrites and retention of all other values
GET  {{baseUrl}}/indexes/hotels-vector-quickstart/docs('1')?api-version=2023-11-01  HTTP/1.1
    Content-Type: application/json
    api-key: {{apiKey}}

Ändra ett indexschema

Indexschemat definierar de fysiska datastrukturer som skapats i söktjänsten, så det finns inte många schemaändringar som du kan göra utan att behöva återskapa dem fullständigt. I följande lista räknas de schemaändringar som kan införas sömlöst i ett befintligt index. I allmänhet innehåller listan nya fält och funktioner som används vid frågekörning.

  • Lägg till ett nytt fält
  • Ange attributet för retrievable ett befintligt fält
  • Uppdatera searchAnalyzer i ett fält med en befintlig indexAnalyzer
  • Lägg till en ny analysdefinition i ett index (som kan tillämpas på nya fält)
  • Lägga till, uppdatera eller ta bort bedömningsprofiler
  • Lägga till, uppdatera eller ta bort CORS-inställningar
  • Lägga till, uppdatera eller ta bort synonymmappar
  • Lägga till, uppdatera eller ta bort semantiska konfigurationer

Åtgärdsordningen är:

  1. Hämta indexdefinitionen.

  2. Ändra schemat med uppdateringar från föregående lista.

  3. Uppdatera indexschemat för söktjänsten.

  4. Uppdatera indexinnehållet så att det matchar ditt ändrade schema om du har lagt till ett nytt fält. För alla andra ändringar används det befintliga indexerade innehållet som det är.

När du uppdaterar ett indexschema så att det innehåller ett nytt fält får befintliga dokument i indexet ett null-värde för det fältet. I nästa indexeringsjobb ersätter värden från externa källdata de null-värden som lagts till av Azure AI Search.

Det bör inte finnas några frågestörningar under uppdateringarna, men frågeresultaten varierar när uppdateringarna börjar gälla.

Ta bort och återskapa ett index

Vissa ändringar kräver att index släpps och återskapas, vilket ersätter ett aktuellt index med ett nytt.

Åtgärd beskrivning
Ta bort ett fält Om du vill ta bort alla spår av ett fält fysiskt måste du återskapa indexet. När en omedelbar återskapande inte är praktisk kan du ändra programkod för att omdirigera åtkomst bort från ett föråldrat fält eller använda sökfälten och välja frågeparametrar för att välja vilka fält som söks och returneras. Fysiskt finns fältdefinitionen och innehållet kvar i indexet till nästa återskapande, när du tillämpar ett schema som utelämnar fältet i fråga.
Ändra en fältdefinition Omarbetningar av ett fältnamn, datatyp eller specifika indexattribut (sökbara, filterbara, sorterbara, fasettbara) kräver en fullständig återskapande.
Tilldela en analysator till ett fält Analysverktyg definieras i ett index, tilldelas till fält och anropas sedan under indexeringen för att informera om hur token skapas. Du kan lägga till en ny analysdefinition till ett index när som helst, men du kan bara tilldela en analysator när fältet skapas. Detta gäller både för egenskaperna analyzer och indexAnalyzer . Egenskapen searchAnalyzer är ett undantag (du kan tilldela den här egenskapen till ett befintligt fält).
Uppdatera eller ta bort en analysdefinition i ett index Du kan inte ta bort eller ändra en befintlig analyskonfiguration (analysverktyg, tokeniserare, tokenfilter eller teckenfilter) i indexet om du inte återskapar hela indexet.
Lägga till ett fält i en förslagsföreläsare Om det redan finns ett fält och du vill lägga till det i en Suggesters-konstruktion återskapar du indexet.
Växla nivåer Uppgraderingar på plats stöds inte. Om du behöver mer kapacitet skapar du en ny tjänst och återskapar dina index från grunden. För att automatisera den här processen kan du använda exempelkoden index-backup-restore i den här Azure AI Search .NET-exempellagringsplatsen. Den här appen säkerhetskopierar ditt index till en serie JSON-filer och återskapar sedan indexet i en söktjänst som du anger.

Åtgärdsordningen är:

  1. Hämta en indexdefinition om du behöver den för framtida referens eller för att använda den som grund för en ny version.

  2. Överväg att använda en säkerhetskopierings- och återställningslösning för att bevara en kopia av indexinnehållet. Det finns lösningar i C# och Python. Vi rekommenderar Python-versionen eftersom den är mer uppdaterad.

    Om du har kapacitet för söktjänsten behåller du det befintliga indexet medan du skapar och testar det nya.

  3. Släpp det befintliga indexet. Frågor som riktar sig till indexet tas bort omedelbart. Kom ihåg att det inte går att ångra borttagningen av ett index, vilket förstör fysisk lagring för fältsamlingen och andra konstruktioner.

  4. Publicera ett reviderat index, där brödtexten i begäran innehåller ändrade eller ändrade fältdefinitioner och konfigurationer.

  5. Läs in indexet med dokument från en extern källa. Dokument indexeras med hjälp av fältdefinitioner och konfigurationer för det nya schemat.

När du skapar indexet allokeras fysisk lagring för varje fält i indexschemat, med ett inverterat index som skapats för varje sökbart fält och ett vektorindex som skapats för varje vektorfält. Fält som inte kan sökas kan användas i filter eller uttryck, men som inte har inverterade index och inte är fulltext- eller fuzzy-sökbara. När indexet återskapas tas dessa inverterade index och vektorindex bort och återskapas baserat på det indexschema som du anger.

Balansera arbetsbelastningar

Indexering körs inte i bakgrunden, men söktjänsten balanserar alla indexeringsjobb mot pågående frågor. Under indexeringen kan du övervaka frågebegäranden i portalen för att säkerställa att frågorna slutförs i tid.

Om indexering av arbetsbelastningar introducerar oacceptabla nivåer av frågesvarstid utför du prestandaanalys och granskar dessa prestandatips för potentiell åtgärd.

Sök efter uppdateringar

Du kan börja köra frågor mot ett index så snart det första dokumentet har lästs in. Om du känner till ett dokuments ID returnerar REST-API:et för uppslagsdokument det specifika dokumentet. För bredare testning bör du vänta tills indexet är helt inläst och sedan använda frågor för att verifiera den kontext som du förväntar dig att se.

Du kan använda Sökutforskaren eller en REST-klient för att söka efter uppdaterat innehåll.

Om du har lagt till eller bytt namn på ett fält använder du $select för att returnera fältet: search=*&$select=document-id,my-new-field,some-old-field&$count=true.

Azure-portalen tillhandahåller indexstorlek och vektorindexstorlek. Du kan kontrollera dessa värden när du har uppdaterat ett index, men kom ihåg att förvänta dig en liten fördröjning när tjänsten bearbetar ändringen och tar hänsyn till uppdateringsfrekvensen för portalen, vilket kan ta några minuter.

Ta bort överblivna dokument

Azure AI Search stöder åtgärder på dokumentnivå så att du kan söka efter, uppdatera och ta bort ett specifikt dokument isolerat. I följande exempel visas hur du tar bort ett dokument.

Om du tar bort ett dokument frigörs inte omedelbart utrymme i indexet. Med några minuters mellanrum utför en bakgrundsprocess den fysiska borttagningen. Oavsett om du använder portalen eller ett API för att returnera indexstatistik kan du förvänta dig en liten fördröjning innan borttagningen återspeglas i portalen och API-måtten.

  1. Identifiera vilket fält som är dokumentnyckeln. I portalen kan du visa fälten för varje index. Dokumentnycklar är strängfält och betecknas med en nyckelikon för att göra dem enklare att upptäcka.

  2. Kontrollera värdena för dokumentnyckelfältet: search=*&$select=HotelId. En enkel sträng är enkel, men om indexet använder ett base-64-kodat fält, eller om sökdokument har genererats från en parsingMode inställning, kanske du arbetar med värden som du inte är bekant med.

  3. Leta upp dokumentet för att verifiera värdet för dokument-ID:t och granska dess innehåll innan du tar bort det. Ange nyckel- eller dokument-ID:t i begäran. I följande exempel visas en enkel sträng för exempelindexet Hotels och en base-64-kodad sträng för metadata_storage_path nyckeln för cog-search-demo-indexet.

    GET https://[service name].search.windows.net/indexes/hotel-sample-index/docs/1111?api-version=2023-11-01
    
    GET https://[service name].search.windows.net/indexes/cog-search-demo/docs/aHR0cHM6Ly9oZWlkaWJsb2JzdG9yYWdlMi5ibG9iLmNvcmUud2luZG93cy5uZXQvY29nLXNlYXJjaC1kZW1vL2d1dGhyaWUuanBn0?api-version=2023-11-01
    
  4. Ta bort dokumentet med en borttagning @search.action för att ta bort det från sökindexet.

    POST https://[service name].search.windows.net/indexes/hotels-sample-index/docs/index?api-version=2023-11-01
    Content-Type: application/json   
    api-key: [admin key] 
    {  
      "value": [  
        {  
          "@search.action": "delete",  
          "id": "1111"  
        }  
      ]  
    }
    

Se även