Dela via


Exempel på fullständig Lucene-söksyntax (avancerade frågor)

När du skapar frågor för Azure AI Search kan du ersätta den enkla standardfrågeparsern med den kraftfullare Lucene-frågeparsern för att formulera specialiserade och avancerade frågeuttryck.

Lucene-parsern stöder komplexa frågeformat, till exempel fältomfattande frågor, fuzzy-sökning, infix- och suffixsökning med jokertecken, närhetssökning, termförstärkning och sökning med reguljära uttryck. Den extra kraften medför fler bearbetningskrav, så du bör förvänta dig en något längre körningstid. I den här artikeln kan du gå igenom exempel som visar frågeåtgärder baserat på fullständig syntax.

Kommentar

Många av de specialiserade frågekonstruktioner som är aktiverade via den fullständiga Lucene-frågesyntaxen är inte textanalyserade, vilket kan vara förvånande om du förväntar dig härdning eller lemmatisering. Lexikal analys utförs endast på fullständiga termer (en termfråga eller frasfråga). Frågetyper med ofullständiga termer (prefixfråga, jokerteckenfråga, regex-fråga, fuzzy-fråga) läggs till direkt i frågeträdet och kringgår analyssteget. Den enda transformering som utförs på partiella frågetermer är lägre.

Hotell exempelindex

Följande frågor baseras på hotels-sample-index, som du kan skapa genom att följa anvisningarna i den här snabbstarten.

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": "full",
    "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å fullständig anropar den fullständiga Lucene-frågeparsern och krävs för den här syntaxen.

  • select inställd på en kommaavgränsad lista med fält används för sökresultatsammansättning, inklusive endast 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).

Fältsökomfattningar för enskilda, inbäddade sökuttryck till ett visst fält. Det här exemplet söker efter hotellnamn med termen hotell i dem, men inte motell. Du kan ange flera fält med hjälp av AND.

När du använder den här frågesyntaxen kan du utelämna parametern searchFields när fälten som du vill fråga finns i själva sökuttrycket. Om du inkluderar searchFields med fältsökning fieldName:searchExpression har alltid företräde framför searchFields.

POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
    "search": "HotelName:(hotel NOT motel) AND Category:'Boutique'",
    "queryType": "full",
    "select": "HotelName, Category",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som i följande exempel, filtrerat på Boutique och returnera hotell som innehåller hotell i namnet, samtidigt som resultat som inkluderar motell i namnet exkluderas.

{
  "@odata.count": 5,
  "value": [
    {
      "@search.score": 2.2289815,
      "HotelName": "Stay-Kay City Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.3862944,
      "HotelName": "City Skyline Antiquity Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.355046,
      "HotelName": "Old Century Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.355046,
      "HotelName": "Sublime Palace Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.355046,
      "HotelName": "Red Tide Hotel",
      "Category": "Boutique"
    }
  ]
}

Sökuttrycket kan vara en enda term eller en fras, eller ett mer komplext uttryck inom parenteser, eventuellt med booleska operatorer. Några exempel är följande:

  • HotelName:(hotel NOT motel)
  • Address/StateProvince:("WA" OR "CA")
  • Tags:("free wifi" NOT "free parking") AND "coffee in lobby"

Se till att placera en fras inom citattecken om du vill att båda strängarna ska utvärderas som en enda entitet, som i det här fallet söker efter två distinkta platser i Address/StateProvince fältet. Beroende på klienten kan du behöva undvika (\) citattecknen.

Fältet som anges i fieldName:searchExpression måste vara ett sökbart fält. Information om hur fältdefinitioner tillskrivs finns i Skapa index (REST API).

Fuzzy-sökning matchar på liknande termer, inklusive felstavade ord. Om du vill göra en fuzzy-sökning lägger du till tilde-symbolen ~ i slutet av ett enda ord med en valfri parameter, ett värde mellan 0 och 2, som anger redigeringsavståndet. Till exempel, blue~ eller blue~1 skulle returnera blått, blått och lim.

POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
    "search": "Tags:conserge~",
    "queryType": "full",
    "select": "HotelName, Category, Tags",
    "searchFields": "HotelName, Category, Tags",
    "count": true
}

Svaret för den här frågan matchar concierge i matchande dokument, trimmade för korthet:

{
  "@odata.count": 9,
  "value": [
    {
      "@search.score": 1.4947624,
      "HotelName": "Twin Vortex Hotel",
      "Category": "Luxury",
      "Tags": [
        "bar",
        "restaurant",
        "concierge"
      ]
    },
    {
      "@search.score": 1.1685618,
      "HotelName": "Stay-Kay City Hotel",
      "Category": "Boutique",
      "Tags": [
        "view",
        "air conditioning",
        "concierge"
      ]
    },
    {
      "@search.score": 1.1465473,
      "HotelName": "Old Century Hotel",
      "Category": "Boutique",
      "Tags": [
        "pool",
        "free wifi",
        "concierge"
      ]
    },
. . .
  ]
}

