Dela via


Exempel på enkla sökfrågor i Azure AI Search

I Azure AI Search anropar den enkla frågesyntaxen standardfrågeparsern för fulltextsökning. Parsern är snabb och hanterar vanliga scenarier, inklusive fulltextsökning, filtrerad och fasetterad sökning och prefixsökning. Den här artikeln använder exempel för att illustrera enkel syntaxanvändning i en REST API-begäran (Search Documents).

Kommentar

En alternativ frågesyntax är Lucene, som stöder mer komplexa frågestrukturer, till exempel fuzzy- och jokerteckensökning. Mer information finns i Exempel på fullständig Lucene-söksyntax .

Hotell exempelindex

Följande frågor baseras på hotels-sample-index, som du kan skapa genom att följa anvisningarna i Snabbstart: Skapa ett sökindex i Azure Portal.

Exempelfrågor formuleras med hjälp av REST API- och POST-begäranden. Du kan klistra in och köra dem i en REST-klient. Du kan också använda JSON-vyn för Sökutforskaren i Azure Portal. I JSON-vyn kan du klistra in de frågeexempel som visas här i den här artikeln.

Begärandehuvuden måste ha följande värden:

Tangent Värde
Innehållstyp application/json
api-key <your-search-service-api-key>, antingen fråga eller administratörsnyckel

URI-parametrar måste innehålla din slutpunkt för söktjänsten med indexnamnet, dokumentsamlingarna, sökkommandot och API-versionen, ungefär som i följande exempel:

https://{{service-name}}.search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-07-01

Begärandetexten ska skapas som giltig JSON:

{
    "search": "*",
    "queryType": "simple",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • search inställd på * är en ospecificerad fråga som motsvarar null- eller tom sökning. Det är inte särskilt användbart, men det är den enklaste sökningen du kan göra, och den visar alla hämtningsbara fält i indexet, med alla värden.

  • queryType inställd på enkel är standardvärdet och kan utelämnas, men det ingår för att betona att frågeexemplen i den här artikeln uttrycks i den enkla syntaxen.

  • select inställd på en kommaavgränsad lista med fält används för sökresultatsammansättning, inklusive bara de fält som är användbara i samband med sökresultat.

  • count returnerar antalet dokument som matchar sökvillkoren. I en tom söksträng är antalet alla dokument i indexet (50 i hotels-sample-index).

Fulltextsökning kan vara valfritt antal fristående termer eller citattecken, med eller utan booleska operatorer.

POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
    "search": "pool spa +airport",
    "searchMode": "any",
    "queryType": "simple",
    "select": "HotelId, HotelName, Category, Description",
    "count": true
}

En nyckelordssökning som består av viktiga termer eller fraser brukar fungera bäst. Strängfält genomgår textanalys under indexering och frågekörning, släpper icke-viktiga ord som och, den. Om du vill se hur en frågesträng tokeniseras i indexet skickar du strängen i ett Analysera text-anrop till indexet.

Parametern searchMode styr precision och återkallande. Om du vill ha mer återkallande använder du standardvärdet valfritt värde, vilket returnerar ett resultat om någon del av frågesträngen matchas. Om du föredrar precision, där alla delar av strängen måste matchas, ändrar du searchMode till alla. Prova föregående fråga på båda sätten för att se hur searchMode ändrar resultatet.

Svaret för poolspa +airport-frågan bör se ut ungefär som i följande exempel.

