Filtry v textových dotazech

Filtr poskytuje kritéria založená na hodnotách pro zahrnutí nebo vyloučení obsahu před spuštěním dotazu. Například zahrnutí nebo vyloučení dokumentů na základě kalendářních dat, umístění nebo jazyka. Filtry se zadají pro jednotlivá pole. Pokud ji chcete použít ve výrazech filtru, musí být definice pole přiřazena jako filtrovatelná.

Filtr je zadán pomocí syntaxe výrazu filtru OData. Na rozdíl od fulltextového vyhledávání je filtr úspěšný jenom 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, kategorii omezující vlastnosti vybranou uživatelem nebo ID zabezpečení ž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).

  • Implementace vyhledávacího prostředí se dodává se závislostí filtru:

    • Fasetová navigace používá filtr k předání kategorie omezující vlastnosti 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 server pro přístupová práva 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á společně s vyhledáváním a opravňujícími dokumenty, které mají být zahrnuty do zpracování podřízenosti pro vyhodnocování načítání dokumentů a vyhodnocování relevance. Při spárování s vyhledávacím řetězcem filtr efektivně snižuje sadu odvolání následné operace hledání. Když použijete samostatně (například když je řetězec dotazu prázdný, kde search=*), kritéria filtru jsou jediným vstupem.

Definování filtrů

Filtry jsou výrazy OData, které jsou vyjádřeny v syntaxi filtru podporované službou Azure AI Search.

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, že narazíte na limit. 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=2020-06-30
{
    "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) představuje ve výsledcích skóre hledání, kde dokumenty, které nejlépe odpovídají podmínkám, jsou seřazeny výš. 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 vyhodnocují jednotlivě a sjednocení dokumentů odpovídajících jednotlivým výrazům odesílaným zpět v odpovědi. Tento vzor použití se dosahuje prostřednictvím search.ismatchscoring funkce. Můžete také použít necoring 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í pomocí search.ismatchscoring filtrů, které používají and místo or, ale je to funkčně ekvivalentní použití search a $filter parametrů v požadavku 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 ve výchozím nastavení možné filtrovat pro jednoduchá pole. 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.

V sadě .NET SDK je ve výchozím nastavení filtrovatelný. Pole lze filtrovat pomocí nastavení IsFilterable vlastnost odpovídající SearchField objektu 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 naplnění polí najdete v tématu Postup opětovného sestavení indexu Azure AI Search.

Základy filtrování textu

Textové filtry odpovídají řetězcovým polím s řetězci literálů, které zadáte ve 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", neodpovídá, $filter=f eq 'sunny' 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 Vhodné použití služby
search.in Funkce, která odpovídá poli v seznamu řetězců s oddělovači. 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 určená pro rychlost a je mnohem rychlejší než explicitní porovnání pole s každým řetězcem používajícím 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 filtr obsahující filtr k filtrování částečného ř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í. Fulltextové vyhledávání podléhá pouze řetězcům. 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 průzkumníka služby Search na portálu odeslat dotazy s parametry $filter . Index ukázka nemovitostí poskytuje zajímavé výsledky pro následující filtrované dotazy při jejich vložení do vyhledávacího panelu:

# 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é