Filtry hledání klíčových slov v Azure AI Vyhledávač

Note

Azure AI Vyhledávač je k dispozici prostřednictvím portálu Azure, rozhraní REST API a Sady Azure SDK. Podporuje také Foundry IQ, spravovanou znalostní vrstvu, která transformuje podnikový obsah na opakovaně použitelné znalostní báze s podporou oprávnění pro agenty na portálu Microsoft Foundry.

Filtr poskytuje kritéria založená na hodnotách pro zahrnutí nebo vyloučení obsahu před spuštěním dotazu pro vyhledávání klíčových slov nebo před nebo po spuštění dotazu pro vektorové vyhledávání. Filtry se použijí u nevektorových polí, ale mohou být použity ve vektorovém vyhledávání, pokud dokumenty obsahují nevektorová pole. Například u indexů uspořádaných kolem obsahu rozděleného do bloků můžete mít pole na úrovni nadřazeného prvku nebo pole metadat, která je možné filtrovat.

Tento článek vysvětluje filtrování hledání klíčových slov. Pro více informací o vektorech viz Přidání filtru do dotazu na vektor.

Filtr je zadán pomocí syntaxe výrazu filtru OData. Na rozdíl od klíčového slova a vektorového vyhledávání je filtr úspěšný pouze v případě, že je shoda přesná.

Kdy použít filtr

Filtry jsou základní pro několik vyhledávacích prostředí, včetně geoprostorového vyhledávání", fasetové navigace a filtrů zabezpečení, které zobrazují jenom ty dokumenty, které uživatel může zobrazit. Pokud implementujete některé z těchto prostředí, vyžaduje se filtr. Je to filtr připojený k vyhledávacímu dotazu, který poskytuje souřadnice geografické polohy, vybranou kategorii facety uživatelem nebo bezpečnostního ID žadatele.

Mezi běžné scénáře patří:

  • Výsledky hledání můžete rozdělit na základě obsahu v indexu. Vzhledem k schématu s umístěním hotelu, kategoriemi a vybavením můžete vytvořit filtr, který explicitně odpovídá kritériím (v Seattlu, na vodě, s výhledem).

  • Implementujte vyhledávací funkci, která má závislost na filtru.

    • Fasetová navigace používá filtr k předání fasetové kategorie vybrané uživatelem.
    • Geoprostorové vyhledávání používá filtr k předávání souřadnic aktuálního umístění v aplikacích "najít poblíž mě" a funkcích, které odpovídají dané oblasti nebo vzdálenosti.
    • Filtry zabezpečení předávají identifikátory zabezpečení jako kritéria filtru, kde shoda v indexu slouží jako proxy pro přístup k dokumentu.
  • Proveďte "hledání čísel". Číselná pole se dají načíst a můžou se zobrazovat ve výsledcích hledání, ale nedají se prohledávat (v režimu fulltextového vyhledávání) zvlášť. Pokud potřebujete kritéria výběru na základě číselných dat, použijte filtr.

Jak se filtry spouštějí

Analyzátor filtru v době dotazu přijímá kritéria jako vstup, převede výraz na atomické logické výrazy reprezentované jako strom a pak vyhodnocuje strom filtru přes filtrovatelná pole v indexu.

Filtrování probíhá současně s vyhledáváním a určuje, které dokumenty zahrnout do dalšího zpracování pro účely získávání dokumentů a hodnocení relevance. V kombinaci s vyhledávacím řetězcem filtr účinně redukuje sadu výsledků následného hledání. Když použijete samostatně (například když je řetězec dotazu prázdný, kde search=*), kritéria filtru jsou jediným vstupem.

Jak se definují filtry

Filtry se vztahují na textový a číselný nevectorový obsah u polí, která jsou atributována jako filterable.

Filtry jsou výrazy OData, které jsou vyjádřeny v syntaxi filtru podporované Azure AI Vyhledávač.

Můžete zadat jeden filtr pro každou operaci hledání , ale samotný filtr může obsahovat více polí, více kritérií a pokud používáte ismatch funkci, více fulltextových vyhledávacích výrazů. Ve výrazu filtru s více částmi můžete predikáty zadat v libovolném pořadí (podle pravidel priority operátoru). Pokud se pokusíte přeuspořádat predikáty v určité sekvenci, není možné dosáhnout žádného možného zvýšení výkonu.

