Gedeeltelijke zoektermen en patronen met speciale tekens (afbreekstreepjes, jokertekens, regex, patronen)

Een gedeeltelijke termzoekopdracht verwijst naar query's die bestaan uit termfragmenten, waarbij u in plaats van een hele term mogelijk alleen het begin, het midden of het einde van de term hebt (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 onderdelen van een telefoonnummer, URL, codes of samengestelde woorden met afbreekstreepjes.

Gedeeltelijke termen en speciale tekens kunnen problematisch zijn als de index geen token heeft dat het tekstfragment vertegenwoordigt waarnaar u wilt zoeken. Tijdens de lexicale analysefase van indexeren (uitgaande van de standaard standaardanalyse), worden speciale tekens verwijderd, worden samengestelde woorden gesplitst en witruimte verwijderd. Als u zoekt naar een tekstfragment dat tijdens de lexicale analyse is gewijzigd, mislukt de query omdat er geen overeenkomst is gevonden. Bekijk het volgende 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 tijdens het indexeren een analyzer aan te roepen die een volledige tekenreeks behoudt, inclusief spaties en speciale tekens, indien nodig, zodat u de spaties en tekens in de querytekenreeks kunt opnemen. Als u een hele, niet-tokenized tekenreeks hebt, kunt u patroonvergelijking mogelijk maken voor 'begint met' of 'eindigt met'-query's, waarbij het patroon dat u opgeeft, kan worden geëvalueerd op basis van een term die niet is getransformeerd door lexicale analyse.

Als u zoekscenario's wilt ondersteunen die om geanalyseerde en niet-geanalyseerde inhoud vragen, kunt u twee velden in uw index 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 behoud van inhoud die tokens voor hele tekenreeksen verzendt voor patroonkoppeling.

Tip

Als u bekend bent met Postman- en REST-API's, downloadt u de verzameling queryvoorbeelden om gedeeltelijke termen en speciale tekens op te vragen die in dit artikel worden beschreven.

Azure Cognitive Search scant op volledige tokenized termen in de index en vindt geen overeenkomst voor 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 omvat, gevolgd door * of ? achtervoegseloperators, zoals search=cap* overeenkomende tekst op 'Cap'n Jack's Waterfront Inn' of 'Gacc Capital'. Het vergelijken van voorvoegsels wordt ondersteund in zowel eenvoudige als volledige Lucene-querysyntaxis.

  • Jokerteken met overeenkomend infix en achtervoegsel plaatst de * operatoren en ? in of aan het begin van een term en vereist de syntaxis van de reguliere expressie (waarbij de expressie wordt omsloten door slashes). De querytekenreeks (search=/.*numeric.*/) retourneert bijvoorbeeld resultaten op 'alfanumeriek' en 'alfanumeriek' als achtervoegsel- en infix-overeenkomsten.

Voor reguliere expressies, jokertekens en fuzzy zoekopdrachten worden analyseprogramma's niet gebruikt tijdens query's. Voor deze queryformulieren, die door de parser worden gedetecteerd door de aanwezigheid van operatoren en scheidingstekens, wordt de queryreeks zonder lexicale analyse doorgegeven aan de engine. Voor deze queryformulieren wordt de analyse die in het veld is opgegeven, genegeerd.

Notitie

Wanneer een gedeeltelijke querytekenreeks tekens bevat, zoals slashes in een URL-fragment, moet u mogelijk escape-tekens toevoegen. In JSON wordt een slash / met een achterwaartse slash ge escaped \. Als zodanig search=/.*microsoft.com\/azure\/.*/ is de syntaxis voor het URL-fragment 'microsoft.com/azure/'.

Gedeeltelijke/patroonzoekproblemen 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 volledige tekenreeks in de index behouden blijft.

De aanpak ziet er als volgt uit:

  1. Definieer een tweede veld om een intacte versie van de tekenreeks op te slaan (ervan uitgaande dat u tijdens de query geanalyseerde en niet-geanalyseerde tekst wilt gebruiken)
  2. Evalueer en kies uit de verschillende analysen die tokens op het juiste granulariteitsniveau verzenden
  3. De analyse toewijzen aan het veld
  4. De index bouwen en testen

Tip

Het evalueren van analysen is een iteratief proces waarvoor indexen regelmatig opnieuw moeten worden opgebouwd. U kunt deze stap eenvoudiger maken met behulp van Postman, de REST API's voor Index maken, Index verwijderen, Documenten laden en Documenten zoeken. Voor Documenten laden moet de aanvraagbody een kleine representatieve gegevensset bevatten die u wilt testen (bijvoorbeeld een veld met telefoonnummers of productcodes). Met deze API's in dezelfde Postman-verzameling kunt u deze stappen snel doorlopen.

1 - Een toegewezen veld maken

Analysefuncties bepalen hoe termen worden tokeniseerd in een index. 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 om reguliere zoekopdrachten in volledige tekst op de eerste te ondersteunen en geavanceerde patroonkoppeling op de tweede. De analysefuncties die aan elk veld zijn toegewezen, bepalen hoe de inhoud van elk veld wordt tokeniseerd 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 de hele termijn produceert, zijn de volgende analyseprogramma's veelvoorkomende keuzes:

Analyse Gedrag
taalanalyses Behoudt afbreekstreepjes in samengestelde woorden of tekenreeksen, klinkermutaties en werkwoordvormen. Als querypatronen streepjes bevatten, is het gebruik van een taalanalyse mogelijk voldoende.
Trefwoord Inhoud van het hele veld wordt als één term tokenized.
Whitespace Scheidt alleen op spaties. Termen die streepjes of andere tekens bevatten, worden behandeld als één token.
aangepaste analyse (aanbevolen) Als u een aangepaste analyse maakt, kunt u zowel de tokenizer als het tokenfilter opgeven. De vorige analysen moeten worden gebruikt zoals ze zijn. Met een aangepaste analyse kunt u kiezen welke tokenizers en tokenfilters u wilt gebruiken.

Een aanbevolen combinatie is de trefwoordtokenizer met een tokenfilter met kleine letters. De ingebouwde trefwoordanalyse maakt op zichzelf geen kleine letters, waardoor query's kunnen mislukken. Een aangepaste analyse biedt u een mechanisme voor het toevoegen van het tokenfilter met kleine letters.

Als u een web-API-testprogramma zoals Postman gebruikt, kunt u de REST-aanroep Test Analyzer toevoegen om tokenized uitvoer te controleren.

U moet een gevulde index hebben om mee te werken. Op basis van een bestaande index en een veld met streepjes of gedeeltelijke termen, kunt u verschillende analysen voor specifieke termen proberen om te zien welke tokens worden verzonden.

  1. Controleer eerst de Standard Analyzer om te zien hoe termen standaard worden tokenized.

    {
    "text": "SVP10-NOR-00",
    "analyzer": "standard"
    }
    
  2. Evalueer het antwoord om te zien hoe de tekst binnen de index wordt tokeniseerd. U ziet hoe elke term in kleine letters is, afbreekstreepjes zijn verwijderd en subtekenreeksen zijn opgesplitst in afzonderlijke tokens. Alleen query's die overeenkomen met deze tokens, retourneren dit document in de resultaten. Een query die '10-NOR' bevat, 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
            }
        ]
    }
    
  3. Wijzig nu de aanvraag om de whitespace analysefunctie of keyword te gebruiken:

    {
    "text": "SVP10-NOR-00",
    "analyzer": "keyword"
    }
    
  4. Deze keer bestaat het antwoord uit één token, in hoofdletters, met streepjes die als onderdeel van de tekenreeks zijn behouden. 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 queryparseer vaak kleine termen in een zoekexpressie gebruikt bij het bouwen van de querystructuur. Als u een analyse gebruikt die tijdens het indexeren geen kleine letters invoert en u geen verwachte resultaten krijgt, kan dit de reden zijn. De oplossing is om een tokenfilter in kleine letters toe te voegen, zoals beschreven in de sectie 'Aangepaste analyse gebruiken' hieronder.

3 - Een analyse configureren

Of u nu analysen evalueert of doorgaat met een specifieke configuratie, u moet de analyse opgeven in de velddefinitie en eventueel de analyse zelf configureren als u geen ingebouwde analyse gebruikt. Wanneer u analyzers verwisselt, moet u meestal de index opnieuw opbouwen (neerzetten, opnieuw maken en opnieuw laden).

Ingebouwde analyses gebruiken

Ingebouwde analysefuncties kunnen worden opgegeven op naam voor 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 voor een veld instelt.

Zie Ingebouwde analyses voor andere scenario's en voor meer informatie over andere ingebouwde analysen.

    {
      "name": "phoneNumber",
      "type": "Edm.String",
      "key": false,
      "retrievable": true,
      "searchable": true,
      "analyzer": "whitespace"
    }

Aangepaste analyse 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 vervolgens naar een velddefinitie, net zoals u een ingebouwde analyse zou doen.

Wanneer tokenisatie van de gehele termijn het doel is, wordt een aangepaste analyse aanbevolen die bestaat uit een trefwoordtokenizer en een tokenfilter met kleine letters .

  • De trefwoordtokenizer maakt één token voor de hele inhoud van een veld.
  • Met het tokenfilter voor kleine letters worden hoofdletters omgezet in kleine letters. Queryparser gebruikt meestal tekstinvoer in kleine letters. Met een lagere behuizing worden de invoer gehomogeniseerd met de tokenized termen.

In het volgende voorbeeld ziet u een aangepaste analyse die de tokenizer voor trefwoorden en een tokenfilter in 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

De keyword_v2 tokenizer en lowercase het tokenfilter zijn bekend bij het systeem en gebruiken hun standaardconfiguraties. Daarom kunt u er op naam naar verwijzen zonder dat u ze eerst hoeft te definiëren.

4 - Bouwen en testen

Zodra 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.

In de vorige secties is de logica uitgelegd. In deze sectie doorloopt u elke API die u moet aanroepen bij het testen van uw oplossing. Zoals eerder vermeld, kunt u deze taken snel uitvoeren als u een interactief webtestprogramma zoals Postman gebruikt.

  • Index verwijderen verwijdert een bestaande index met dezelfde naam, 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 uit te voeren of te testen.

  • Test Analyzer is geïntroduceerd in Een analyse instellen. Test enkele tekenreeksen in uw index met behulp van verschillende analysefuncties om te begrijpen hoe termen worden gekeniseerd.

  • In Zoekdocumenten wordt uitgelegd hoe u een queryaanvraag maakt met behulp van een eenvoudige syntaxis of volledige Lucene-syntaxis voor jokertekens en reguliere expressies.

    Voor gedeeltelijke termquery's, zoals het uitvoeren van een query 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 infix- en achtervoegselquery's, zoals het uitvoeren van query's op 'getal' of 'numeriek om een overeenkomst te vinden op 'alfanumeriek', gebruikt u de volledige Lucene-syntaxis en een reguliere expressie: search=/.*num.*/&queryType=full

Queryprestaties afstemmen

Als u de aanbevolen configuratie implementeert die de keyword_v2 tokenizer en het tokenfilter met kleine letters bevat, ziet u mogelijk een afname van de queryprestaties als gevolg van de verwerking van extra tokenfilters voor bestaande tokens in uw index.

In het volgende voorbeeld wordt een EdgeNGramTokenFilter toegevoegd om voorvoegselovereenkomsten sneller te maken. Er worden meer tokens gegenereerd voor in combinaties van 2-25 tekens die tekens bevatten: (niet alleen MS, MSF, MSFT, MSFT/, MSFT/S, MSFT/SQ, MSFT/SQL).

Zoals u zich kunt voorstellen, resulteert de extra tokenisatie in een grotere index. Als u voldoende capaciteit hebt voor de grotere index, is deze aanpak met de snellere reactietijd mogelijk een betere oplossing.

{
"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", "my_edgeNGram"]
  }
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": [
  {
  "@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
  "name":"my_edgeNGram",
  "minGram": 2,
  "maxGram": 25,
  "side": "front"
  }
]
}

Volgende stappen

In dit artikel wordt uitgelegd hoe analysen zowel bijdragen aan queryproblemen als queryproblemen oplossen. Als volgende stap bekijkt u de impact van analyse op het indexeren en het verwerken van query's. Overweeg met name het gebruik van de Analyze Text-API om tokenized uitvoer te retourneren, zodat u precies kunt zien wat een analyse voor uw index maakt.