Delen via


Voorbeelden van volledige Lucene-zoeksyntaxis (geavanceerde query's)

Bij het maken van query's voor Azure AI Search kunt u de standaard eenvoudige queryparser vervangen door de krachtigere Lucene-queryparser om gespecialiseerde en geavanceerde query-expressies te formuleren.

De Lucene-parser ondersteunt complexe queryindelingen, zoals query's met veldbereik, fuzzy zoeken, zoeken infix en achtervoegsel met jokertekens, nabijheid zoeken, zoeken in nabijheid, zoeken naar termen en zoeken in reguliere expressies. De extra kracht wordt geleverd met meer verwerkingsvereisten, zodat u een iets langere uitvoeringstijd kunt verwachten. In dit artikel kunt u voorbeelden bekijken die querybewerkingen demonstreren op basis van de volledige syntaxis.

Notitie

Veel van de gespecialiseerde queryconstructies die zijn ingeschakeld via de volledige Lucene-querysyntaxis, zijn niet door tekst geanalyseerd, wat verrassend kan zijn als u stemming of lemmatisatie verwacht. Lexicale analyse wordt alleen uitgevoerd op volledige termen (een termquery of woordgroepsquery). Querytypen met onvolledige termen (voorvoegselquery, jokertekenquery, regex-query, fuzzy-query) worden rechtstreeks toegevoegd aan de querystructuur, waardoor de analysefase wordt overgeslagen. De enige transformatie die wordt uitgevoerd op gedeeltelijke querytermen, is lager.

Voorbeeldindex hotels

De volgende query's zijn gebaseerd op de hotels-sample-index, die u kunt maken door de instructies in deze quickstart te volgen.

Voorbeeldquery's worden geformuleerd met behulp van de REST API en POST-aanvragen. U kunt deze plakken en uitvoeren in een REST-client. Of gebruik de JSON-weergave van Search Explorer in Azure Portal. In de JSON-weergave kunt u de queryvoorbeelden plakken die hier in dit artikel worden weergegeven.

Aanvraagheaders moeten de volgende waarden hebben:

Sleutel Weergegeven als
Content-Type application/json
api-key <your-search-service-api-key>, query of beheersleutel

URI-parameters moeten uw eindpunt voor de zoekservice bevatten met de indexnaam, docs-verzamelingen, zoekopdracht en API-versie, vergelijkbaar met het volgende voorbeeld:

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

De aanvraagbody moet worden gevormd als geldige JSON:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • search ingesteld op * is een niet-opgegeven query, gelijk aan null of lege zoekopdracht. Het is niet bijzonder nuttig, maar het is de eenvoudigste zoekopdracht die u kunt uitvoeren en toont alle opvraagbare velden in de index, met alle waarden.

  • queryType ingesteld op volledig aanroepen van de volledige Lucene-queryparser en is vereist voor deze syntaxis.

  • select ingesteld op een door komma's gescheiden lijst met velden wordt gebruikt voor de samenstelling van zoekresultaten, inclusief alleen de velden die nuttig zijn in de context van zoekresultaten.

  • count retourneert het aantal documenten dat overeenkomt met de zoekcriteria. In een lege zoekreeks zijn alle documenten in de index (50 in de hotels-sample-index).

In een veld geplaatste zoekbereiken afzonderlijke, ingesloten zoekexpressies voor een specifiek veld. In dit voorbeeld wordt gezocht naar hotelnamen met de term hotel in hen, maar niet motel. U kunt meerdere velden opgeven met behulp van AND.

Wanneer u deze querysyntaxis gebruikt, kunt u de searchFields parameter weglaten wanneer de velden die u wilt opvragen zich in de zoekexpressie zelf bevinden. Als u een zoekopdracht met velden opneemt searchFields , heeft de fieldName:searchExpression functie altijd voorrang op 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
}

Het antwoord voor deze query moet er ongeveer uitzien als in het volgende voorbeeld, gefilterd op Boutique, retourneert hotels met hotel in de naam, terwijl de resultaten worden uitgesloten die motel in de naam bevatten.

{
  "@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"
    }
  ]
}

De zoekexpressie kan één term of woordgroep zijn, of een complexere expressie tussen haakjes, eventueel met Booleaanse operatoren. Enkele voorbeelden zijn:

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

Zorg ervoor dat u een woordgroep tussen aanhalingstekens plaatst als u wilt dat beide tekenreeksen als één entiteit worden geëvalueerd, zoals in dit geval het zoeken naar twee afzonderlijke locaties in het Address/StateProvince veld. Afhankelijk van de client moet u mogelijk de aanhalingstekens () ontsnappen\.

Het opgegeven fieldName:searchExpression veld moet een doorzoekbaar veld zijn. Zie Create Index (REST API) voor meer informatie over hoe velddefinities worden toegeschreven.

Fuzzy zoekopdrachten komen overeen met termen die vergelijkbaar zijn, inclusief verkeerd gespelde woorden. Als u een fuzzy zoekopdracht wilt uitvoeren, voegt u het tilde-symbool ~ toe aan het einde van één woord met een optionele parameter, een waarde tussen 0 en 2, die de bewerkingsafstand aangeeft. Of blue~1 retourneert bijvoorbeeld blue~ blauw, blauw en lijm.

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
}

Het antwoord voor deze query wordt omgezet in concierge in de overeenkomende documenten, ingekort voor beknoptheid:

{
  "@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"
      ]
    },
. . .
  ]
}

Zinnen worden niet rechtstreeks ondersteund, maar u kunt een fuzzy overeenkomst opgeven voor elke term van een meerdelige woordgroep, zoals search=Tags:landy~ AND sevic~. Deze queryexpressie vindt 15 overeenkomsten op de wasservice.

Notitie

Fuzzy query's worden niet geanalyseerd. Querytypen met onvolledige termen (voorvoegselquery, jokertekenquery, regex-query, fuzzy-query) worden rechtstreeks toegevoegd aan de querystructuur, waardoor de analysefase wordt overgeslagen. De enige transformatie die wordt uitgevoerd op gedeeltelijke querytermen, is kleine letters.

Zoeken in nabijheid vindt termen die zich in de buurt van elkaar in een document bevinden. Voeg een tildesymbool ~ toe aan het einde van een woordgroep, gevolgd door het aantal woorden dat de nabijheidsgrens creëert.

Met deze query wordt gezocht naar de termen hotel en luchthaven binnen vijf woorden van elkaar in een document. De aanhalingstekens zijn ontsnapt (\") om de woordgroep te behouden:

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
}

Het antwoord voor deze query moet er ongeveer uitzien als in het volgende voorbeeld:

{
  "@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."
    }
  ]
}

Voorbeeld 4: Termverhoging

Termverbetering verwijst naar het rangschikken van een document dat hoger is als het de boosted term bevat, ten opzichte van documenten die de term niet bevatten. Als u een term wilt verhogen, gebruikt u de caret, ^het symbool met een boostfactor (een getal) aan het einde van de term die u zoekt. De standaardwaarde van de boostfactor is 1 en hoewel het positief moet zijn, kan deze kleiner zijn dan 1 (bijvoorbeeld 0,2). Termenverhoging verschilt van scoreprofielen in die scoreprofielen verhogen bepaalde velden, in plaats van specifieke termen.

In deze voorafgaande query zoekt u naar strandtoegang en ziet u dat er zes documenten zijn die overeenkomen met een of beide termen.

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
}

In feite komen slechts twee documenten overeen bij toegang. Het eerste exemplaar bevindt zich op de tweede positie, ook al ontbreekt het term 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"
      ]
    }
  ]
}

Herhaal in de naquery de zoekopdracht, deze keer het stimuleren van resultaten met het termenstrand via de termtoegang. Een door mensen leesbare versie van de query is search=Description:beach^2 access. Afhankelijk van uw client moet u mogelijk uitdrukken ^2 als %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
}

Nadat je het termenstrand hebt verhoogd, gaat de wedstrijd op Campus Commander Hotel naar de vijfde plaats.

{
  "@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"
      ]
    }
  ]
}

Voorbeeld 5: Regex

Een reguliere expressiezoekopdracht vindt een overeenkomst op basis van de inhoud tussen slashes /, zoals beschreven in de RegExp-klasse.

POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-01
{
    "search": "HotelName:/(Mo|Ho)tel/",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

Het antwoord voor deze query moet er ongeveer uitzien als in het volgende voorbeeld (ingekort voor beknoptheid):

{
  "@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"
    }
  ]
}

Notitie

Regex-query's worden niet geanalyseerd. De enige transformatie die wordt uitgevoerd op gedeeltelijke querytermen, is kleine letters.

U kunt algemeen herkende syntaxis gebruiken voor zoekopdrachten met meerdere (*) of één (?) jokerteken. De Lucene-queryparser ondersteunt het gebruik van deze symbolen met één term en niet een woordgroep.

Zoek in deze query naar hotelnamen die het voorvoegsel sc bevatten. U kunt een * of ? symbool niet gebruiken als het eerste teken van een zoekopdracht.

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

Het antwoord voor deze query moet er ongeveer uitzien als in het volgende voorbeeld:

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

Notitie

Jokertekenquery's worden niet geanalyseerd. De enige transformatie die wordt uitgevoerd op gedeeltelijke querytermen, is kleine letters.

Probeer query's in code op te geven. In de volgende koppeling wordt beschreven hoe u zoekquery's instelt met behulp van de Azure SDK's.

Meer syntaxisreferenties, queryarchitectuur en voorbeelden vindt u in de volgende artikelen: