Guide til Lucene Analyzers

1. Oversikt

Lucene Analyzers brukes til å analysere tekst mens de indekseres og søker i dokumenter.

Vi nevnte analysatorer kort i vår introduksjon.

I denne veiledningen, Vi diskuterer ofte brukte analysatorer, hvordan vi konstruerer vår tilpassede analysator og hvordan vi tilordner forskjellige analysatorer for forskjellige dokumentfelt.

2. Maven-avhengigheter

Først må vi legge til disse avhengighetene til vår pom.xml:

 org.apache.lucene lucene-core 7.4.0 org.apache.lucene lucene-queryparser 7.4.0 org.apache.lucene lucene-analysatorer-vanlig 7.4.0 

Den siste Lucene-versjonen finner du her.

3. Lucene Analyzer

Lucene Analyzers delte teksten i tokens.

Analysatorer består hovedsakelig av tokenisatorer og filtre. Ulike analysatorer består av forskjellige kombinasjoner av tokenisatorer og filtre.

For å demonstrere forskjellen mellom ofte brukte analysatorer, bruker vi denne metoden:

offentlig listeanalyse (strengtekst, analysatoranalysator) kaster IOException {Listresultat = 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 metoden konverterer en gitt tekst til en liste over tokens ved hjelp av den gitte analysatoren.

4. Vanlige Lucene-analysatorer

La oss nå ta en titt på noen ofte brukte Lucene-analysatorer.

4.1. Standardanalysator

Vi begynner med Standardanalysator som er den mest brukte analysatoren:

private static final String SAMPLE_TEXT = "Dette er baeldung.com Lucene Analyzers test"; @Test offentlig ugyldig nårUseStandardAnalyzer_thenAnalyzed () kaster IOException {Listresultat = analyser (SAMPLE_TEXT, ny StandardAnalyzer ()); assertThat (resultatet inneholder ("baeldung.com", "lucene", "analysatorer", "test")); }

Merk at Standardanalysator kan gjenkjenne nettadresser og e-post.

Det fjerner også stoppord og reduserer de genererte tokens.

4.2. StopAnalyzer

De StopAnalyzer inneholder LetterTokenizer, LowerCaseFilter, og StopFilter:

@Test offentlig ugyldig nårUseStopAnalyzer_thenAnalyzed () kaster IOException {Listresultat = analyser (SAMPLE_TEXT, ny StopAnalyzer ()); assertThat (resultatet inneholder ("baeldung", "com", "lucene", "analysatorer", "test")); }

I dette eksemplet er LetterTokenizer deler tekst med ikke-bokstaver, mens StopFilter fjerner stoppord fra token-listen.

Imidlertid, i motsetning til Standardanalysator, StopAnalyzer kan ikke gjenkjenne nettadresser.

4.3. SimpleAnalyzer

SimpleAnalyzer inneholder LetterTokenizer og en LowerCaseFilter:

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

Her, den SimpleAnalyzer fjernet ikke stoppord. Det gjenkjenner heller ikke nettadresser.

4.4. WhitespaceAnalyzer

De WhitespaceAnalyzer bruker bare en WhitespaceTokenizer som deler tekst med mellomromstegn:

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

4.5. KeywordAnalyzer

De KeywordAnalyzer tokeniserer inngang i et enkelt token:

@Test offentlig ugyldig nårUseKeywordAnalyzer_thenAnalyzed () kaster IOException {Listresultat = analyser (SAMPLE_TEXT, ny KeywordAnalyzer ()); assertThat (resultatet inneholder ("Dette er baeldung.com Lucene Analyzers test")); }

De KeywordAnalyzer er nyttig for felt som ID og postnummer.

4.6. Språkanalysatorer

Det er også spesielle analysatorer for forskjellige språk som EnglishAnalyzer, FrenchAnalyzer, og Spansk analyse:

@Test offentlig ugyldig nårUseEnglishAnalyzer_thenAnalyzed () kaster IOException {Listresultat = analyser (SAMPLE_TEXT, ny EnglishAnalyzer ()); assertThat (resultatet inneholder ("baeldung.com", "lucen", "analyz", "test")); }

Her bruker vi EnglishAnalyzer som består av StandardTokenizer, Standardfilter, EngelskPossessiveFilter, LowerCaseFilter, StopFilter, og PorterStemFilter.

5. Tilpasset analysator

Deretter, la oss se hvordan vi bygger vår tilpassede analysator. Vi bygger den samme tilpassede analysatoren på to forskjellige måter.

I det første eksemplet, vi bruker CustomAnalyzer bygger for å konstruere analysatoren vår fra forhåndsdefinerte tokenisatorer og filtre:

@Test offentlig ugyldig nårUseCustomAnalyzerBuilder_thenAnalyzed () kaster IOException {Analyzer analysator = CustomAnalyzer.builder () .withTokenizer ("standard") .addTokenFilter ("små bokstaver") .addTokenFilter ("stopp") .addTokenFilter ("små bokstaver"). " kapitalisering ") .build (); Liste resultat = analyser (SAMPLE_TEXT, analysator); assertThat (resultatet inneholder ("Baeldung.com", "Lucen", "Analyz", "Test")); }

Analysatoren vår er veldig lik EnglishAnalyzer, men det aktiverer tokens i stedet.

I det andre eksemplet, Vi bygger den samme analysatoren ved å utvide Analysator abstrakt klasse og overordnet createComponents () metode:

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

Vi kan også lage vår tilpassede tokenizer eller filter og legge den til i vår tilpassede analysator hvis nødvendig.

La oss nå se vår tilpassede analysator i aksjon - vi bruker InMemoryLuceneIndex i dette eksemplet:

@Test public void givenTermQuery_whenUseCustomAnalyzer_thenCorrect () {InMemoryLuceneIndex luceneIndex = new InMemoryLuceneIndex (new RAMDirectory (), new MyCustomAnalyzer ()); luceneIndex.indexDocument ("introduksjon", "introduksjon til lucene"); luceneIndex.indexDocument ("analysatorer", "guide til lucene analysatorer"); Query query = new TermQuery (new Term ("body", "Introduct")); Liste dokumenter = luceneIndex.searchIndex (spørring); assertEquals (1, documents.size ()); }

6. PerFieldAnalyzerWrapper

Endelig, vi kan tilordne forskjellige analysatorer til forskjellige felt ved hjelp av PerFieldAnalyzerWrapper.

Først må vi definere vår analyzerKart å kartlegge hver analysator til et bestemt felt:

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

Vi kartla “tittelen” til vår tilpassede analysator og “kroppen” til EnglishAnalyzer.

La oss deretter lage vår PerFieldAnalyzerWrapper ved å tilby analyzerKart og en standard Analysator:

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

La oss nå teste det:

@Test public void givenTermQuery_whenUsePerFieldAnalyzerWrapper_thenCorrect () {InMemoryLuceneIndex luceneIndex = new InMemoryLuceneIndex (new RAMDirectory (), wrapper); luceneIndex.indexDocument ("introduksjon", "introduksjon til lucene"); luceneIndex.indexDocument ("analysatorer", "guide til lucene analysatorer"); Query query = new TermQuery (new Term ("body", "introduct")); Liste dokumenter = luceneIndex.searchIndex (spørring); assertEquals (1, documents.size ()); spørring = ny TermQuery (ny term ("tittel", "Introduksjon")); dokumenter = luceneIndex.searchIndex (spørring); assertEquals (1, documents.size ()); }

7. Konklusjon

Vi diskuterte populære Lucene-analysatorer, hvordan man lager en tilpasset analysator og hvordan man bruker en annen analysator per felt.

Hele kildekoden finner du på GitHub.


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