Jedním z omezení výrazu filtru je maximální limit velikosti požadavku. Celý požadavek včetně filtru může být maximálně 16 MB pro POST nebo 8 kB pro GET. Existuje také limit počtu klauzulí ve výrazu filtru. Dobrým pravidlem je, že pokud máte stovky klauzulí, riskujete dosažení limitu. Doporučujeme navrhnout aplikaci takovým způsobem, aby negenerovala filtry nevázané velikosti.

Následující příklady představují prototypické definice filtru v několika rozhraních API.

POST https://[service name].search.windows.net/indexes/hotels/docs/search?api-version=2026-04-01
{
    "search": "*",
    "filter": "Rooms/any(room: room/BaseRate lt 150.0)",
    "select": "HotelId, HotelName, Rooms/Description, Rooms/BaseRate"
}
options = new SearchOptions()
{
    Filter = "Rating gt 4",
    OrderBy = { "Rating desc" }
};

Vzory filtru

Následující příklady ilustrují několik vzorů použití pro scénáře filtrování. Další nápady najdete v příkladech syntaxe výrazů > OData.

  • Samostatné $filter, bez řetězce dotazu, užitečné, když je výraz filtru schopný plně kvalifikovat dokumenty, které vás zajímají. Bez řetězce dotazu neexistuje žádná lexikální ani lingvistická analýza, žádné bodování a žádné hodnocení. Všimněte si, že hledaný řetězec je jenom hvězdička, což znamená "shoda se všemi dokumenty".

    {
      "search": "*",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Honolulu"
    }
    
  • Kombinace řetězce dotazu a $filter, kde filtr vytvoří podmnožinu, a řetězec dotazu poskytuje vstupy termínů pro fulltextové vyhledávání ve filtrované podmnožině. Přidání termínů (kina v pěší vzdálenosti) zavádí ve výsledcích hodnocení vyhledávání, kde dokumenty, které nejlépe odpovídají termínům, jsou seřazeny výše. Použití filtru s řetězcem dotazu je nejběžnější vzor použití.

    {
      "search": "walking distance theaters",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Seattle'"
    }
    
    
  • Složené dotazy oddělené "nebo" mají vlastní kritéria filtru (například "beagles" v 'pes' nebo 'siamese' v 'cat'). Výrazy zkombinované se or se vyhodnocují jednotlivě a sjednocení dokumentů, které odpovídají každému výrazu, je zasíláno zpět v odpovědi. Tento vzor použití se dosahuje prostřednictvím search.ismatchscoring funkce. Můžete také použít nehodnotící verzi, search.ismatch.

    # Match on hostels rated higher than 4 OR 5-star motels.
    $filter=search.ismatchscoring('hostel') and Rating ge 4 or search.ismatchscoring('motel') and Rating eq 5
    
    # Match on 'luxury' or 'high-end' in the description field OR on category exactly equal to 'Luxury'.
    $filter=search.ismatchscoring('luxury | high-end', 'Description') or Category eq 'Luxury'&$count=true
    

    Je také možné kombinovat fulltextové vyhledávání prostřednictvím search.ismatchscoring s filtry používajícími and namísto or, ale to je funkčně ekvivalentní použití parametrů search a $filter v požadavku na hledání. Například následující dva dotazy vytvoří stejný výsledek:

    $filter=search.ismatchscoring('pool') and Rating ge 4
    
    search=pool&$filter=Rating ge 4
    

Požadavky na pole pro filtrování

V rozhraní REST API je pro jednoduchá pole ve výchozím nastavení zapnuté filtrování. Filtrovatelná pole zvyšují velikost indexu; Nezapomeňte nastavit "filterable": false pole, která neplánujete ve filtru skutečně používat. Další informace o nastavení definic polí najdete v tématu Vytvoření indexu.

Ve výchozím nastavení v Sady Azure SDK není filtr aktivní (off). Pole lze filtrovat nastavením vlastnosti IsFilterable u odpovídajícího objektu SearchField na true. V dalším příkladu je atribut nastaven na Rating vlastnost třídy modelu, která se mapuje na definici indexu.

