Vereisten: Full-text search op de site is een veelgebruikte functie en wordt er vaak op gebaseerd toegepastElasticSearch、SolrImplementatie en ontwikkeling, en nu zijn er twee nieuwe uitgebrachtRedisSearch、MeiliSearchZoekmachine, de eerste twee zijn zwaarder, hoewel de laatste twee niet zo zwaar zijn als de eerste twee, maar je moet nog steeds afhankelijke diensten inzetten; dit artikel gebruikt Lucene.Net + Jieba.NET om een lichtgewicht zoekfunctie op locatie te bouwen.
Lucene.Net
Lucene.Net is een .NET-port van Lucene en is een open-source full-text zoekmachine-ontwikkelingskit, oftewel geen full-text zoekmachine, maar een full-text zoekmachinearchitectuur die een complete query-engine en indexeringsengine biedt.
Ligging:De hyperlink-login is zichtbaar. GitHub-adres:De hyperlink-login is zichtbaar.
Jieba.NET
Jieba.NET is een deelwoord Chinees jieba. .NET-versie (C#-implementatie). Het kan functies uitvoeren zoals woordsegmentatie, woordsoortannotatie, trefwoordextractie, enzovoort voor Chinese tekst, en ondersteunt aangepaste woordenboeken.
GitHub-adres:De hyperlink-login is zichtbaar.
Laten we eerst naar de renderings kijken:
Pas de analyzer aan
Analyzer, TokenStream, Tokenizer, TokenFilterTokenStream in Lucene TokenStream: Een stroom die wordt verkregen nadat de tokenizer is verwerkt. Deze stroom slaat diverse informatie over woordsegmentatie op, die effectief kan worden verkregen via TokenStream. Het volgende is het proces van het omzetten van de bestandsstroom naar een TokenStream. Eerst gebruik je de Tokenizer om de woorden te segmenteren, verschillende tokenizers hebben verschillende tokenizers, en nadat de tokenizer is gescheiden, filteren we de gegevens die zijn verdeeld in woorden via de TokenFilter, zoals stopwoorden. Na het filteren combineer je alle data in een TokenStream.
Referentie:
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar.
Om de Lucene-analyzer aan te passen op basis van Jieba.NET, is de eerste referentie als volgt:
Verwijs direct naar het Lucene.Net.Analysis.Common-pakket, want Lucene.Net.Analysis.Common is afhankelijk van het automatisch downloaden van het Lucene.Net-pakket.
Maak een nieuw JiebaTokenizer.cs aan met de volgende code:
Maak een nieuw JiebaAnalyzer.cs aan met de volgende code:
Lucene.Net Maak nieuwe documenten en zoekopdrachten aan
Voeg gegevens van een website regelmatig of getriggerd toe aan Lucene, en Lucene slaat het document op een fysieke schijf op via de analyzer, waarna hij de zoekinterface aanroept om het te vinden.
De LuceneHelper helpklassecode is als volgt:
Opslag in de winkel
Store.YES: Het zal niet alleen de data indexeren, maar ook opslaan, zodat de zoekresultaten veldinformatie kunnen teruggeven. Store.NO: Alleen de gegevens worden geïndexeerd, de gegevens worden niet opgeslagen, en de zoekresultaten kunnen deze veldinformatie niet verkrijgen.Bespaart schijfruimte;
Zoals hieronder getoond:
Veldveldtype
De veldtypen in Lucene.Net zijn Int32Field, Int64Field, SingleField, DoubleField, BinaryDocValuesField, NumericDocValuesField, SortedDocValuesField, StringField, TextField, StoredField, Gebruik alsjeblieft het juiste datatype dat past bij jouw situatie.
TextField vs. StringField
TextField zal zeker lexicaliseerd zijn, StringField zal geen lexicale analyse uitvoeren van de inhoud die in het document is opgeslagen, zie naar:De hyperlink-login is zichtbaar.
Occuring compound search
Er zijn 6 combinaties van de volgende:
1. MOET en MOET: Krijg het snijpunt van opeenvolgende queryclausules. 2. MUST en MUST_NOT: Geeft aan dat de zoekresultaten van de queryclausule die bij de MUST_NOT hoort, niet in de zoekresultaten kunnen worden opgenomen. 3.SHOULD en MUST_NOT: Wanneer continu gebruikt, is de functie hetzelfde als MUST en MUST_NOT. 4. Wanneer SHOULD en MUST samen worden gebruikt, is het resultaat het zoekresultaat van de MUST-clausule, maar SHOULD kan de sortering beïnvloeden. 5. MOETEN en MOETEN: Geeft de relatie aan tussen "of", en het uiteindelijke zoekresultaat is de vereniging van alle zoekclausules. 6.MUST_NOT en MUST_NOT: zinloos, ophalen zonder resultaat.
Voer het project uit
Op dit punt kun je het project starten om de interfacecode als volgt toe te voegen, bij te werken en te zoeken:
Fouten kunnen als volgt worden gerapporteerd:
Er trad een niet-afgehandelde uitzondering op tijdens het verwerken van het verzoek.
DirectoryNotFoundException: Could not find a part of the path 'C:\Users\itsvse_nuc11\source\repos\DiscuzSearch\DiscuzSearch\bin\Debug\net6.0\Resources\prob_trans.json'. Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(string fullPath, FileMode-modus, FileAccess-toegang, FileShare share, FileOptions-opties)
TypeInitializationException: The type initializer for 'JiebaNet.Segmenter.JiebaSegmenter' threw an exception. jieba.net Na installatie kun je de Resources-map zien in de packages\jieba.NET-map, die het dictionary en andere databestanden bevat die nodig zijn om jieba.NET uit te voeren, en de eenvoudigste configuratiemethode is om de hele Resources-map te kopiëren naar de map waar de assembly zich bevindt, zodat de ingebouwde standaardconfiguratiewaarden jieba.NET worden gebruikt.
C:\Users\%USERPROFILE%\.nuget\packages\jieba.net\0.42.2\Resources JiebaNet moet een configuratiemap toevoegen, de code is als volgt:
De test creëerde 500 nieuwe documenten (gerelateerd aan mijn werkelijke situatie, alleen ter referentie), en de schijf neemt 119KB in beslag, zoals te zien is in de onderstaande figuur:
(Einde)
|