Vejledning til Lucene Analyzers

1. Oversigt

Lucene Analyzers bruges til at analysere tekst, mens de indekserer og søger i dokumenter.

Vi nævnte analysatorer kort i vores introduktionsvejledning.

I denne vejledning vi diskuterer almindeligt anvendte analysatorer, hvordan vi konstruerer vores brugerdefinerede analysatorer, og hvordan vi tildeler forskellige analysatorer til forskellige dokumentfelter.

2. Maven-afhængigheder

Først skal vi tilføje disse afhængigheder til vores pom.xml:

 org.apache.lucene lucene-core 7.4.0 org.apache.lucene lucene-queryparser 7.4.0 org.apache.lucene lucene-analysatorer-fælles 7.4.0 

Den seneste Lucene-version kan findes her.

3. Lucene Analyzer

Lucene Analyzers delte teksten i tokens.

Analysatorer består hovedsageligt af tokenisatorer og filtre. Forskellige analysatorer består af forskellige kombinationer af tokenizers og filtre.

For at demonstrere forskellen mellem almindeligt anvendte analysatorer bruger vi følgende metode:

offentlig listeanalyse (strengtekst, analysatoranalysator) kaster IOException {listeresultat = ny ArrayList (); TokenStream tokenStream = analyzer.tokenStream (FIELD_NAME, tekst); CharTermAttribute attr = tokenStream.addAttribute (CharTermAttribute.class); tokenStream.reset (); mens (tokenStream.incrementToken ()) {result.add (attr.toString ()); } returnere resultat }

Denne metode konverterer en given tekst til en liste over tokens ved hjælp af den givne analysator.

4. Almindelige Lucene-analysatorer

Lad os nu se på nogle almindeligt anvendte Lucene-analysatorer.

4.1. Standardanalysator

Vi starter med Standardanalysator som er den mest anvendte analysator:

privat statisk endelig String SAMPLE_TEXT = "Dette er baeldung.com Lucene Analyzers test"; @Test offentligt ugyldigt nårUseStandardAnalyzer_thenAnalyzed () kaster IOException {Listresultat = analyser (SAMPLE_TEXT, ny StandardAnalyzer ()); assertThat (resultatet indeholder ("baeldung.com", "lucene", "analysatorer", "test")); }

Bemærk, at Standardanalysator kan genkende URL'er og e-mails.

Det fjerner også stopord og nedskalerer de genererede tokens.

4.2. StopAnalyzer

Det StopAnalyzer består af LetterTokenizer, LowerCaseFilterog StopFilter:

@Test offentligt ugyldigt nårUseStopAnalyzer_thenAnalyzed () kaster IOException {Liste resultat = analyser (SAMPLE_TEXT, ny StopAnalyzer ()); assertThat (resultat, indeholder ("baeldung", "com", "lucene", "analyzers", "test")); }

I dette eksempel er LetterTokenizer deler tekst med ikke-bogstaver, mens StopFilter fjerner stopord fra tokenlisten.

Men i modsætning til Standardanalysator, StopAnalyzer kan ikke genkende webadresser.

4.3. SimpleAnalyzer

SimpleAnalyzer består af LetterTokenizer og en LowerCaseFilter:

@Test offentlig ugyldig nårUseSimpleAnalyzer_thenAnalyzed () kaster IOException {Liste resultat = analyser (SAMPLE_TEXT, ny SimpleAnalyzer ()); assertThat (resultat, indeholder ("dette", "er", "baeldung", "com", "lucene", "analysatorer", "test")); }

Her, den SimpleAnalyzer fjernede ikke stopord. Det genkender heller ikke webadresser.

4.4. Hvidrumsanalysator

Det Hvidrumsanalysator bruger kun en WhitespaceTokenizer der opdeler tekst efter tegn i mellemrum:

@Test offentlig ugyldigt nårUseWhiteSpaceAnalyzer_thenAnalyzed () kaster IOException {Listresultat = analyser (SAMPLE_TEXT, ny WhitespaceAnalyzer ()); assertThat (resultatet indeholder ("Dette", "er", "baeldung.com", "Lucene", "Analysatorer", "test")); }

4.5. KeywordAnalyzer

Det KeywordAnalyzer tokeniserer input til et enkelt token:

@Test offentligt ugyldigt nårUseKeywordAnalyzer_thenAnalyzed () kaster IOException {Listresultat = analyser (SAMPLE_TEXT, nyt KeywordAnalyzer ()); assertThat (resultatet indeholder ("Dette er baeldung.com Lucene Analyzers test")); }

Det KeywordAnalyzer er nyttigt til felter som id'er og postnummer.

4.6. Sproganalysatorer

Der er også specielle analysatorer til forskellige sprog som EnglishAnalyzer, FrenchAnalyzerog Spansk analyse:

@Test offentligt ugyldigt nårUseEnglishAnalyzer_thenAnalyzed () kaster IOException {List result = analyse (SAMPLE_TEXT, new EnglishAnalyzer ()); assertThat (resultatet indeholder ("baeldung.com", "lucen", "analyz", "test")); }

Her bruger vi EnglishAnalyzer som består af StandardTokenizer, Standardfilter, EngelskPossessiveFilter, LowerCaseFilter, StopFilterog PorterStemFilter.

5. Brugerdefineret analysator

Lad os derefter se, hvordan vi bygger vores brugerdefinerede analysator. Vi bygger den samme brugerdefinerede analysator på to forskellige måder.

I det første eksempel vi bruger CustomAnalyzer bygherre til at konstruere vores analysator fra foruddefinerede tokenisatorer og filtre:

@Test offentlig ugyldig, nårUseCustomAnalyzerBuilder_thenAnalyzed () kaster IOException {Analyzer analyzer = CustomAnalyzer.builder () .withTokenizer ("standard") .addTokenFilter ("små bogstaver") .addTokenFilter ("stop") .addTokenFilter. ".AddTokenFilter." kapitalisering ") .build (); Listeresultat = analyser (SAMPLE_TEXT, analysator); assertThat (resultatet indeholder ("Baeldung.com", "Lucen", "Analyz", "Test")); }

Vores analysator ligner meget EnglishAnalyzer, men det aktiverer tokens i stedet.

I det andet eksempel Vi bygger den samme analysator ved at udvide Analysator abstrakt klasse og tilsidesættelse af createComponents () metode:

offentlig klasse MyCustomAnalyzer udvider Analyzer {@Override-beskyttet TokenStreamComponents createComponents (String fieldName) {StandardTokenizer src = new StandardTokenizer (); TokenStream-resultat = nyt StandardFilter (src); resultat = nyt LowerCaseFilter (resultat); resultat = nyt StopFilter (resultat, StandardAnalyzer.STOP_WORDS_SET); resultat = nyt PorterStemFilter (resultat); resultat = nyt CapitalizationFilter (resultat); returner nye TokenStreamComponents (src, resultat); }}

Vi kan også oprette vores tilpassede tokenizer eller filter og tilføje det til vores brugerdefinerede analysator, hvis det er nødvendigt.

Lad os nu se vores brugerdefinerede analysator i aktion - vi bruger det InMemoryLuceneIndex i dette eksempel:

@Test offentlig ugyldighed givenTermQuery_whenUseCustomAnalyzer_thenCorrect () {InMemoryLuceneIndex luceneIndex = ny InMemoryLuceneIndex (ny RAMDirectory (), ny MyCustomAnalyzer ()); luceneIndex.indexDocument ("introduktion", "introduktion til lucene"); luceneIndex.indexDocument ("analysatorer", "guide til lucene analysatorer"); Query query = new TermQuery (new Term ("body", "Introduct")); Liste dokumenter = luceneIndex.searchIndex (forespørgsel); assertEquals (1, document.size ()); }

6. PerFieldAnalyzerWrapper

Langt om længe, vi kan tildele forskellige analysatorer til forskellige felter ved hjælp af PerFieldAnalyzerWrapper.

Først skal vi definere vores analyzerMap for at kortlægge hver analysator til et bestemt felt:

Map analyzerMap = ny HashMap (); analyzerMap.put ("title", ny MyCustomAnalyzer ()); analyzerMap.put ("body", ny EnglishAnalyzer ());

Vi kortlagde “titlen” til vores brugerdefinerede analysator og “kroppen” til EnglishAnalyzer.

Lad os derefter oprette vores PerFieldAnalyzerWrapper ved at levere analyzerMap og en standard Analysator:

PerFieldAnalyzerWrapper wrapper = ny PerFieldAnalyzerWrapper (ny StandardAnalyzer (), analyzerMap);

Lad os nu teste det:

@Test offentlig ugyldighed givenTermQuery_whenUsePerFieldAnalyzerWrapper_thenCorrect () {InMemoryLuceneIndex luceneIndex = ny InMemoryLuceneIndex (ny RAMDirectory (), wrapper); luceneIndex.indexDocument ("introduktion", "introduktion til lucene"); luceneIndex.indexDocument ("analysatorer", "guide til lucene analysatorer"); Query query = new TermQuery (new Term ("body", "introduct")); Liste dokumenter = luceneIndex.searchIndex (forespørgsel); assertEquals (1, document.size ()); forespørgsel = ny TermQuery (ny betegnelse ("titel", "Introduktion")); dokumenter = luceneIndex.searchIndex (forespørgsel); assertEquals (1, document.size ()); }

7. Konklusion

Vi diskuterede populære Lucene-analysatorer, hvordan man bygger en brugerdefineret analysator, og hvordan man bruger en anden analysator pr. Felt.

Den fulde kildekode kan findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found