Fraser stöds inte direkt, men du kan ange en fuzzy-matchning för varje term i en fras i flera delar, till exempel search=Tags:landy~ AND sevic~. Det här frågeuttrycket hittar 15 matchningar i tvätttjänsten.

Kommentar

Fuzzy-frågor analyseras inte. Frågetyper med ofullständiga termer (prefixfråga, jokerteckenfråga, regex-fråga, fuzzy-fråga) läggs till direkt i frågeträdet och kringgår analyssteget. Den enda transformering som utförs på partiella frågetermer är lägre hölje.

Närhetssökning hittar termer som ligger nära varandra i ett dokument. Infoga en tilde-symbol ~ i slutet av en fras följt av antalet ord som skapar närhetsgränsen.

Den här frågan söker efter termerna hotell och flygplats inom fem ord från varandra i ett dokument. Citattecknen är undantagna (\") för att bevara frasen:

POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
    "search": "Description: \"hotel airport\"~5",
    "queryType": "full",
    "select": "HotelName, Description",
    "searchFields": "HotelName, Description",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som i följande exempel:

{
  "@odata.count": 1,
  "value": [
    {
      "@search.score": 0.69167054,
      "HotelName": "Trails End Motel",
      "Description": "Only 8 miles from Downtown. On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, All non-smoking hotel. Only 15 miles from airport."
    }
  ]
}

Exempel 4: Termstärning

Termhöjning syftar på att rangordna ett dokument högre om det innehåller den förbättrade termen i förhållande till dokument som inte innehåller termen. Om du vill öka en term använder du caret, ^, symbolen med en boostfaktor (ett tal) i slutet av den term som du söker efter. Standardvärdet för boostfaktorn är 1, och även om det måste vara positivt kan det vara mindre än 1 (till exempel 0,2). Termhöjning skiljer sig från bedömningsprofiler i och med att bedömningsprofiler ökar vissa fält snarare än specifika termer.

I den här före-frågan söker du efter åtkomst till stranden och märker att det finns sex dokument som matchar på en eller båda villkoren.

POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
    "search": "beach access",
    "queryType": "full",
    "select": "HotelName, Description, Tags",
    "searchFields": "HotelName, Description, Tags",
    "count": true
}

Faktum är att endast två dokument matchar vid åtkomst. Den första instansen är på andra plats, även om dokumentet saknar termen strand.

{
  "@odata.count": 6,
  "value": [
    {
      "@search.score": 1.068669,
      "HotelName": "Johnson's Family Resort",
      "Description": "Family oriented resort located in the heart of the northland. Operated since 1962 by the Smith family, we have grown into one of the largest family resorts in the state. The home of excellent Smallmouth Bass fishing with 10 small cabins, we're a home not only to fishermen but their families as well. Rebuilt in the early 2000's, all of our cabins have all the comforts of home. Sporting a huge **beach** with multiple water toys for those sunny summer days and a Lodge full of games for when you just can't swim anymore, there's always something for the family to do. A full marina offers watercraft rentals, boat launch, powered dock slips, canoes (free to use), & fish cleaning facility. Rent pontoons, 14' fishing boats, 16' fishing rigs or jet ski's for a fun day or week on the water. Pets are accepted in the lakeside cottages.",
      "Tags": [
        "24-hour front desk service",
        "pool",
        "coffee in lobby"
      ]
    },
    {
      "@search.score": 1.0162708,
      "HotelName": "Campus Commander Hotel",
      "Description": "Easy **access** to campus and steps away from the best shopping corridor in the city. From meetings in town or gameday, enjoy our prime location between the union and proximity to the university stadium.",
      "Tags": [
        "free parking",
        "coffee in lobby",
        "24-hour front desk service"
      ]
    },
    {
      "@search.score": 0.9050383,
      "HotelName": "Lakeside B & B",
      "Description": "Nature is Home on the **beach**. Explore the shore by day, and then come home to our shared living space to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
      "Tags": [
        "laundry service",
        "concierge",
        "free parking"
      ]
    },
    {
      "@search.score": 0.8955848,
      "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.",
      "Tags": [
        "pool",
        "air conditioning",
        "bar"
      ]
    },
    {
      "@search.score": 0.83636594,
      "HotelName": "Happy Lake Resort & Restaurant",
      "Description": "The largest year-round resort in the area offering more of everything for your vacation – at the best value! What can you enjoy while at the resort, aside from the mile-long sandy **beaches** of the lake? Check out our activities sure to excite both young and young-at-heart guests. We have it all, including being named “Property of the Year” and a “Top Ten Resort” by top publications.",
      "Tags": [
        "pool",
        "bar",
        "restaurant"
      ]
    },
    {
      "@search.score": 0.7808502,
      "HotelName": "Swirling Currents Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking **access** to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. ",
      "Tags": [
        "air conditioning",
        "laundry service",
        "24-hour front desk service"
      ]
    }
  ]
}

