Sdílet prostřednictvím


Jak tvarovat výsledky ve službě Azure AI Search

Tento článek vysvětluje, jak pracovat s odpovědí dotazu ve službě Azure AI Search. Struktura odpovědi je určena parametry v samotném dotazu, jak je popsáno v search documents (REST) nebo SearchResults – třída (Azure for .NET).

Parametry dotazu určují:

  • Výběr pole
  • Počet shod nalezených v indexu dotazu
  • Stránkování
  • Počet výsledků v odpovědi (ve výchozím nastavení až 50)
  • Řazení.
  • Zvýraznění termínů v rámci výsledku, které odpovídá celému nebo částečnému termínu v textu

Složení výsledků

Výsledky jsou tabulkové, které se skládají z polí všech "načístelných" polí nebo jsou omezeny pouze na tato pole zadaná v parametrech $select . Řádky jsou odpovídající dokumenty.

Můžete zvolit pole ve výsledcích hledání. Zatímco vyhledávací dokument může mít velký počet polí, obvykle je potřeba jenom několik, aby každý dokument reprezentoval ve výsledcích. V požadavku dotazu připojte $select=<field list> , abyste určili, která pole pro načtení by se měla v odpovědi zobrazit.

Vyberte pole, která nabízejí kontrast a rozlišení mezi dokumenty a poskytují dostatek informací pro pozvání odpovědi prokliku na část uživatele. Na webu elektronického obchodování může být název produktu, popis, značka, barva, velikost, cena a hodnocení. U integrovaného indexu hotels-sample může být pole "select" v následujícím příkladu:

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01 
    {  
      "search": "sandy beaches",
      "select": "HotelId, HotelName, Description, Rating, Address/City"
      "count": true
    }

Tipy pro neočekávané výsledky

Někdy je obsah výsledků seaarch neočekávaný. Můžete například zjistit, že některé výsledky vypadají jako duplicity, nebo výsledek, který by se měl zobrazit v horní části, je ve výsledcích umístěný níže. Pokud jsou výsledky dotazů neočekávané, můžete zkusit tyto úpravy dotazů a zjistit, jestli se výsledky zlepší:

  • Změňte searchMode=any (výchozí) tak, aby searchMode=all se vyžadovaly shody u všech kritérií místo jakéhokoli kritéria. To platí zejména v případě, že jsou v dotazu zahrnuté logické operátory.

  • Experimentujte s různými lexikálními analyzátory nebo vlastními analyzátory a zjistěte, jestli změní výsledek dotazu. Výchozí analyzátor rozdělí pomlčky slov a zmenší slova na kořenové formuláře, což obvykle zlepšuje odolnost odpovědi dotazu. Pokud ale potřebujete zachovat pomlčky nebo pokud řetězce obsahují speciální znaky, možná budete muset nakonfigurovat vlastní analyzátory, abyste zajistili, že index obsahuje tokeny ve správném formátu. Další informace najdete v tématu Částečné hledání termínů a vzorů se speciálními znaky (spojovníky, zástupné znaky, regulární výrazy, vzory).

Počítání shod

Parametr count vrátí počet dokumentů v indexu, které jsou považovány za shodu dotazu. Pokud chcete vrátit počet, přidejte $count=true ho do požadavku dotazu. Vyhledávací služba nevynucuje žádnou maximální hodnotu. V závislosti na dotazu a obsahu dokumentů může být počet stejně vysoký jako každý dokument v indexu.

Počet je přesný, pokud je index stabilní. Pokud systém aktivně přidává, aktualizuje nebo odstraňuje dokumenty, bude počet přibližný, s výjimkou všech dokumentů, které nejsou plně indexované.

Počet nebude ovlivněn rutinní údržbou ani jinými úlohami ve vyhledávací službě. Pokud ale máte více oddílů a jednu repliku, mohli byste zaznamenat krátkodobé kolísání počtu dokumentů (několik minut), jakmile se oddíly restartují.

Tip

Pokud chcete zkontrolovat operace indexování, můžete ověřit, jestli index obsahuje očekávaný počet dokumentů, a to přidáním $count=true prázdného vyhledávacího search=* dotazu. Výsledkem je úplný počet dokumentů v indexu.

Při testování syntaxe dotazu můžete rychle zjistit, $count=true jestli vaše úpravy vrací větší nebo méně výsledků, což může být užitečné pro zpětnou vazbu.

Výsledky stránkování

Ve výchozím nastavení vyhledávací modul vrátí až prvních 50 shod. Prvních 50 je určeno skóre hledání za předpokladu, že dotaz je fulltextové vyhledávání nebo sémantické. V opačném případě je prvních 50 libovolných pořadí pro přesné shody dotazů (kde uniforma "@searchScore=1,0" označuje libovolné pořadí).

