Szűrők szöveges lekérdezésekben

A szűrő értékalapú feltételeket biztosít a tartalom lekérdezések végrehajtása előtti belefoglalására vagy kizárására. Például a dátumok, helyek vagy nyelvek alapján a dokumentumok belefoglalása vagy kizárása. A szűrők az egyes mezőkön vannak megadva. A meződefiníciókat "szűrhetőként" kell hozzárendelni, ha szűrőkifejezésekben szeretné használni.

A szűrő OData szűrőkifejezési szintaxissal van megadva. A teljes szöveges kereséssel ellentétben a szűrő csak akkor sikeres, ha az egyezés pontos.

Mikor érdemes szűrőt használni?

A szűrők számos keresési funkció alapjai, beleértve a "közelben keresés" térinformatikai keresést, a részletes navigációt és a biztonsági szűrőket, amelyek csak azokat a dokumentumokat jelenítik meg, amelyeket a felhasználó megtekinthet. Ha ezen szolgáltatások bármelyikét implementálja, szűrőre van szükség. A keresési lekérdezéshez csatolt szűrő adja meg a földrajzi hely koordinátáit, a felhasználó által kiválasztott aspektuskategóriát vagy a kérelmező biztonsági azonosítóját.

Gyakori forgatókönyvek például a következők:

  • A keresési eredményeket az index tartalma alapján szeletelheti. A szálloda elhelyezkedését, kategóriáit és kényelmét tartalmazó sémát figyelembe véve létrehozhat egy szűrőt, amely kifejezetten megfelel a feltételeknek (Seattle-ben, a vízen, egy nézettel).

  • A keresési élmény megvalósítása szűrőfüggőséggel jár:

    • A faceted navigáció szűrővel adja vissza a felhasználó által kiválasztott aspektuskategóriát.
    • A térinformatikai keresés szűrővel adja át az aktuális hely koordinátáit a "közelben talál" alkalmazásokban és függvényekben, amelyek egy adott területen belül vagy távolság alapján egyeznek meg.
    • A biztonsági szűrők szűrőfeltételként adják át a biztonsági azonosítókat, ahol az indexben lévő egyezés proxyként szolgál a dokumentum hozzáférési jogosultságaihoz.
  • Végezze el a "számok keresését". A numerikus mezők lekérdezhetők, és megjelenhetnek a keresési eredményekben, de nem kereshetők (teljes szöveges kereséssel) egyenként. Ha numerikus adatokon alapuló kiválasztási feltételekre van szüksége, használjon szűrőt.

Szűrők végrehajtása

Lekérdezéskor a szűrőelemző bemenetként fogadja el a feltételeket, a kifejezést faként ábrázolt atomi logikai kifejezésekké alakítja, majd kiértékeli a szűrőfát egy index szűrhető mezői felett.

A szűrés a kereséssel párhuzamosan történik, így a dokumentumlekérés és a relevanciapontozás szempontjából melyik dokumentumokat kell belefoglalni az alsóbb rétegbeli feldolgozásba. Keresési sztringgel párosítva a szűrő hatékonyan csökkenti a későbbi keresési művelet visszahívási készletét. Ha egyedül használja (például ha a lekérdezési sztring üres, ahol search=*), a szűrőfeltétel az egyetlen bemenet.

Szűrők definiálása

A szűrők OData-kifejezések, amelyeket az Azure AI Search által támogatott szűrőszintaxis tagolt.

Minden keresési művelethez megadhat egy szűrőt, de maga a szűrő több mezőt, több feltételt és függvény használata esetén ismatch több teljes szöveges keresési kifejezést is tartalmazhat. Többrészes szűrőkifejezésekben a predikátumokat bármilyen sorrendben megadhatja (az operátorok elsőbbsége szabályaira is figyelemmel). A teljesítmény nem mérhető, ha egy adott sorrendben próbálja átrendezni a predikátumokat.

A szűrőkifejezések egyik korlátja a kérelem maximális méretkorlátja. A teljes kérelem a szűrővel együtt legfeljebb 16 MB lehet POST esetén, a GET esetében pedig 8 KB. A szűrőkifejezésben a záradékok száma is korlátozott. Jó hüvelykujjszabály, hogy ha több száz záradékkal rendelkezik, akkor fennáll a veszélye, hogy a korlátba ütközik. Javasoljuk, hogy úgy tervezzen meg egy alkalmazást, hogy ne hozzon létre kötetlen méretű szűrőket.

Az alábbi példák prototipikus szűrődefiníciókat jelölnek több API-ban.

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" }
};

Szűrési minták

Az alábbi példák a szűrőforgatókönyvek használati mintáit szemléltetik. További ötletekért tekintse meg az OData kifejezés szintaxisának > példáit.

  • A különálló $filter lekérdezési sztring nélkül akkor hasznos, ha a szűrőkifejezés képes teljes mértékben minősíteni az érdekes dokumentumokat. Lekérdezési sztring nélkül nincs lexikális vagy nyelvi elemzés, nincs pontozás és nincs rangsorolás. Figyelje meg, hogy a keresési sztring csak egy csillag, ami azt jelenti, hogy "minden dokumentumnak megfelel".

    {
      "search": "*",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Honolulu"
    }
    
  • A lekérdezési sztring és a $filter kombinációja, ahol a szűrő létrehozza az alhalmazt, és a lekérdezési sztring megadja a teljes szöveges kereséshez szükséges kifejezéseket a szűrt részhalmazon. A kifejezések (gyalogos távolsági színházak) hozzáadása keresési pontszámokat vezet be az eredményekben, ahol a kifejezéseknek leginkább megfelelő dokumentumok rangsorolása magasabb. A lekérdezési sztringgel rendelkező szűrő használata a leggyakoribb használati minta.

    {
      "search": "walking distance theaters",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Seattle'"
    }
    
    
  • Összetett lekérdezések, "vagy" szerint elválasztva, saját szűrőfeltételekkel (például "bagles" a "dog" vagy "sziámi" a "macska"-ban). A kifejezéseket or a rendszer egyenként értékeli ki, és az egyes kifejezéseknek megfelelő dokumentumok egyesítése a válaszban. Ez a használati minta a search.ismatchscoring függvényen keresztül érhető el. Használhatja a nem rögzített verziót is. 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
    

    A teljes szöveges keresést search.ismatchscoring szűrőkkel andoris kombinálhatja, de ez funkcionálisan egyenértékű a search keresési kérések paramétereinek és $filter paramétereinek használatával. A következő két lekérdezés például ugyanazt az eredményt adja:

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

A szűrés mezőkövetelményei

A REST API-ban a szűrhető alapértelmezés szerint be van kapcsolva az egyszerű mezők esetében. A szűrhető mezők növelik az index méretét; ügyeljen arra, hogy olyan mezőket állítson be "filterable": false , amelyeket nem szeretne ténylegesen használni egy szűrőben. További információ a meződefiníciók beállításairól: Index létrehozása.

A .NET SDK-ban a szűrhető alapértelmezés szerint ki van kapcsolva . A mezők szűrhetővé alakíthatók úgy, hogy a megfelelő SearchField objektum IsFilterable tulajdonságát a következőre állítjatrue. A következő példában az attribútum egy olyan modellosztály tulajdonságán Rating van beállítva, amely megfelel az indexdefiníciónak.

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

Meglévő mező szűrése

A meglévő mezőket nem módosíthatja, hogy szűrhetőek legyenek. Ehelyett új mezőt kell hozzáadnia, vagy újra kell építenie az indexet. Az indexek újraépítésével vagy a mezők újratöltésével kapcsolatos további információkért tekintse meg az Azure AI Search-indexek újraépítését ismertető témakört.

A szövegszűrő alapjai

A szövegszűrők megfelelnek a sztringmezőknek a szűrőben megadott literális sztringekkel: $filter=Category eq 'Resort and Spa'

A teljes szöveges kereséssel ellentétben nincs lexikális elemzés vagy szótörés a szövegszűrők esetében, így az összehasonlítások csak a pontos egyezésekre használhatók. Tegyük fel például, hogy az f mező "napos napot" tartalmaz, $filter=f eq 'sunny' nem egyezik, hanem $filter=f eq 'sunny day' az lesz.

A szöveges sztringek megkülönböztetik a kis- és nagybetűket, ami azt jelenti, hogy a szövegszűrők alapértelmezés szerint megkülönböztetik a kis- és nagybetűket. Például $filter=f eq 'Sunny day' nem találja a "napos napot". A normalizálóval azonban beállíthatja, hogy a szűrés ne legyen megkülönbözteti a kis- és nagybetűket.

A szöveg szűrésének megközelítései

Módszer Leírás Mikor érdemes használni?
search.in Olyan függvény, amely megfelel egy mezőnek a sztringek elválasztott listájával. Biztonsági szűrőkhöz és olyan szűrőkhöz ajánlott, ahol sok nyers szöveges értéket kell sztringmezővel egyeztetni. A search.in függvény a sebességre van tervezve, és sokkal gyorsabb, mint a mező explicit összehasonlítása az egyes sztringekkel eq és ora .
search.ismatch Egy függvény, amely lehetővé teszi, hogy a teljes szöveges keresési műveleteket szigorúan logikai szűrőműveletekkel keverje ugyanabban a szűrőkifejezésben. A search.ismatch (vagy annak pontozási megfelelője, a search.ismatchscoring) függvényt akkor használja, ha több keresési szűrő kombinációt szeretne egy kérelemben használni. Azt is használhatja, ha egy szűrőt tartalmaz , hogy egy nagyobb sztringen belül egy részleges sztringre szűrjön.
$filter=field operator string Mezőkből, operátorokból és értékekből álló, felhasználó által definiált kifejezés. Ezt akkor használja, ha pontos egyezéseket szeretne keresni egy sztringmező és egy sztringérték között.

Numerikus szűrő alapjai

A numerikus mezők nincsenek searchable a teljes szöveges keresés kontextusában. Csak a sztringekre vonatkozik a teljes szöveges keresés. Ha például a 99,99-et adja meg keresési kifejezésként, akkor nem kap vissza 99,99 usd értékű elemeket. Ehelyett a dokumentum sztringmezőiben a 99-es számmal rendelkező elemek jelennek meg. Így ha numerikus adatokkal rendelkezik, a feltételezés az, hogy szűrőkhöz, például tartományokhoz, aspektusokhoz, csoportokhoz stb. fogja használni őket.

A numerikus mezőket (ár, méret, termékváltozat, azonosító) tartalmazó dokumentumok akkor adják meg ezeket az értékeket a keresési eredményekben, ha a mező meg van jelölve retrievable. A lényeg az, hogy maga a teljes szöveges keresés nem alkalmazható numerikus mezőtípusokra.

Következő lépések

Először próbálja meg a Kereséskezelőt a portálon, hogy $filter paraméterekkel küldje el a lekérdezéseket. Az ingatlanminta-index érdekes eredményeket biztosít a következő szűrt lekérdezésekhez, amikor beilleszti őket a keresősávba:

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

További példákkal kapcsolatban lásd az OData szűrőkifejezés szintaxisának > példáit.

Lásd még