Dela via


Hybridsökning i vCore-baserade Azure Cosmos DB för MongoDB

Azure Cosmos DB for MongoDB (vCore) har nu stöd för en kraftfull hybridsökningsfunktion som kombinerar vektorsökning med fulltextsökningsbedömning med hjälp av funktionen Reciprocal Rank Fusion (RRF).

Hybridsökning utnyttjar fördelarna med både vektorbaserade och traditionella nyckelordsbaserade sökmetoder för att leverera mer relevanta och korrekta sökresultat. Detta uppnås genom att kombinera vektorbäddningar och textdata i samma dokument:

  • Vektorsökning: Använder maskininlärningsmodeller för att förstå den semantiska innebörden av frågor och dokument. På så sätt kan du få mer sammanhangsmedvetna sökresultat, särskilt användbara för komplexa frågor där traditionell nyckelordssökning kan misslyckas. För effektiv sökning efter vektorlikhet erbjuder Azure Cosmos DB for MongoDB tre cosmosSearch kompatibla vektorindex: HNSW, IVF och DiskANN.
  • Fulltextsökning: Azure Cosmos DB for MongoDB (vCore) använder $text operatorn för fulltextsökning.

Resultaten från vektorsökning och fulltextsökning kombineras sedan för att returnera slutliga sökresultat som drar nytta av fördelarna med båda sökmetoderna:

  • Förbättrad relevans: Genom att kombinera semantisk förståelse med nyckelordsmatchning kan hybridsökning ge mer relevanta resultat för en mängd olika frågor.
  • Förbättrad noggrannhet: RRF-funktionen säkerställer att de mest relevanta resultaten från båda sökmetoderna prioriteras.
  • Mångsidighet: Lämplig för olika användningsfall, inklusive rekommendationssystem, semantisk sökning och anpassad innehållsidentifiering.
  1. Skapa en samling för att lagra dina data, inklusive både textinnehåll och vektorbäddningar.
  2. Skapa ett vektorindex i vektorbäddningsfältet med operatorn cosmosSearch .
  3. Skapa ett fulltextindex i textfältet med hjälp av standardkommandona för att skapa index med typen $text .
  4. Använd aggregeringspipelinen med operatorn $search (för vektorsökning) och operatorn $text (för fulltextsökning), följt av steg för att implementera Reciprocal Rank Fusion för att kombinera poängen med operatorn $unionWith .

Skapa ett vektorindex

db.runCommand({
  "createIndexes": "yourCollectionName",
  "indexes": [
    {
      "key": {
        "vectorField": "cosmosSearch"
      },
      "name": "vectorIndex",
      "cosmosSearchOptions": {
        "kind": "vector-diskann", // "vector-ivf" , "vector-hnsw"
        "similarity": "cosine", //  "l2"
        "dimensions": 3072 // Max 16,000
      }
    }
  ]
});

Skapa ett fulltextindex

db.runCommand({
  "createIndexes": "yourCollectionName",
  "indexes": [
    {
      "key": {
        "textField": "text"
      },
      "name": "fullTextIndex"
    }
  ]
});
db.hybrid_col.aggregate([
  { $search: { cosmosSearch: { path: "vector", vector: [0.1, 0.2, 0.3], k: 5 } } },  // Vector search
  { $group: { _id: null, vectorResults: { $push: "$$ROOT" } } },
  { $unwind: { path: "$vectorResults", includeArrayIndex: "vectorRank" } },
  { $addFields: { vs_score: { $divide: [1, { $add: ["$vectorRank", 1, 1] }] } } },
  { $project: { _id: "$vectorResults._id", title: "$vectorResults.text", vs_score: 1 } },
  { $unionWith: {
    coll: "hybrid_col",
    pipeline: [
      { $match: { $text: { $search: "cat" } } },
      { $addFields: { textScore: { $meta: "textScore" } } },
      { $group: { _id: null, textResults: { $push: "$$ROOT" } } },
      { $unwind: { path: "$textResults", includeArrayIndex: "textRank" } },
      { $addFields: { fts_score: { $divide: [1, { $add: ["$textRank", 10, 1] }] } } },
      { $project: { _id: "$_id", title: "$text", fts_score: 1 } }
    ]
  }},
  { $group: {
    _id: "$title",
    finalScore: { $max: { $add: [{ $ifNull: ["$vs_score", 0] }, { $ifNull: ["$fts_score", 0] }] } }
  }},
  { $sort: { finalScore: -1 } }
])

I det här exemplet utför den första $search fasen en vektorlikhetssökning i vektorfältet för frågevektorn [0.1, 0.2, 0.3]och returnerar de fem mest liknande dokumenten (k: 5). $group Fasen grupperar sedan alla vektorsökresultat i ett enda dokument med en matris med namnet vectorResults. $unwind Därefter dekonstruerar fasen matrisenvectorResults, skapar ett separat dokument för varje resultat och lägger till dess rangordning (vectorRank). Den efterföljande $addFields fasen beräknar RRF-poängen (Reciprocal Rank Fusion) för varje vektorsökningsresultat baserat på dess rangordning. $project-fasen väljer sedan _id, title och den beräknade vs_score från vektorsökresultaten.

Genom att gå vidare till textsökningsfasen kombinerar $unionWith-fasen resultaten av vektorsökningspipelinen med resultaten från en separat pipeline för fulltextsökning. I fulltextsökningsfasen $match utför fasen med operatorn $text en fulltextsökning efter termen "katt" i textfältet. Fasen $addFields hämtar relevanspoängen (textScore) som tilldelats av operatorn $text . Precis som vektorsökningsresultaten grupperar $group steget alla sökresultat i fulltext, och $unwind steget dekonstruerar textResults-matrisen och lägger till rangordningen (textRank). En annan straffavgift (10) används här, som kan justeras. Fasen $project väljer _id, title och fts_score från fulltextsökresultaten. När resultatet har kombinerats grupperar $group fasen dokument efter deras title.

Slutligen beräknar $project fasen för varje dokument genom att ta det maximala värdet av dess RRF-vektorpoäng (vs_score) och dess RRF-poäng för fulltext (fts_score). $ifNull hanterar fall där ett dokument kanske bara finns i något av sökresultaten.

Begränsningar

  • Azure Cosmos DB för MongoDB:s fulltextsökning stöder för närvarande inte BM25-rangordning.
  • För närvarande finns det inget enda, dedikerat kommando för att utföra en hybridsökning direkt. Du måste konstruera hybridsökfrågan med hjälp av aggregeringspipelinen, vilket visas i exemplen ovan.

Nästa steg