Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Microsoft biedt woordonderbrekers en stemmers voor een aantal talen. In dit onderwerp wordt beschreven hoe u aangepaste woordonderbrekers en stemmers implementeert en gebruikt voor talen en landinstellingen die verder gaan dan die van Microsoft.
Notitie
Aangepaste woordonderbrekers werden tijdelijk niet ondersteund. In juli 2018 is er een wijziging aangebracht in Windows Server 2019 waardoor DLL's zonder Microsoft-handtekening niet door SearchIndexer.exekonden worden geladen. Deze beperking is in januari 2021 opgeheven.
Dit onderwerp is als volgt ingedeeld:
- een DLL-bestand met taalresources registreren
- een taal registreren
- Een Word Beaker- implementeren
- Een stemmer implementeren
- Verwante onderwerpen
Een dll-bestand met taalresources registreren
Elke taalresource-DLL moet de volgende toegangspunten implementeren en exporteren. Het DLL-bestand kan in elke map worden geregistreerd.
- DllMain is het standaardinvoerpunt voor DLL.
- DllRegisterServer registreert de DLL in het register, zoals
regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll - Met DllCanUnloadNow kunnen clients dit invoerpunt aanroepen via COM (Component Object Model) om te bepalen of het mogelijk is om het dll-bestand van de taalresource te verwijderen.
- DllUnRegisterServer verwijdert het DLL-bestand uit het register.
Een taal registreren
Het register bevat taalspecifieke vermeldingen voor de taal die wordt geïndexeerd. Deze vermeldingen bepalen de onderdelen van de indexerings- en queryprocessen die taalspecifiek zijn. Deze registervermeldingen vindt u onder de volgende registersleutel.
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
ContentIndex
Control
Language
Een Word-beaker implementeren
Word breakers implementeren IWordBreaker. De methode IWordBreaker::BreakText voert alle tekstverwerking en parsering uit. Als u een woordonderbrekeronderdeel wilt implementeren, moet u taal-heuristiek voor uw taal hebben. Dit omvat informatie over syntaxis en morfologie. Mogelijk hebt u ook een lijst met woorden nodig om uit te sluiten of op te nemen. U bouwt het bestand met ruiswoorden voor uw taalinstelling op basis van de lijst met uitgesloten woorden. Zie Taalkundige en Unicode-overwegingenvoor meer informatie over taalkundige overwegingen en hoe deze overwegingen van invloed zijn op implementaties van woordenonderbrekingen.
Het belangrijkste doel van IWordBreaker::BreakText is het continu verwerken van tekst uit de TEXT_SOURCE totdat alle tekst wordt verwerkt, of totdat de woordafbreking een fout tegenkomt. Tijdens deze gegevensverwerkingslus roept IWordBreaker::BreakText methoden voor parseren en hulpprogramma's aan waarmee specifieke taken voor dat proces worden uitgevoerd. De Duitse woordonderbreker kan bijvoorbeeld samengestelde woorden verwerken, terwijl de Franse woordonderbreker diakritische tekens of cliticakan verwerken. De specifieke functies die door de woordonderbreker worden uitgevoerd en de strategie die wordt gebruikt bij het uitvoeren van deze taken, zijn volledig afhankelijk van de vereisten voor die taal.
Bij het verbreken van tekst identificeren woordonderbrekers alternatieve formulieren voor woorden die meerdere weergaven kunnen hebben. Er wordt geen semantische relatie tussen de gegenereerde woorden geïmpliceerd. In feite is het oorspronkelijke woord mogelijk niet opgenomen in de lijst met alternatieven. De alternatieve formulieren worden opgeslagen op dezelfde positie in de index als het oorspronkelijke woord om aan te geven dat ze identiek zijn.
Wanneer een document wordt opgenomen in de index, krijgt elk woord een geheel getal dat de offset aangeeft of de afstand van het woord vanaf het begin van een document. De relatieve afstand tussen woorden in een query wordt vergeleken met de verschuivingen die zijn opgeslagen in de volledige-tekstindex. De query 'Where is Kyle's document' komt overeen met elk document met 'Where' bij offset n, 'is' op n+1, 'Kyle's' op n+2 en 'document' op n+3. Waar is het document van Kyle gearchiveerd in de database?
| Waar | is | Kyle Kyle's |
document | Geplaatst | in | de | databasegegevensdatabase |
In dit voorbeeld slaat de woordafbreker alternatieve vormen op voor "Kyle" ("Kyle's") en "database" ("data base") in de index. Met de woordonderbreker worden alternatieve woorden gegenereerd en opgeslagen tijdens het maken van de index onder de volgende voorwaarden:
- Als een alternatief woord waarschijnlijk wordt weergegeven als één woord in een query
- Als een stemmer waarschijnlijk niet in staat is om het oorspronkelijke woord af te leiden uit het alternatief
Het genereren van alternatieve woordvormen verhoogt het aantal manieren waarop query's een zin vertegenwoordigen en overeenkomen, zoals wordt weergegeven in de volgende variaties:
- Waar is Kyle-document opgeslagen in de database
- Waar is Kyle's document opgeslagen in de database
- Waar is Kyle-document opgeslagen in de gegevensdatabase
- Waar is Kyle's document opgeslagen in de gegevensdatabase
WordSink en PhraseSink
Word-breakers gebruiken de IWordSink- en IPhraseSink- objecten om alle woorden en woordgroepen te verzamelen en op te slaan die ze uit tekst verzamelen. In een woordonderbreker worden woorden opgeslagen in een formulier dat zich zo dicht mogelijk bij het oorspronkelijke woordformulier in het document bevindt. IPhraseSink slaat woordgroepen op tijdens het uitvoeren van query's. Woordgroepen verbeteren de relevantie van queryresultaten omdat langere reeksen woorden zeldzaamer zijn en een groter onderscheid bieden dan kleinere woordgroepen. Wanneer de indexeerfunctie een woordgroep in de IPhraseSink op het moment van de query plaatst, wordt er een exemplaar van de woordonderbreker gemaakt om de woordgroep in woorden te splitsen. De indexeerfunctie evalueert vervolgens de woordgroep door te controleren of de woorden in de woordgroep naast elkaar in de index voorkomen. Als 'ABCD' bijvoorbeeld voorkomt in de index op de posities x, x+1, x+2 en x+3, zal er een woordgroep-overeenkomst optreden als een aangrenzende subtekenreeks van 'ABCD' in een query wordt doorgegeven. Deze strategie is effectief voor woordonderbrekers op basis van tekens die woordgroepen en lange woorden splitsen tijdens het maken van de index en die zinnen genereren tijdens het uitvoeren van query's.
Pauzes
Pauzes zijn de spaties tussen woorden. Witruimte, interpunctie, opmaak of alleen de aard van de taal zelf kan leiden tot onderbrekingen. Er zijn vier verschillende typen einden die de indexeerfunctie gebruikt: einde van woord (EOW), einde van zin (EOS), einde van alinea (EOP) en einde van hoofdstuk (EOC). De EOW-pauze is de standaardpauze. Na elk token geeft elke onderbreking een andere semantische afstand aan tussen de woorden aan beide zijden. Woorden gescheiden door EOW hebben de nauwste semantische koppeling, gevolgd door EOS, EOP en EOC. Meerdere aanroepen naar IWordSink::PutBreak zijn cumulatief en zijn vergelijkbaar met het invoegen van nulwoorden of zinnen.
Schaalbaarheid, performancy en beveiliging
De manier waarop de woordonderbreker reageert op gelijktijdige aanroepen, wordt grotendeels bepaald door uw keuze voor het threadingmodel. De indexeerfunctie is een toepassing met één thread. Als woordonderbrekers in een omgeving met één thread werken, moeten woordonderbrekers worden geschreven met behulp van een 'gratis' of 'beide'-threadingmodel. Woordonderbrekers mogen zich niet registreren bij COM met behulp van het draadmodel 'appartement'.
We raden aan dat woordonderbrekers globale statussen vermijden en gegevens opslaan in de instantie van de woordonderbreker. De enige inhoud die moet worden opgeslagen in de implementatie van woordonderbrekers, zijn voor de parameters fQuery en ulMaxTokenSize. Woordonderbrekers mogen niet meer dan twee keer langzamer zijn dan de benchmark die is vastgesteld door de Engelse woordonderbreker. De prestaties van de woordenbreker zouden ook verbeteren naarmate de hardwaremogelijkheden toenemen.
Woordonderbrekers voor de indexeerfunctie worden uitgevoerd in de beveiligingscontext van het lokale systeem. Ze moeten worden geschreven om buffers te beheren en correct te stapelen. Alle kopieën van tekenreeksen moeten expliciete controles hebben om bufferoverschrijdingen te voorkomen. U moet altijd de toegewezen grootte van de buffer controleren en de grootte van de gegevens testen op basis van de grootte van de buffer. Woordonderbrekers kunnen niet aannemen dat de tekst die wordt doorgegeven aan de methode IWordBreaker::BreakText goed is gevormd. Voor meer informatie over het oplossen van problemen met woordonderbrekers, zie Probleemoplossing voor taalbronnen en beste praktijken(Engelstalig).
Een stemmer implementeren
Stemmers implementeren de interface IStemmer. De methode IStemmer::GenerateWordForms genereert een lijst met inflecte woordformulieren voor een bepaald invoerwoord. Als u een stemmeronderdeel wilt implementeren, moet u taalheuristieken voor uw taal hebben. Dit omvat informatie over morfologie. Mogelijk hebt u ook een lijst met woorden nodig om uit te sluiten of op te nemen. Zie Linguïstische en Unicode-overwegingenvoor meer informatie over taalkundige overwegingen en hoe deze overwegingen van invloed zijn op stemmer-implementaties.
We raden aan dat stemmers de genitiefvorm of bezittelijke vorm voor woorden niet genereren. 'David' wordt bijvoorbeeld niet gegenereerd als een alternatieve vorm voor 'David's'. De woordonderbreker genereert zowel 'David' als 'David's' wanneer het 'David's' parseert.
De stemmer gebruikt het IWordFormSink object om de lijst met alternatieve woorden te verzamelen. IWordFormSink::PutWord genereert het laatste woord uit de stemmer. In alle gevallen is dit laatste woord hetzelfde als het invoerwoord van IStemmer::GenerateWordForms. Als u bijvoorbeeld het woord "zwemmen" neemt, genereert de stemmer de volgende woordvormen: 'swimming', 'swimmer', 'swims', 'swam' en 'swum', via aanroepen naar IWordFormSink::PutAltWord. De stemmer genereert "swim" door IWordFormSink::PutWord.
Schaalbaarheid, performancy en beveiliging
Stemmers, zoals woordonderscheiders, moeten een 'vrij' threadingmodel gebruiken en zich registreren bij COM met hun threadingmodel ingesteld op 'vrij' of 'beide'. Windows Search roept tegelijkertijd afzonderlijke instanties van de stemmer aan vanuit verschillende threads. Stemmers moeten daarom minimale instantiegegevens hebben.
De nauwkeurigheid van Stemmer heeft een aanzienlijke invloed op de relevantie van query's. Als de stemmer de tekst verkeerd stemt, kunnen zoekopdrachten onvoorspelbare en onnauwkeurige resultaten opleveren. Stemmers moeten honderden query's per seconde verwerken zonder de queryprestaties negatief te beïnvloeden. Stemmer-prestaties moeten worden verbeterd met verbeterde hardwaremogelijkheden. Voor meer informatie over het oplossen van problemen met stemmers, zie Troubleshooting Language Resources and Best Practices.
Stemmers voor Windows Search draaien in de context van de lokale beveiliging. Ze moeten worden geschreven om buffers te beheren en correct te stapelen. Alle kopieën van tekenreeksen moeten expliciete controles hebben om bufferoverschrijdingen te voorkomen. U moet altijd de toegewezen grootte van de buffer controleren en de grootte van de gegevens testen op basis van de grootte van de buffer.
Verwante onderwerpen