[SearchField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public double? Rating { get; set; }

Vytvoření existujícího pole pro filtrování

Existující pole nemůžete upravit, aby byla filtrovatelná. Místo toho musíte přidat nové pole nebo znovu sestavit index. Další informace o opětovném sestavení indexu nebo opětovném doplnění polí najdete v tématu Jak znovu sestavit index Azure AI Vyhledávač.

Základy filtrování textu

Textové filtry porovnávají řetězcová pole s doslovnými řetězci, které zadáte do filtru: $filter=Category eq 'Resort and Spa'

Na rozdíl od fulltextového vyhledávání neexistuje žádná lexikální analýza ani dělení slov na filtry textu, takže porovnání jsou jenom pro přesné shody. Předpokládejme například, že pole f obsahuje "slunečný den". $filter=f eq 'sunny' neodpovídá, ale $filter=f eq 'sunny day' bude.

Textové řetězce rozlišují malá a velká písmena, což znamená, že filtry textu ve výchozím nastavení rozlišují malá a velká písmena. $filter=f eq 'Sunny day' Například nenajde "slunečný den". Pomocí normalizátoru ho ale můžete nastavit tak, aby filtrování nerozlišuje malá a velká písmena.

Přístupy k filtrování textu

Přístup Popis Kdy použít
search.in Funkce, která porovnává pole s odděleným seznamem řetězců. Doporučeno pro filtry zabezpečení a pro všechny filtry, u kterých je potřeba shodovat mnoho nezpracovaných textových hodnot s řetězcovým polem. Funkce search.in je navržena pro rychlost a je mnohem rychlejší než explicitní porovnání pole proti každému řetězci pomocí eq a or.
search.ismatch Funkce, která umožňuje kombinovat operace fulltextového vyhledávání s výhradně logickými operacemi filtrování ve stejném výrazu filtru. Použijte search.ismatch (nebo jeho ekvivalent bodování, search.ismatchscoring), pokud chcete v jednom požadavku použít více kombinací filtru hledání. Můžete ho také použít pro obsahující filtr k odfiltrování části řetězce ve větším řetězci.
$filter=field operator string Uživatelem definovaný výraz složený z polí, operátorů a hodnot. Tuto možnost použijte, pokud chcete najít přesnou shodu mezi řetězcovým polem a řetězcovou hodnotou.

Základy číselného filtru

Číselná pole nejsou searchable v kontextu fulltextového vyhledávání. Pouze řetězce podléhají fulltextovému vyhledávání. Pokud například zadáte 99,99 jako hledaný termín, nebudete dostávat zpět položky s cenou 99,99 USD. Místo toho byste viděli položky s číslem 99 v řetězcových polích dokumentu. Pokud tedy máte číselná data, předpokládá se, že je použijete pro filtry, včetně rozsahů, omezujících hodnot, skupin atd.

Dokumenty obsahující číselná pole (cena, velikost, skladová položka, ID) poskytují tyto hodnoty ve výsledcích hledání, pokud je pole označené retrievable. Tady je bod, že samotné fulltextové vyhledávání se nevztahuje na číselné typy polí.

Další kroky

Nejprve zkuste na portálu Azure Search explorer odesílat dotazy s parametry $filter. Index ukázky nemovitostí poskytuje zajímavé výsledky pro následující filtrované dotazy při jejich vložení do vyhledávacího pole:

# Geo-filter returning documents within 5 kilometers of Redmond, Washington state
# Use $count=true to get a number of hits returned by the query
# Use $select to trim results, showing values for named fields only
# Use search=* for an empty query string. The filter is the sole input

search=*&$count=true&$select=description,city,postCode&$filter=geo.distance(location,geography'POINT(-122.121513 47.673988)') le 5

# Numeric filters use comparison like greater than (gt), less than (lt), not equal (ne)
# Include "and" to filter on multiple fields (baths and bed)
# Full text search is on John Leclerc, matching on John or Leclerc

search=John Leclerc&$count=true&$select=source,city,postCode,baths,beds&$filter=baths gt 3 and beds gt 4

# Text filters can also use comparison operators
# Wrap text in single or double quotes and use the correct case
# Full text search is on John Leclerc, matching on John or Leclerc

search=John Leclerc&$count=true&$select=source,city,postCode,baths,beds&$filter=city gt 'Seattle'

Pokud chcete pracovat s dalšími příklady, podívejte se na příklady syntaxe výrazů > filtru OData.

Viz také