"@odata.count": 4,
"value": [
{
    "@search.score": 6.090657,
    "HotelId": "12",
    "HotelName": "Winter Panorama Resort",
    "Description": "Plenty of great skiing, outdoor ice skating, sleigh rides, tubing and snow biking. Yoga, group exercise classes and outdoor hockey are available year-round, plus numerous options for shopping as well as great spa services. Newly-renovated with large rooms, free 24-hr airport shuttle & a new restaurant. Rooms/suites offer mini-fridges & 49-inch HDTVs.",
    "Category": "Resort and Spa"
},
{
    "@search.score": 4.314683,
    "HotelId": "21",
    "HotelName": "Good Business Hotel",
    "Description": "1 Mile from the airport. Free WiFi, Outdoor Pool, Complimentary Airport Shuttle, 6 miles from Lake Lanier & 10 miles from downtown. Our business center includes printers, a copy machine, fax, and a work area.",
    "Category": "Suite"
},
{
    "@search.score": 3.575948,
    "HotelId": "27",
    "HotelName": "Starlight Suites",
    "Description": "Complimentary Airport Shuttle & WiFi. Book Now and save - Spacious All Suite Hotel, Indoor Outdoor Pool, Fitness Center, Florida Green certified, Complimentary Coffee, HDTV",
    "Category": "Suite"
},
{
    "@search.score": 2.6926985,
    "HotelId": "25",
    "HotelName": "Waterfront Scottish Inn",
    "Description": "Newly Redesigned Rooms & airport shuttle. Minutes from the airport, enjoy lakeside amenities, a resort-style pool & stylish new guestrooms with Internet TVs.",
    "Category": "Suite"
}
]

Observera sökpoängen i svaret. Det här är matchningens relevanspoäng. Som standard returnerar en söktjänst de 50 bästa matchningarna baserat på den här poängen.

Enhetliga poäng på 1,0 inträffar när det inte finns någon rangordning, antingen för att sökningen inte var fulltextsökning eller för att inga kriterier angavs. I en tom sökning (search=*) kommer rader till exempel tillbaka i godtycklig ordning. När du inkluderar faktiska kriterier ser du att sökpoängen utvecklas till meningsfulla värden.

Exempel 2: Slå upp efter ID

När sökresultaten har returnerats är ett logiskt nästa steg att ange en informationssida som innehåller fler fält från dokumentet. Det här exemplet visar hur du returnerar ett enskilt dokument med hjälp av Hämta dokument genom att skicka in dokument-ID:t.

GET /indexes/hotels-sample-index/docs/41?api-version=2024-07-01

Alla dokument har en unik identifierare. Om du använder portalen väljer du indexet på fliken Index och tittar sedan på fältdefinitionerna för att avgöra vilket fält som är nyckeln. I REST-API:et returnerar GET Index-anropet indexdefinitionen i svarstexten.

Svaret för föregående fråga består av dokumentet vars nyckel är 41. Alla fält som har markerats som hämtningsbara i indexdefinitionen kan returneras i sökresultat och återges i din app.

{
    "HotelId": "41",
    "HotelName": "Windy Ocean Motel",
    "Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Inspired by the natural beauty of the island, each room includes an original painting of local scenes by the owner. Rooms include a mini fridge, Keurig coffee maker, and flatscreen TV. Various shops and art entertainment are on the boardwalk, just steps away.",
    "Description_fr": "Cet hôtel en bord de mer donnant sur la plage propose des chambres dotées d'un balcon privé et de 2 piscines intérieure et extérieure. Inspiré par la beauté naturelle de l'île, chaque chambre comprend une peinture originale de scènes locales par le propriétaire. Les chambres comprennent un mini-réfrigérateur, une cafetière Keurig et une télévision à écran plat. Divers magasins et divertissements artistiques se trouvent sur la promenade, à quelques pas.",
    "Category": "Suite",
    "Tags": [
    "pool",
    "air conditioning",
    "bar"
    ],
    "ParkingIncluded": true,
    "LastRenovationDate": "2021-05-10T00:00:00Z",
    "Rating": 3.5,
    "Location": {
    "type": "Point",
    "coordinates": [
        -157.846817,
        21.295841
    ],
    "crs": {
        "type": "name",
        "properties": {
        "name": "EPSG:4326"
        }
    }
    },
    "Address": {
    "StreetAddress": "1450 Ala Moana Blvd 2238 Ala Moana Ctr",
    "City": "Honolulu",
    "StateProvince": "HI",
    "PostalCode": "96814",
    "Country": "USA"
    }
}

Exempel 3: Filtrera på text

Filtersyntax är ett OData-uttryck som du kan använda själv eller med search. När det används tillsammans i samma begäran filter tillämpas först på hela indexet och sedan search utförs på resultatet av filtret. Filter kan därför vara en användbar teknik för att förbättra frågeprestanda eftersom de begränsar uppsättningen dokument som sökfrågan behöver bearbeta.

Filter kan definieras i valfritt fält som markerats som filterable i indexdefinitionen. För hotell-sample-index innehåller filterbara fält fält kategori, taggar, parkeringinkluderad, klassificering och de flesta adressfält .

POST /indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
    "search": "art tours",
    "queryType": "simple",
    "filter": "Category eq 'Boutique'",
    "searchFields": "HotelName,Description,Category",
    "select": "HotelId,HotelName,Description,Category",
    "count": true
}

Svaret för föregående fråga är begränsat till endast de hotell som kategoriserats som Boutique och som innehåller termerna konst eller turer. I det här fallet finns det bara en matchning.

"value": [
{
    "@search.score": 1.2814453,
    "HotelId": "2",
    "HotelName": "Old Century Hotel",
    "Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.",
    "Category": "Boutique"
}
]

Exempel 4: Filterfunktioner

Filteruttryck kan innehålla funktionerna search.ismatch och search.ismatchscoring, så att du kan skapa en sökfråga i filtret. Det här filteruttrycket använder ett jokertecken gratis för att välja bekvämligheter, inklusive gratis wifi, gratis parkering och så vidare.

POST /indexes/hotels-sample-index/docs/search?api-version=2024-07-01
  {
    "search": "",
    "filter": "search.ismatch('free*', 'Tags', 'full', 'any')",
    "select": "HotelName, Tags, Description",
    "count": true
  }