Horní limit je 1 000 dokumentů vrácených na stránku výsledků hledání, takže můžete nastavit horní mez pro vrácení až 1 000 dokumentů v prvním výsledku. Pokud používáte hybridní dotaz, můžete v novějších rozhraních API ve verzi Preview zadat maxTextRecallSize pro vrácení až 10 000 dokumentů.

Pokud chcete řídit stránkování všech dokumentů vrácených v sadě výsledků, přidejte $top do požadavku dotazu top GET nebo do požadavku dotazu POST parametry$skip.skip Logiku vysvětluje následující seznam.

  • Vrátí první sadu 15 shodných dokumentů a celkový počet shod: GET /indexes/<INDEX-NAME>/docs?search=<QUERY STRING>&$top=15&$skip=0&$count=true

  • Vrátí druhou sadu, přeskočí první 15, aby získal další 15: $top=15&$skip=15. Opakujte pro třetí sadu 15: $top=15&$skip=30

Výsledky stránkovaných dotazů nejsou zaručeny stabilní, pokud se podkladový index mění. Stránkování změní hodnotu $skip každé stránky, ale každý dotaz je nezávislý a pracuje s aktuálním zobrazením dat, protože v době dotazu existuje v indexu (jinými slovy neexistuje ukládání do mezipaměti ani snímek výsledků, například ty, které se nacházejí v databázi pro obecné účely).

Následuje příklad toho, jak můžete získat duplicity. Předpokládejme index se čtyřmi dokumenty:

{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
{ "id": "4", "rating": 1 }

Teď předpokládejme, že chcete, aby se výsledky vrátily 2 po druhé, seřazené podle hodnocení. Spuštěním tohoto dotazu získáte první stránku výsledků: $top=2&$skip=0&$orderby=rating desca vytvoří se následující výsledky:

{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }

Ve službě předpokládejme, že se do indexu přidá pátý dokument mezi voláními dotazu: { "id": "5", "rating": 4 }. Za chvíli spustíte dotaz, který načte druhou stránku: $top=2&$skip=2&$orderby=rating desca získá tyto výsledky:

{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }

Všimněte si, že dokument 2 se načte dvakrát. Je to proto, že nový dokument 5 má větší hodnotu pro hodnocení, takže se seřadí před dokumentem 2 a přejde na první stránku. I když toto chování může být neočekávané, je typické, jak se vyhledávací web chová.

Stránkování přes velký počet výsledků

Použití $top a $skip povolení vyhledávacího dotazu na stránku až 100 000 výsledků, ale co když jsou výsledky větší než 100 000? Pokud chcete procházet odpověď, která je tato velká, použijte jako alternativní řešení $skipřazení a filtr rozsahu.

V tomto alternativním řešení se řazení a filtrování použije u pole ID dokumentu nebo jiného pole, které je jedinečné pro každý dokument. Jedinečné pole musí obsahovat filterable a sortable přisouvat v indexu vyhledávání.

  1. Zadejte dotaz, který vrátí celou stránku seřazených výsledků.

    POST /indexes/good-books/docs/search?api-version=2023-11-01
        {  
          "search": "divine secrets",
          "top": 50,
          "orderby": "id asc"
        }
    
  2. Zvolte poslední výsledek vrácený vyhledávacím dotazem. Tady se zobrazí příklad výsledku s hodnotou "ID".

    {
        "id": "50"
    }
    
  3. Tuto hodnotu ID v dotazu rozsahu použijte k načtení další stránky výsledků. Toto pole ID by mělo mít jedinečné hodnoty, jinak stránkování může obsahovat duplicitní výsledky.

    POST /indexes/good-books/docs/search?api-version=2023-11-01
        {  
          "search": "divine secrets",
          "top": 50,
          "orderby": "id asc",
          "filter": "id ge 50"
        }
    
  4. Stránkování skončí, když dotaz vrátí nulové výsledky.

Poznámka:

Atributy "filtrovatelné" a "řaditelné" lze povolit pouze v případě, že je pole poprvé přidáno do indexu, nelze je povolit u existujícího pole.

Řazení výsledků

V fulltextovém vyhledávacím dotazu je možné výsledky seřadit podle:

  • skóre hledání
  • Skóre sémantického rerankeru
  • pořadí řazení v poli "seřaditelné"

Přidáním profilu bodování můžete také zvýšit počet nalezených shod v konkrétních polích.

Pořadí podle skóre hledání

U fulltextových vyhledávacích dotazů se výsledky automaticky řadí podle skóre hledání vypočítaného na základě četnosti termínů a blízkosti v dokumentu (odvozené z TF-IDF) s vyšším skóre, které mají u hledaného termínu více nebo silnější shody.

Rozsah "@search.score" je buď nevázaný, nebo 0 až (ale neobsahuje) 1,00 ve starších službách.

U obou algoritmů označuje hodnota "@search.score" rovnou 1,00 neoznačovanou nebo nehodnocenou sadu výsledků, kde je skóre 1,0 jednotné pro všechny výsledky. Neoznačené výsledky se vyskytují, když je formulář dotazu přibližný hledání, zástupné znamény nebo dotazy regulárního výrazu nebo prázdné hledání (search=*). Pokud potřebujete uložit strukturu řazení nad neoznamovanými výsledky, zvažte $orderby výraz k dosažení tohoto cíle.

Pořadí podle sémantického pořadí

Pokud používáte sémantické řazení, určuje pořadí řazení výsledků @search.rerankerScore.

Rozsah "@search.rerankerScore" je 1 až 4,00, kde vyšší skóre označuje silnější sémantickou shodu.

Order with $orderby

Pokud je konzistentní řazení požadavkem aplikace, můžete definovat $orderby výraz v poli. K seřazení výsledků lze použít pouze pole, která jsou indexována jako "seřazená".

Pole, která se běžně používají v $orderby hodnocení, datu a umístění, se běžně používají. Filtrování podle umístění vyžaduje, aby kromě názvu pole volaly i výraz filtru funkci.geo.distance()

Číselná pole (Edm.Double, Edm.Int32, Edm.Int64) jsou seřazená v číselném pořadí (například 1, 2, 10, 11, 20).

Pole řetězců (podpole Edm.String, Edm.ComplexType) jsou seřazená v pořadí řazení ASCII nebo v pořadí řazení Unicode v závislosti na jazyce. Kolekce žádného typu se nedají řadit.

  • Číselný obsah v řetězcových polích je seřazen abecedně (1, 10, 11, 2, 20).

  • Velké řetězce jsou seřazené před velkými písmeny (APPLE, Apple, BANANA, Banán, jablko, banán). Před řazením můžete přiřadit normalizátor textu k předběžnému zpracování textu, aby se toto chování změnilo. Použití tokenizátoru malých písmen v poli nebude mít žádný vliv na chování řazení, protože Azure AI Search seřadí na neanalyzovanou kopii pole.

  • Řetězce, které vedou s diakritikou, se zobrazují jako poslední (Äpfel, Öffnen, Üben)

Zvýšení relevance pomocí hodnoticího profilu

Dalším přístupem, který podporuje konzistenci pořadí, je použití vlastního bodovacího profilu. Profily bodování poskytují větší kontrolu nad pořadím položek ve výsledcích hledání a možností zvýšit počet nalezených shod nalezených v konkrétních polích. Logika dodatečného bodování může pomoct přepsat menší rozdíly mezi replikami, protože skóre hledání pro každý dokument jsou od sebe vzdálená. Pro tento přístup doporučujeme algoritmus řazení.

Zvýrazňování položek

Zvýraznění hitů odkazuje na formátování textu (například tučné nebo žluté zvýraznění) použité u odpovídajících termínů ve výsledku, což usnadňuje nalezení shody. Zvýraznění je užitečné pro delší pole obsahu, například pole popisu, kde shoda není okamžitě jasná.

Všimněte si, že zvýraznění se používá u jednotlivých termínů. Obsah celého pole neobsahuje žádné možnosti zvýraznění. Pokud chcete zvýraznit frázi, budete muset v řetězci dotazu uzavřeném v uvozovkách zadat odpovídající termíny (nebo frázi). Tato technika je podrobněji popsána v této části.

Pokyny ke zvýraznění hitů jsou k dispozici v požadavku na dotaz. Dotazy, které aktivují rozšíření dotazů v modulu, jako je přibližné vyhledávání a vyhledávání se zástupnými výjimkou, mají omezenou podporu zvýraznění hitů.

Požadavky na zvýraznění

  • Pole musí být nebo musí být Edm.StringCollection(Edm.String)
  • Pole musí být při hledání přiřazena.

Zadání zvýraznění v požadavku

Pokud chcete vrátit zvýrazněné termíny, zahrňte do požadavku dotazu parametr zvýraznění. Parametr je nastavený na čárkami oddělený seznam polí.

Ve výchozím nastavení je <em>mark up formátu , ale můžete přepsat značku pomocí highlightPreTag a highlightPostTag parametry. Váš klientský kód zpracovává odpověď (například použití tučného písma nebo žlutého pozadí).

POST /indexes/good-books/docs/search?api-version=2023-11-01
    {  
      "search": "divine secrets",  
      "highlight": "title, original_title",
      "highlightPreTag": "<b>",
      "highlightPostTag": "</b>"
    }

Ve výchozím nastavení azure AI Search vrátí až pět zvýraznění na pole. Toto číslo můžete upravit tak, že připojíte pomlčku následovanou celé číslo. Například "highlight": "description-10" vrátí až 10 zvýrazněných termínů odpovídajícího obsahu v poli popis.

Zvýrazněné výsledky

Když se do dotazu přidá zvýraznění, odpověď obsahuje pro každý výsledek "@search.highlight", aby kód aplikace mohl tuto strukturu cílit. Do odpovědi se zahrnou seznam polí určených pro zvýraznění.

Při hledání klíčových slov se každý termín prohledá nezávisle. Dotaz na "boží tajemství" vrátí shody v jakémkoli dokumentu obsahujícím některý z termínů.

Snímek obrazovky se zvýrazněním dotazu na frázi

Zvýraznění hledání klíčových slov

V rámci zvýrazněného pole se formátování použije na celé termíny. Například u shody proti "Boží tajemství Ya-Ya Sesterhood", formátování se použije u každého termínu zvlášť, i když jsou po sobě jdoucí.

"@odata.count": 39,
"value": [
    {
        "@search.score": 19.593246,
        "@search.highlights": {
            "original_title": [
                "<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
            ],
            "title": [
                "<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
            ]
        },
        "original_title": "Divine Secrets of the Ya-Ya Sisterhood",
        "title": "Divine Secrets of the Ya-Ya Sisterhood"
    },
    {
        "@search.score": 12.779835,
        "@search.highlights": {
            "original_title": [
                "<em>Divine</em> Madness"
            ],
            "title": [
                "<em>Divine</em> Madness (Cherub, #5)"
            ]
        },
        "original_title": "Divine Madness",
        "title": "Divine Madness (Cherub, #5)"
    },
    {
        "@search.score": 12.62534,
        "@search.highlights": {
            "original_title": [
                "Grave <em>Secrets</em>"
            ],
            "title": [
                "Grave <em>Secrets</em> (Temperance Brennan, #5)"
            ]
        },
        "original_title": "Grave Secrets",
        "title": "Grave Secrets (Temperance Brennan, #5)"
    }
]

Zvýraznění hledání frází

Formátování celých termínů platí i pro hledání frází, kde je více termínů uzavřeno do uvozovek. Následující příklad je stejný dotaz, s výjimkou toho, že "boží tajemství" je odesláno jako uvozovky uzavřené fráze (někteří klienti REST vyžadují, abyste uvozovky uvozovky s zpětným lomítkem \"):

POST /indexes/good-books/docs/search?api-version=2023-11-01 
    {  
      "search": "\"divine secrets\"",
      "select": "title,original_title",
      "highlight": "title",
      "highlightPreTag": "<b>",
      "highlightPostTag": "</b>",
      "count": true
    }

Vzhledem k tomu, že kritéria teď mají oba termíny, najde se v indexu vyhledávání jenom jedna shoda. Odpověď na výše uvedený dotaz vypadá takto:

{
    "@odata.count": 1,
    "value": [
        {
            "@search.score": 19.593246,
            "@search.highlights": {
                "title": [
                    "<b>Divine</b> <b>Secrets</b> of the Ya-Ya Sisterhood"
                ]
            },
            "original_title": "Divine Secrets of the Ya-Ya Sisterhood",
            "title": "Divine Secrets of the Ya-Ya Sisterhood"
        }
    ]
}

Zvýraznění fráze ve starších službách

Search, které byly vytvořeny před 15. červencem 2020, implementují pro dotazy frází jiné zvýraznění.

V následujících příkladech předpokládejme řetězec dotazu, který obsahuje uvozovku uzavřenou frázi "super bowl". Před červencem 2020 se zvýrazní libovolný termín ve frázi:

"@search.highlights": {
    "sentence": [
        "The <em>super</em> <em>bowl</em> is <em>super</em> awesome with a <em>bowl</em> of chips"
   ]

U vyhledávacích služeb vytvořených po červenci 2020 se v části "@search.highlight" vrátí pouze fráze, které odpovídají dotazu na celou frázi:

"@search.highlights": {
    "sentence": [
        "The <em>super</em> <em>bowl</em> is super awesome with a bowl of chips"
   ]

Další kroky

Pokud chcete rychle vygenerovat vyhledávací stránku pro klienta, zvažte tyto možnosti: