De rangschikking van een document verbeteren met termverhoging
Zoeken werkt het beste wanneer de meest relevante resultaten eerst worden weergegeven. Alle zoekmachines proberen de meest relevante resultaten te retourneren aan zoekquery's. Azure AI Search implementeert een verbeterde versie van Apache Lucene voor zoeken in volledige tekst.
Hier leert u hoe u complexere Lucene-query's schrijft. Vervolgens verbetert u de relevantie van resultaten door specifieke termen in uw zoekquery te stimuleren.
Een index doorzoeken
Met Azure AI Search kunt u een query uitvoeren op een index met behulp van een REST-eindpunt of in Azure Portal met het hulpprogramma Search Explorer. Als u een kort overzicht wilt van de fasen van het verwerken van query's, raadpleegt u de zoekindexeenheid in Een Azure AI Search-oplossing maken.
In deze les richt u zich op het parseren van query's.
U gebruikt Search Explorer om het verschil te zien tussen het gebruik van het eenvoudige en volledige querytype en het effect hiervan is uw zoekresultaten.
Notitie
Als u de query's zelf wilt uitvoeren, hebt u een Azure-abonnement nodig. Maak een Azure AI-Search-service en importeer de voorbeeldgegevens van de hotels in een index.
Een eenvoudige query schrijven
De voorbeeldgegevens van het hotel bevatten 50 hotels met beschrijvingen, kamergegevens en hun locaties. Stel dat u een hotelboekingsbedrijf uitvoert en een app hebt waarmee gebruikers hotels kunnen boeken. Gebruikers kunnen zoeken en de meest relevante hotels moeten eerst worden weergegeven.
U hebt een use case waarbij een klant een luxe hotel probeert te vinden. Bekijk eerst de zoekresultaten van deze eenvoudige query:
search=luxury&$select=HotelId, HotelName, Category, Tags, Description&$count=true
De query parseert de term luxury
voor alle velden voor een document in de index.
De queryreeks beperkt ook de geretourneerde velden uit documenten door de select
optie toe te voegen.
&$select=HotelId, HotelName, Category, Tags, Description
De laatste parameter van de query vraagt de index om de totale resultaten te tellen.
$count=true
Er is geen lexicale analyse nodig, dus bij het ophalen van documenten worden 14 documenten geretourneerd. De eerste drie zijn:
{
"@odata.context": "https://advanced-cognitive-search.search.windows.net/indexes('hotels-sample-index')/$metadata#docs(*)",
"@odata.count": 14,
"value": [
{
"@search.score": 2.633778,
"HotelId": "13",
"HotelName": "Historic Lion Resort",
"Description": "Unmatched Luxury. Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort",
"Category": "Budget",
"Tags": [
"view",
"free wifi",
"free wifi"
]
},
{
"@search.score": 2.1104424,
"HotelId": "18",
"HotelName": "Oceanside Resort",
"Description": "New Luxury Hotel. Be the first to stay. Bay views from every room, location near the piper, rooftop pool, waterfront dining & more.",
"Category": "Budget",
"Tags": [
"view",
"laundry service",
"air conditioning"
]
},
{
"@search.score": 1.966516,
"HotelId": "40",
"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.",
"Category": "Luxury",
"Tags": [
"continental breakfast",
"view",
"view"
]
},
...
]
}
De klant kan verbaasd zijn dat het tophotel dat u hebt dat luxe hoort te zijn, zich in de budgetcategorie bevindt en geen airconditioning heeft. Als de klant meerdere woorden invoert in de zoekopdracht, gaat uw app ervan uit dat alle termen in de resultaten moeten staan, zodat + wordt toegevoegd aan de query. De query die naar de API wordt verzonden, is:
search=luxury + air con&$select=HotelId, HotelName, Category, Tags, Description&$count=true
De zoekservice retourneert nu vijf documenten, maar de belangrijkste resultaten bevinden zich nog steeds in de budgetcategorie.
De Lucene-queryparser inschakelen
U kunt de search explorer laten weten dat de Lucene-queryparser moet worden gebruikt door deze toe te voegen &queryType=full
aan de querytekenreeks.
search=luxury AND air con&$select=HotelId, HotelName, Category, Tags, Description&$count=true&queryType=full
Met de Lucene-syntaxis kunt u nauwkeurigere query's schrijven. Hier volgt een overzicht van de beschikbare functies:
- Booleaanse operatoren:
AND
,NOT
OR
bijvoorbeeldluxury AND 'air con'
. - Zoeken in velden:
fieldName:search term
bijvoorbeeldDescription:luxury AND Tags:air con
. - Fuzzy zoekopdracht:
~
retourneert bijvoorbeeldDescription:luxury~
resultaten met verkeerd gespelde versies van luxe. - Zoeken in termennabijheid:
"term1 term2"~n
retourneert bijvoorbeeld"indoor swimming pool"~3
documenten met de woorden binnen een binnenzwembad binnen drie woorden van elkaar. - Reguliere expressie zoeken:
/regular expression/
gebruik een reguliere expressie tussen/
bijvoorbeeld/[mh]otel/
documenten retourneren met hotel en motel. - Zoeken met jokertekens:
*
,?
waarbij*
veel tekens overeenkomen en?
overeenkomt met één teken, zou bijvoorbeeld'air con'*
airconditioning en airconditioning vinden. - Prioriteitsgroepering:
(term AND (term OR term))
bijvoorbeeld(Description:luxury OR Category:luxury) AND Tags:air?con*
. - Termverhoging:
^
bijvoorbeeldDescription:luxury OR Category:luxury^3
hotels met de categorie luxe een hogere score geven dan luxe in de beschrijving.
Zie Lucene-querysyntaxis in Azure AI Search voor meer informatie over deze functies.
Zoektermen verhogen
Met behulp van het bovenstaande kunt u de resultaten verbeteren. De parser moet een hogere prioriteit geven aan hotels in de luxe categorie. U kunt ook nauwkeuriger zijn en zoeken naar airconditioning in het veld Tags .
(Description:luxury OR Category:luxury^3) AND Tags:'air con'*
Als u de andere queryreeksparameters toevoegt, krijgt u deze queryreeks:
search=(Description:luxury OR Category:luxury^3) AND Tags:'air con'*&$select=HotelId, HotelName, Category, Tags, Description&$count=true&queryType=full
De drie beste hotels zijn nu:
{
"@odata.context": "https://advanced-cognitive-search.search.windows.net/indexes('hotels-sample-index')/$metadata#docs(*)",
"@odata.count": 5,
"value": [
{
"@search.score": 5.3537707,
"HotelId": "8",
"HotelName": "Sapphire Resort",
"Description": "Downtown, close to everything, steps to the park, shopping, and restaurants.",
"Category": "Luxury",
"Tags": [
"free wifi",
"continental breakfast",
"air conditioning"
]
},
{
"@search.score": 5.3522806,
"HotelId": "49",
"HotelName": "Old Carrabelle Hotel",
"Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
"Category": "Luxury",
"Tags": [
"air conditioning",
"laundry service",
"24-hour front desk service"
]
},
{
"@search.score": 4.1448884,
"HotelId": "18",
"HotelName": "Oceanside Resort",
"Description": "New Luxury Hotel. Be the first to stay. Bay views from every room, location near the piper, rooftop pool, waterfront dining & more.",
"Category": "Budget",
"Tags": [
"view",
"laundry service",
"air conditioning"
]
},
...
]
}
De zoekscore van De Saffieren Resorts is toegenomen van 2.3321536 tot 5.3537707 en is nu het eerste hotel dat de klant zal zien. Het Oceanside Resort is nu op de derde plaats.