Voorbeelden van 'volledige' Lucene-zoeksyntaxis (geavanceerde query's in Azure AI Search)

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 waarin querybewerkingen worden gedemonstreerd 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=2023-11-01

Aanvraagbody moet worden gevormd als geldige JSON:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • De zoekactie is ingesteld op * een niet-opgegeven query, die gelijk is aan null of leeg zoeken. 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 'full' roept de volledige Lucene-queryparser aan 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).

Afzonderlijke, ingesloten zoekexpressies voor een bepaald veld in een bepaald zoekbereik. 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=2023-11-01
{
    "search": "HotelName:(hotel NOT motel) AND Category:'Resort and Spa'",
    "queryType": "full",
    "select": "HotelName, Category",
    "count": true
}

Antwoord voor deze query moet er ongeveer uitzien als in het volgende voorbeeld, gefilterd op 'Resort en Spa', waarbij hotels worden geretourneerd die 'hotel' in de naam bevatten, terwijl de resultaten met 'motel' in de naam worden uitgesloten.

"@odata.count": 4,
"value": [
    {
        "@search.score": 4.481559,
        "HotelName": "Nova Hotel & Spa",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.4524608,
        "HotelName": "King's Palace Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.3970203,
        "HotelName": "Triple Landscape Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.2953436,
        "HotelName": "Peaceful Market Hotel & Spa",
        "Category": "Resort and Spa"
    }
]

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 veld Address/StateProvince. 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=2023-11-01
{
    "search": "Tags:conserge~",
    "queryType": "full",
    "select": "HotelName, Category, Tags",
    "searchFields": "HotelName, Category, Tags",
    "count": true
}

Antwoord voor deze query wordt omgezet in 'concierge' in de overeenkomende documenten, ingekort voor beknoptheid:

"@odata.count": 12,
"value": [
    {
        "@search.score": 1.1832147,
        "HotelName": "Secret Point Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "air conditioning",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1819803,
        "HotelName": "Twin Dome Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "free wifi",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1773309,
        "HotelName": "Smile Hotel",
        "Category": "Suite",
        "Tags": [
            "view",
            "concierge",
            "laundry service"
        ]
    },

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 '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 aan het einde van een woordgroep een tilde "~" in, gevolgd door het aantal woorden dat de nabijheidsgrens creëert.

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

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

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

"@odata.count": 2,
"value": [
    {
        "@search.score": 0.6331726,
        "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."
    },
    {
        "@search.score": 0.43032226,
        "HotelName": "Catfish Creek Fishing Cabins",
        "Description": "Brand new mattresses and pillows.  Free airport shuttle. Great hotel for your business needs. Comp WIFI, atrium lounge & restaurant, 1 mile from light rail."
    }
]

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.

Zoek in deze 'voor'-query naar 'strandtoegang' en u ziet dat er zeven documenten zijn die overeenkomen met een of beide termen.

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

In feite is er slechts één document dat overeenkomt met 'toegang', en omdat het de enige overeenkomst is, is de plaatsing hoog (tweede positie) zelfs als het document de term 'strand' mist.

"@odata.count": 7,
"value": [
    {
        "@search.score": 2.2723424,
        "HotelName": "Nova Hotel & Spa",
        "Description": "1 Mile from the airport.  Free WiFi, Outdoor Pool, Complimentary Airport Shuttle, 6 miles from the beach & 10 miles from downtown."
    },
    {
        "@search.score": 1.5507699,
        "HotelName": "Old Carrabelle Hotel",
        "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center."
    },
    {
        "@search.score": 1.5358944,
        "HotelName": "Whitefish Lodge & Suites",
        "Description": "Located on in the heart of the forest. Enjoy Warm Weather, Beach Club Services, Natural Hot Springs, Airport Shuttle."
    },
    {
        "@search.score": 1.3433652,
        "HotelName": "Ocean Air Motel",
        "Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Various shops and art entertainment are on the boardwalk, just steps away."
    },

Herhaal de zoekopdracht in de 'na'-query, deze keer het stimuleren van resultaten met de term 'strand' over de term 'toegang'. 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.

Na het stimuleren van de term "strand", gaat de match op Old Carrabelle Hotel naar de zesde plaats.

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=2023-11-01
{
    "search": "HotelName:/(Mo|Ho)tel/",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

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

    "@odata.count": 22,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Days Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Triple Landscape Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Smile Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Pelham Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Sublime Cliff Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Twin Dome Motel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Nova Hotel & Spa"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor 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. Let op 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=2023-11-01
{
    "search": "HotelName:sc*",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

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

    "@odata.count": 2,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scottish Inn"
        }
    ]

Notitie

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

Volgende stappen

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