I efterfrågan upprepar du sökningen, den här gången ökar resultatet med termen strand över termen åtkomst. En läsbar version av frågan är search=Description:beach^2 access. Beroende på din klient kan du behöva uttrycka ^2 som %5E2.

POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
    "search": "Description:beach^2 access",
    "queryType": "full",
    "select": "HotelName, Description, Tags",
    "searchFields": "HotelName, Description, Tags",
    "count": true
}

När du har ökat termstranden flyttas matchen på Campus Commander Hotel ner till femte plats.

{
  "@odata.count": 6,
  "value": [
    {
      "@search.score": 2.137338,
      "HotelName": "Johnson's Family Resort",
      "Description": "Family oriented resort located in the heart of the northland. Operated since 1962 by the Smith family, we have grown into one of the largest family resorts in the state. The home of excellent Smallmouth Bass fishing with 10 small cabins, we're a home not only to fishermen but their families as well. Rebuilt in the early 2000's, all of our cabins have all the comforts of home. Sporting a huge beach with multiple water toys for those sunny summer days and a Lodge full of games for when you just can't swim anymore, there's always something for the family to do. A full marina offers watercraft rentals, boat launch, powered dock slips, canoes (free to use), & fish cleaning facility. Rent pontoons, 14' fishing boats, 16' fishing rigs or jet ski's for a fun day or week on the water. Pets are accepted in the lakeside cottages.",
      "Tags": [
        "24-hour front desk service",
        "pool",
        "coffee in lobby"
      ]
    },
    {
      "@search.score": 1.8100766,
      "HotelName": "Lakeside B & B",
      "Description": "Nature is Home on the beach. Explore the shore by day, and then come home to our shared living space to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
      "Tags": [
        "laundry service",
        "concierge",
        "free parking"
      ]
    },
    {
      "@search.score": 1.7911696,
      "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.",
      "Tags": [
        "pool",
        "air conditioning",
        "bar"
      ]
    },
    {
      "@search.score": 1.6727319,
      "HotelName": "Happy Lake Resort & Restaurant",
      "Description": "The largest year-round resort in the area offering more of everything for your vacation – at the best value! What can you enjoy while at the resort, aside from the mile-long sandy beaches of the lake? Check out our activities sure to excite both young and young-at-heart guests. We have it all, including being named “Property of the Year” and a “Top Ten Resort” by top publications.",
      "Tags": [
        "pool",
        "bar",
        "restaurant"
      ]
    },
    {
      "@search.score": 1.0162708,
      "HotelName": "Campus Commander Hotel",
      "Description": "Easy access to campus and steps away from the best shopping corridor in the city. From meetings in town or gameday, enjoy our prime location between the union and proximity to the university stadium.",
      "Tags": [
        "free parking",
        "coffee in lobby",
        "24-hour front desk service"
      ]
    },
    {
      "@search.score": 0.7808502,
      "HotelName": "Swirling Currents Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. ",
      "Tags": [
        "air conditioning",
        "laundry service",
        "24-hour front desk service"
      ]
    }
  ]
}

Exempel 5: Regex

En sökning med reguljära uttryck hittar en matchning baserat på innehållet mellan snedstreck /, enligt beskrivningen i klassen RegExp.

POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
    "search": "HotelName:/(Mo|Ho)tel/",
    "queryType": "full",
    "select": "HotelName",
    "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": 25,
  "value": [
    {
      "@search.score": 1,
      "HotelName": "Country Residence Hotel"
    },
    {
      "@search.score": 1,
      "HotelName": "Downtown Mix Hotel"
    },
    {
      "@search.score": 1,
      "HotelName": "Gastronomic Landscape Hotel"
    },
    . . . 
    {
      "@search.score": 1,
      "HotelName": "Trails End Motel"
    },
    {
      "@search.score": 1,
      "HotelName": "Nordick's Valley Motel"
    },
    {
      "@search.score": 1,
      "HotelName": "King's Cellar Hotel"
    }
  ]
}

Kommentar

Regex-frågor analyseras inte. Den enda transformering som utförs på partiella frågetermer är lägre hölje.

Du kan använda allmänt erkänd syntax för flera (*) eller enstaka (?) jokerteckensökningar. Lucene-frågeparsern stöder användningen av dessa symboler med en enda term och inte en fras.

I den här frågan söker du efter hotellnamn som innehåller prefixet sc. Du kan inte använda en * eller ? en symbol som det första tecknet i en sökning.

POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
    "search": "HotelName:sc*",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

Svaret för den här frågan bör se ut ungefär som i följande exempel:

{
  "@odata.count": 1,
  "value": [
    {
      "@search.score": 1,
      "HotelName": "Waterfront Scottish Inn"
    }
  ]
}

Kommentar

Jokerteckenfrågor analyseras inte. Den enda transformering som utförs på partiella frågetermer är lägre hölje.

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 artiklar: