Gedeeltelijke zoektermen en patronen met speciale tekens (afbreekstreepjes, jokertekens, regex, patronen)
Een gedeeltelijke zoekfunctie verwijst naar query's die bestaan uit termenfragmenten, waarbij u in plaats van een hele term mogelijk alleen het begin, het midden of het einde van de term hebt (soms ook wel voorvoegsel-, invoegsel- of achtervoegselquery's genoemd). Een gedeeltelijke zoekterm kan een combinatie van fragmenten bevatten, vaak met speciale tekens, zoals afbreekstreepjes, streepjes of slashes die deel uitmaken van de querytekenreeks. Veelvoorkomende gebruiksvoorbeelden zijn delen van een telefoonnummer, URL, codes of afbreekstreepjes.
Gedeeltelijke termen en speciale tekens kunnen problematisch zijn als de index geen token heeft dat het tekstfragment aangeeft waarnaar u wilt zoeken. Tijdens de lexicale analysefase van het indexeren van trefwoorden (ervan uitgaande dat de standaardanalyse wordt gebruikt), worden speciale tekens verwijderd, worden samengestelde woorden gesplitst en witruimte verwijderd. Als u zoekt naar een tekstfragment dat is gewijzigd tijdens lexicale analyse, mislukt de query omdat er geen overeenkomst wordt gevonden. Bekijk dit voorbeeld: een telefoonnummer zoals +1 (425) 703-6214
(tokenized als "1"
, "425"
, "703"
, "6214"
) wordt niet weergegeven in een "3-62"
query omdat die inhoud niet daadwerkelijk in de index bestaat.
De oplossing is om een analyse aan te roepen tijdens het indexeren, waarbij een volledige tekenreeks behouden blijft, inclusief spaties en speciale tekens, zodat u de spaties en tekens in de querytekenreeks kunt opnemen. Door een hele, niet-gestoken tekenreeks te hebben, kunnen patroonkoppelingen worden gebruikt voor query's 'begint met' of 'eindigt met', waarbij het patroon dat u opgeeft, kan worden geëvalueerd op basis van een term die niet wordt getransformeerd door lexicale analyse.
Als u zoekscenario's wilt ondersteunen waarin geanalyseerde en niet-geanalyseerde inhoud wordt aangeroepen, kunt u overwegen om twee velden in uw index te maken, één voor elk scenario. Eén veld ondergaat lexicale analyse. In het tweede veld wordt een intacte tekenreeks opgeslagen met behulp van een analyse met inhoudsbehoud waarmee tokens voor hele tekenreeksen worden verzonden voor patroonkoppeling.
Over gedeeltelijke zoektermen
Azure AI Search scant op hele tokenized termen in de index en vindt geen overeenkomst op een gedeeltelijke term, tenzij u tijdelijke aanduidingen voor jokertekens (*
en ?
) opneemt, of de query opmaken als een reguliere expressie.
Gedeeltelijke termen worden opgegeven met behulp van deze technieken:
Reguliere expressiequery's kunnen elke reguliere expressie zijn die geldig is onder Apache Lucene.
Jokertekenoperators met overeenkomende voorvoegsels verwijzen naar een algemeen herkend patroon dat het begin van een term bevat, gevolgd door
*
of?
achtervoegseloperators, zoalssearch=cap*
overeenkomen met "Cap'n Jack's Waterfront Inn" of "Highline Capital". Voorvoegselkoppeling wordt ondersteund in zowel eenvoudige als volledige Lucene-querysyntaxis.Jokerteken met infix- en achtervoegselkoppeling plaatst de
*
en?
operatoren in of aan het begin van een term en vereist reguliere expressiesyntaxis (waarbij de expressie wordt geplaatst met slashes). De querytekenreeks (search=/.*numeric.*/
) retourneert bijvoorbeeld resultaten op alfanumerieke en alfanumerieke waarden als achtervoegsel en invoegselovereenkomsten.
Voor reguliere expressies, jokertekens en fuzzy zoekopdrachten worden analyses niet gebruikt tijdens het uitvoeren van query's. Voor deze queryformulieren, die de parser detecteert door de aanwezigheid van operators en scheidingstekens, wordt de queryreeks zonder lexicale analyse doorgegeven aan de engine. Voor deze queryformulieren wordt de analyse die is opgegeven in het veld genegeerd.
Notitie
Wanneer een gedeeltelijke querytekenreeks tekens bevat, zoals slashes in een URL-fragment, moet u mogelijk escapetekens toevoegen. In JSON wordt een slash met een achterste slash /
\
ontsnapt. Is als zodanig search=/.*microsoft.com\/azure\/.*/
de syntaxis voor het URL-fragment 'microsoft.com/azure/'.
Problemen met gedeeltelijke/patroonzoekopdrachten oplossen
Wanneer u wilt zoeken op fragmenten of patronen of speciale tekens, kunt u de standaardanalyse overschrijven met een aangepaste analyse die werkt onder eenvoudigere tokenisatieregels, waarbij de hele tekenreeks in de index behouden blijft.
De aanpak ziet er als volgt uit:
- Definieer een tweede veld om een intacte versie van de tekenreeks op te slaan (ervan uitgaande dat u tekst wilt analyseren en niet-geanalyseerd op het moment van de query)
- Evalueren en kiezen tussen de verschillende analysen die tokens verzenden op het juiste niveau van granulariteit
- De analyse toewijzen aan het veld
- De index bouwen en testen
1 - Een toegewezen veld maken
Analysefuncties bepalen hoe termen in een index worden getokeniseerd. Omdat analyses per veld worden toegewezen, kunt u velden in uw index maken om te optimaliseren voor verschillende scenario's. U kunt bijvoorbeeld 'featureCode' en 'featureCodeRegex' definiëren ter ondersteuning van gewone zoekopdrachten in volledige tekst op de eerste en geavanceerde patroonkoppeling op de tweede. De analysefuncties die aan elk veld zijn toegewezen, bepalen hoe de inhoud van elk veld wordt getokeniseerd in de index.
{
"name": "featureCode",
"type": "Edm.String",
"retrievable": true,
"searchable": true,
"analyzer": null
},
{
"name": "featureCodeRegex",
"type": "Edm.String",
"retrievable": true,
"searchable": true,
"analyzer": "my_custom_analyzer"
},
2 - Een analyse instellen
Bij het kiezen van een analyse die tokens voor hele termen produceert, zijn de volgende analysen veelvoorkomende keuzes:
Analyzer | Gedragingen |
---|---|
taalanalyses | Behoudt afbreekstreepjes in samengestelde woorden of tekenreeksen, klinkersmutaties en werkwoordvormen. Als querypatronen streepjes bevatten, kan het gebruik van een taalanalyse voldoende zijn. |
trefwoord | De inhoud van het hele veld wordt als één term getokeniseerd. |
Whitespace | Scheidt alleen op witruimten. Termen met streepjes of andere tekens worden behandeld als één token. |
aangepaste analyse | (aanbevolen) Als u een aangepaste analyse maakt, kunt u zowel het tokenizer- als het tokenfilter opgeven. De vorige analyses moeten als zodanig worden gebruikt. Met een aangepaste analyse kunt u kiezen welke tokenizers en tokenfilters u wilt gebruiken. Een aanbevolen combinatie is de trefwoordtokenizer met een tokenfilter in kleine letters. De ingebouwde trefwoordanalyse maakt zelf geen kleine hoofdletters, waardoor query's kunnen mislukken. Een aangepaste analyse biedt u een mechanisme voor het toevoegen van het tokenfilter met kleine letters. |
Met behulp van een REST-client kunt u de Test Analyzer REST-aanroep toevoegen om tokenized uitvoer te inspecteren.
De index moet bestaan in de zoekservice, maar kan leeg zijn. Gezien een bestaande index en een veld met streepjes of gedeeltelijke termen, kunt u verschillende analyses uitvoeren op specifieke termen om te zien welke tokens worden verzonden.
Controleer eerst de Standard Analyzer om te zien hoe termen standaard worden getokeniseerd.
{ "text": "SVP10-NOR-00", "analyzer": "standard" }
Evalueer het antwoord om te zien hoe de tekst in de index wordt getokeniseerd. U ziet hoe elke term kleine letters bevat, afbreekstreepjes worden verwijderd en subtekenreeksen zijn opgesplitst in afzonderlijke tokens. Alleen query's die overeenkomen met deze tokens, retourneren dit document in de resultaten. Een query met '10-NOR' mislukt.
{ "tokens": [ { "token": "svp10", "startOffset": 0, "endOffset": 5, "position": 0 }, { "token": "nor", "startOffset": 6, "endOffset": 9, "position": 1 }, { "token": "00", "startOffset": 10, "endOffset": 12, "position": 2 } ] }
Wijzig nu de aanvraag om de
whitespace
orkeyword
analyzer te gebruiken:{ "text": "SVP10-NOR-00", "analyzer": "keyword" }
Deze keer bestaat het antwoord uit één token, hoofdletters, waarbij streepjes behouden blijven als onderdeel van de tekenreeks. Als u wilt zoeken op een patroon of een gedeeltelijke term zoals '10-NOR', heeft de query-engine nu de basis voor het vinden van een overeenkomst.
{ "tokens": [ { "token": "SVP10-NOR-00", "startOffset": 0, "endOffset": 12, "position": 0 } ] }
Belangrijk
Houd er rekening mee dat queryparsers vaak kleine letters bevatten in een zoekexpressie bij het bouwen van de querystructuur. Als u een analyse gebruikt die geen kleine tekstinvoer gebruikt tijdens het indexeren en u geen verwachte resultaten krijgt, kan dit de reden zijn. De oplossing is het toevoegen van een tokenfilter met kleine letters, zoals beschreven in de sectie Aangepaste analyse gebruiken hieronder.
3 - Een analyse configureren
Of u nu analyses evalueert of verdergaat met een specifieke configuratie, u moet de analyse voor de velddefinitie opgeven en de analyse zelf mogelijk configureren als u geen ingebouwde analyse gebruikt. Bij het wisselen van analyses moet u doorgaans de index opnieuw opbouwen (neerzetten, opnieuw maken en opnieuw laden).
Ingebouwde analyseprogramma's gebruiken
Ingebouwde analysefuncties kunnen worden opgegeven op naam op een analyzer
eigenschap van een velddefinitie, zonder dat er extra configuratie is vereist in de index. In het volgende voorbeeld ziet u hoe u de whitespace
analyse instelt op een veld.
Zie Ingebouwde analyses voor andere scenario's en voor meer informatie over andere ingebouwde analyses.
{
"name": "phoneNumber",
"type": "Edm.String",
"key": false,
"retrievable": true,
"searchable": true,
"analyzer": "whitespace"
}
Aangepaste analyses gebruiken
Als u een aangepaste analyse gebruikt, definieert u deze in de index met een door de gebruiker gedefinieerde combinatie van tokenizer, tokenfilter, met mogelijke configuratie-instellingen. Verwijs hierna naar een velddefinitie, net zoals u een ingebouwde analyse zou doen.
Wanneer het doel hele term tokenisatie is, wordt een aangepaste analyse die bestaat uit een trefwoordtokenizer en een tokenfilter met kleine letters aanbevolen.
- Met de trefwoordtokenizer wordt één token gemaakt voor de volledige inhoud van een veld.
- Met het tokenfilter voor kleine letters worden hoofdletters omgezet in kleine letters. Queryparsers bevatten meestal kleine letters voor tekstinvoer in hoofdletters. Kleine letters homogeniseren de invoer met de tokenized termen.
In het volgende voorbeeld ziet u een aangepaste analyse die de trefwoordtokenizer en een tokenfilter met kleine letters biedt.
{
"fields": [
{
"name": "accountNumber",
"analyzer":"myCustomAnalyzer",
"type": "Edm.String",
"searchable": true,
"filterable": true,
"retrievable": true,
"sortable": false,
"facetable": false
}
],
"analyzers": [
{
"@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
"name":"myCustomAnalyzer",
"charFilters":[],
"tokenizer":"keyword_v2",
"tokenFilters":["lowercase"]
}
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": []
}
Notitie
Het keyword_v2
tokenizer- en lowercase
tokenfilter zijn bekend bij het systeem en het gebruik van hun standaardconfiguraties. Daarom kunt u ernaar verwijzen op naam zonder ze eerst te hoeven definiëren.
4 - Bouwen en testen
Nadat u een index hebt gedefinieerd met analyse- en velddefinities die ondersteuning bieden voor uw scenario, laadt u documenten met representatieve tekenreeksen, zodat u gedeeltelijke tekenreeksquery's kunt testen.
Gebruik een REST-client om gedeeltelijke termen en speciale tekens op te vragen die in dit artikel worden beschreven.
In de vorige secties is de logica uitgelegd. In deze sectie wordt elke API beschreven die u moet aanroepen bij het testen van uw oplossing.
Met Index verwijderen wordt een bestaande index met dezelfde naam verwijderd, zodat u deze opnieuw kunt maken.
Index maken maakt de indexstructuur in uw zoekservice, inclusief analysedefinities en velden met een analysespecificatie.
Documenten laden importeert documenten met dezelfde structuur als uw index, evenals doorzoekbare inhoud. Na deze stap is uw index klaar om een query of test uit te voeren.
Test Analyzer is geïntroduceerd in Set an analyzer. Test enkele tekenreeksen in uw index met behulp van verschillende analysefuncties om te begrijpen hoe termen worden tokenized.
In Zoekdocumenten wordt uitgelegd hoe u een queryaanvraag maakt met behulp van eenvoudige syntaxis of volledige Lucene-syntaxis voor jokertekens en reguliere expressies.
Voor gedeeltelijke termquery's, zoals het uitvoeren van query's op '3-6214' om een overeenkomst te vinden op +1 (425) 703-6214, kunt u de eenvoudige syntaxis gebruiken:
search=3-6214&queryType=simple
Voor invoegsel- en achtervoegselquery's, zoals het opvragen van 'getal' of 'numeriek om een overeenkomst te vinden op alfanumeriek', gebruikt u de volledige Lucene-syntaxis en een reguliere expressie:
search=/.*num.*/&queryType=full
Query's voor voor- en achtervoegsel optimaliseren
Voorvoegsels en achtervoegsels die overeenkomen met de standaardanalyse zijn extra queryfuncties vereist. Voorvoegsels vereisen zoeken in jokertekens en achtervoegsels vereisen reguliere expressiezoekopdrachten. Beide functies kunnen de prestaties van query's verminderen.
In het volgende voorbeeld wordt een EdgeNGramTokenFilter
voor- of achtervoegsel toegevoegd om het voor- of achtervoegsel sneller te laten overeenkomen. Tokens worden gegenereerd in combinaties van 2 tot 25 tekens die tekens bevatten. Hier volgt een voorbeeld van een voortgang van twee tot zeven tokens: MSF, MSFT, MSFT/, MSFT/S, MSFT/SQ, MSFT/SQL. EdgeNGramTokenFilter
vereist een side
parameter waarmee wordt bepaald op welke zijde van de tekenreekscombinaties wordt gegenereerd. Gebruiken front
voor voorvoegselquery's en back
voor achtervoegselquery's.
Extra tokenisatie resulteert in een grotere index. Als u voldoende capaciteit hebt voor de grotere index, is deze aanpak met de snellere reactietijd mogelijk de beste oplossing.
{
"fields": [
{
"name": "accountNumber_prefix",
"indexAnalyzer": "ngram_front_analyzer",
"searchAnalyzer": "keyword",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"sortable": false,
"facetable": false
},
{
"name": "accountNumber_suffix",
"indexAnalyzer": "ngram_back_analyzer",
"searchAnalyzer": "keyword",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"sortable": false,
"facetable": false
}
],
"analyzers": [
{
"@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
"name":"ngram_front_analyzer",
"charFilters":[],
"tokenizer":"keyword_v2",
"tokenFilters":["lowercase", "front_edgeNGram"]
},
{
"@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
"name":"ngram_back_analyzer",
"charFilters":[],
"tokenizer":"keyword_v2",
"tokenFilters":["lowercase", "back_edgeNGram"]
}
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": [
{
"@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
"name":"front_edgeNGram",
"minGram": 2,
"maxGram": 25,
"side": "front"
},
{
"@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
"name":"back_edgeNGram",
"minGram": 2,
"maxGram": 25,
"side": "back"
}
]
}
Als u wilt zoeken naar accountnummers waarmee u begint 123
, kunt u de volgende query gebruiken:
{
"search": "123",
"searchFields": "accountNumber_prefix"
}
Als u wilt zoeken naar accountnummers die eindigen op 456
, kunt u de volgende query gebruiken:
{
"search": "456",
"searchFields": "accountNumber_suffix"
}
Volgende stappen
In dit artikel wordt uitgelegd hoe analyses beide bijdragen aan queryproblemen en het oplossen van queryproblemen. Als volgende stap bekijkt u analyses die van invloed zijn op indexering en queryverwerking.