Svaret för föregående fråga matchar på 27 hotell som erbjuder kostnadsfria bekvämligheter. Observera att sökpoängen är en enhetlig 1 i hela resultatet. Det beror på att sökuttrycket är null eller tomt, vilket resulterar i ordagranna filtermatchningar, men ingen fulltextsökning. Relevanspoäng returneras endast vid fulltextsökning. Om du använder filter utan searchkontrollerar du att du har tillräckligt med sorterbara fält så att du kan styra sökrankningen.

  "@odata.count": 27,
  "value": [
    {
      "@search.score": 1,
      "HotelName": "Country Residence Hotel",
      "Description": "All of the suites feature full-sized kitchens stocked with cookware, separate living and sleeping areas and sofa beds. Some of the larger rooms have fireplaces and patios or balconies. Experience real country hospitality in the heart of bustling Nashville. The most vibrant music scene in the world is just outside your front door.",
      "Tags": [
        "laundry service",
        "restaurant",
        "free parking"
      ]
    },
    {
      "@search.score": 1,
      "HotelName": "Downtown Mix Hotel",
      "Description": "Mix and mingle in the heart of the city. Shop and dine, mix and mingle in the heart of downtown, where fab lake views unite with a cheeky design.",
      "Tags": [
        "air conditioning",
        "laundry service",
        "free wifi"
      ]
    },
    {
      "@search.score": 1,
      "HotelName": "Starlight Suites",
      "Description": "Complimentary Airport Shuttle & WiFi. Book Now and save - Spacious All Suite Hotel, Indoor Outdoor Pool, Fitness Center, Florida Green certified, Complimentary Coffee, HDTV",
      "Tags": [
        "pool",
        "coffee in lobby",
        "free wifi"
      ]
    },
. . .

Exempel 5: Intervallfilter

Intervallfiltrering stöds via filteruttryck för alla datatyper. Följande exempel illustrerar numeriska intervall och strängintervall. Datatyper är viktiga i intervallfilter och fungerar bäst när numeriska data finns i numeriska fält och strängdata i strängfält. Numeriska data i strängfält är inte lämpliga för intervall eftersom numeriska strängar inte är jämförbara.

Följande fråga är ett numeriskt intervall. I hotels-sample-index är Ratingdet enda filterbara numeriska fältet .

POST /indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
    "search": "*",
    "filter": "Rating ge 2 and Rating lt 4",
    "select": "HotelId, HotelName, Rating",
    "orderby": "Rating desc",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som i följande exempel, trimmat för korthet.

"@odata.count": 27,
"value": [
{
    "@search.score": 1,
    "HotelId": "22",
    "HotelName": "Lion's Den Inn",
    "Rating": 3.9
},
{
    "@search.score": 1,
    "HotelId": "25",
    "HotelName": "Waterfront Scottish Inn",
    "Rating": 3.8
},
{
    "@search.score": 1,
    "HotelId": "2",
    "HotelName": "Old Century Hotel",
    "Rating": 3.6
},
...

Nästa fråga är ett intervallfilter över ett strängfält (Adress/TillståndProvince):

POST /indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
    "search": "*",
    "filter": "Address/StateProvince ge 'A*' and Address/StateProvince lt 'D*'",
    "select": "HotelId, HotelName, Address/StateProvince",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som i följande exempel, trimmat för korthet. I det här exemplet går det inte att sortera StateProvince efter eftersom fältet inte tillskrivs som sorterbart i indexdefinitionen.

{
  "@odata.count": 9,
  "value": [
    {
      "@search.score": 1,
      "HotelId": "39",
      "HotelName": "White Mountain Lodge & Suites",
      "Address": {
        "StateProvince": "CO"
      }
    },
    {
      "@search.score": 1,
      "HotelId": "9",
      "HotelName": "Smile Up Hotel",
      "Address": {
        "StateProvince": "CA "
      }
    },
    {
      "@search.score": 1,
      "HotelId": "7",
      "HotelName": "Roach Motel",
      "Address": {
        "StateProvince": "CA "
      }
    },
    {
      "@search.score": 1,
      "HotelId": "34",
      "HotelName": "Lakefront Captain Inn",
      "Address": {
        "StateProvince": "CT"
      }
    },
    {
      "@search.score": 1,
      "HotelId": "37",
      "HotelName": "Campus Commander Hotel",
      "Address": {
        "StateProvince": "CA "
      }
    },
. . . 

Hotels-sample-index innehåller ett platsfält med latitud- och longitudkoordinater. I det här exemplet används funktionen geo.distance som filtrerar dokument inom omkretsen av en startpunkt, ut till ett godtyckligt avstånd (i kilometer) som du anger. Du kan justera det sista värdet i frågan (10) för att minska eller förstora frågans yta.

POST /indexes/v/docs/search?api-version=2024-07-01
{
    "search": "*",
    "filter": "geo.distance(Location, geography'POINT(-122.335114 47.612839)') le 10",
    "select": "HotelId, HotelName, Address/City, Address/StateProvince",
    "count": true
}

Svaret för den här frågan returnerar alla hotell inom ett 10 kilometer långt avstånd från de koordinater som tillhandahålls:

{
  "@odata.count": 3,
  "value": [
    {
      "@search.score": 1,
      "HotelId": "45",
      "HotelName": "Happy Lake Resort & Restaurant",
      "Address": {
        "City": "Seattle",
        "StateProvince": "WA"
      }
    },
    {
      "@search.score": 1,
      "HotelId": "24",
      "HotelName": "Uptown Chic Hotel",
      "Address": {
        "City": "Seattle",
        "StateProvince": "WA"
      }
    },
    {
      "@search.score": 1,
      "HotelId": "16",
      "HotelName": "Double Sanctuary Resort",
      "Address": {
        "City": "Seattle",
        "StateProvince": "WA"
      }
    }
  ]
}

Exempel 7: Booleska värden med searchMode

Enkel syntax stöder booleska operatorer i form av tecken (+, -, |) för att stödja AND-, OR- och NOT-frågelogik. Boolesk sökning fungerar som förväntat, med några anmärkningsvärda undantag.

I en boolesk sökning bör du överväga att lägga till parametern searchMode som en mekanism för att påverka precision och återkallande. Giltiga värden inkluderar "searchMode": "any" att gynna återkallande (ett dokument som uppfyller något av kriterierna anses vara en matchning) och "searchMode": "all" att gynna precision (alla kriterier måste matchas i ett dokument).

I samband med en boolesk sökning kan standardvärdet "searchMode": "any" vara förvirrande om du staplar en fråga med flera operatorer och blir bredare i stället för smalare resultat. Detta gäller särskilt med NOT, där resultaten innehåller alla dokument som inte innehåller en viss term eller fras.

I följande exempel visas en bild. Frågan söker efter matchningar på en restaurang som exkluderar frasen luftkonditionering. Om du kör följande fråga med searchMode (valfritt) returneras 43 dokument: de som innehåller termen restaurang, plus alla dokument som inte har frasen *luftkonditionering.

Observera att det inte finns något utrymme mellan den booleska operatorn (-) och frasen luftkonditionering. Citattecknen är undantagna (\").

POST /indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
    "search": "restaurant -\"air conditioning\"",
    "searchMode": "any",
    "searchFields": "Tags",
    "select": "HotelId, HotelName, Tags",
    "count": true
}

Att ändra till "searchMode": "all" tillämpar en kumulativ effekt på kriterier och returnerar en mindre resultatuppsättning (sju matchningar) som består av dokument som innehåller termen restaurang, minus de som innehåller frasen luftkonditionering.

Svaret för den här frågan skulle nu se ut ungefär som i följande exempel, trimmat för korthet.

{
  "@odata.count": 14,
  "value": [
    {
      "@search.score": 3.1383743,
      "HotelId": "18",
      "HotelName": "Ocean Water Resort & Spa",
      "Tags": [
        "view",
        "pool",
        "restaurant"
      ]
    },
    {
      "@search.score": 2.028083,
      "HotelId": "22",
      "HotelName": "Lion's Den Inn",
      "Tags": [
        "laundry service",
        "free wifi",
        "restaurant"
      ]
    },
    {
      "@search.score": 2.028083,
      "HotelId": "34",
      "HotelName": "Lakefront Captain Inn",
      "Tags": [
        "restaurant",
        "laundry service",
        "coffee in lobby"
      ]
    },
...

Exempel 8: Växlingsresultat

I tidigare exempel har du lärt dig om parametrar som påverkar sökresultatets sammansättning, inklusive select som avgör vilka fält som finns i ett resultat, sorteringsordningar och hur du inkluderar antalet matchningar. Det här exemplet är en fortsättning på sökresultatets sammansättning i form av växlingsparametrar som gör att du kan batcha antalet resultat som visas på en viss sida.

Som standard returnerar en söktjänst de 50 bästa matchningarna. Om du vill kontrollera antalet matchningar på varje sida använder du top för att definiera batchens storlek och använder skip sedan för att hämta efterföljande batchar.

I följande exempel används ett filter och en sorteringsordning i Rating fältet (Klassificering är både filterbar och sorterbar) eftersom det är lättare att se effekterna av växling på sorterade resultat. I en vanlig fullständig sökfråga rangordnas och bläddras de översta matchningarna efter @search.score.

POST /indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
    "search": "*",
    "filter": "Rating gt 4",
    "select": "HotelName, Rating",
    "orderby": "Rating desc",
    "top": 5,
    "count": true
}

Frågan hittar 21 matchande dokument, men eftersom du angav topreturnerar svaret bara de fem bästa matchningarna, med klassificeringar som börjar på 4,9 och slutar på 4,7 med Lakeside B & B.

Hoppa över den första batchen för att få de kommande fem:

POST /indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
    "search": "*",
    "filter": "Rating gt 4",
    "select": "HotelName, Rating",
    "orderby": "Rating desc",
    "top": 5,
    "skip": 5,
    "count": true
}

Svaret för den andra batchen hoppar över de första fem matchningarna och returnerar de kommande fem, från och med Pull'r Inn Motel. Om du vill fortsätta med fler batchar behåller top du vid fem och ökar sedan med skip fem för varje ny begäran (skip=5, skip=10, skip=15 och så vidare).

{
  "@odata.count": 21,
  "value": [
    {
      "@search.score": 1,
      "HotelName": "Head Wind Resort",
      "Rating": 4.7
    },
    {
      "@search.score": 1,
      "HotelName": "Sublime Palace Hotel",
      "Rating": 4.6
    },
    {
      "@search.score": 1,
      "HotelName": "City Skyline Antiquity Hotel",
      "Rating": 4.5
    },
    {
      "@search.score": 1,
      "HotelName": "Nordick's Valley Motel",
      "Rating": 4.5
    },
    {
      "@search.score": 1,
      "HotelName": "Winter Panorama Resort",
      "Rating": 4.5
    }
  ]
}

Nu när du har lite övning med den grundläggande frågesyntaxen kan du prova att ange frågor i kod. Följande länk beskriver hur du konfigurerar sökfrågor med hjälp av Azure SDK:er.

Mer syntaxreferens, frågearkitektur och exempel finns i följande länkar: