Vodič za analizatore lucena

1. Pregled

Analizatori lucena koriste se za analizu teksta tijekom indeksiranja i pretraživanja dokumenata.

Kratko smo spomenuli analizatore u našem uvodnom vodiču.

U ovom vodiču, razgovarat ćemo o najčešće korištenim analizatorima, kako izraditi naš prilagođeni analizator i kako dodijeliti različite analizatore za različita polja dokumenata.

2. Ovisnosti Mavena

Prvo, ove ovisnosti moramo dodati u našu pom.xml:

 org.apache.lucene-lucen-core 7.4.0 org.apache.lucene-lucene-queryparser 7.4.0 org.apache.lucene-lucene-analizatori-uobičajeni 7.4.0 

Najnoviju verziju Lucene možete pronaći ovdje.

3. Analizator lucena

Analizatori lucena dijele tekst na žetone.

Analizatori se uglavnom sastoje od tokenizatora i filtara. Različiti analizatori sastoje se od različitih kombinacija tokenizatora i filtara.

Da bismo demonstrirali razliku između najčešće korištenih analizatora, poslužit ćemo se sljedećom metodom:

javna analiza popisa (tekst niza, analizator analizatora) baca IOException {Rezultat popisa = novi ArrayList (); TokenStream tokenStream = analyzer.tokenStream (FIELD_NAME, tekst); CharTermAttribute attr = tokenStream.addAttribute (CharTermAttribute.class); tokenStream.reset (); while (tokenStream.incrementToken ()) {result.add (attr.toString ()); } vratiti rezultat; }

Ova metoda pretvara zadani tekst u popis tokena pomoću datog analizatora.

4. Uobičajeni analizatori lucena

Pogledajmo sada neke najčešće korištene lucenske analizatore.

4.1. StandardAnalyzer

Počet ćemo s StandardAnalyzer koji je najčešće korišten analizator:

private static final String SAMPLE_TEXT = "Ovo je baeldung.com test Lucene Analyzers"; @Test public void whenUseStandardAnalyzer_thenAnalyzed () baca IOException {Rezultat popisa = analizirati (SAMPLE_TEXT, novi StandardAnalyzer ()); assertThat (rezultat, sadrži ("baeldung.com", "lucen", "analizatori", "test")); }

Imajte na umu da StandardAnalyzer može prepoznati URL-ove i e-poštu.

Također, uklanja zaustavne riječi i malim slovima generirane tokene.

4.2. StopAnalyzer

The StopAnalyzer sastoji se od LetterTokenizer, LowerCaseFilter, i StopFilter:

@Test public void whenUseStopAnalyzer_thenAnalyzed () baca IOException {Rezultat popisa = analiziraj (SAMPLE_TEXT, novi StopAnalyzer ()); assertThat (rezultat, sadrži ("baeldung", "com", "lucene", "analizatori", "test")); }

U ovom primjeru, LetterTokenizer dijeli tekst ne-slovnim znakovima, dok StopFilter uklanja zaustavne riječi s popisa tokena.

Međutim, za razliku od StandardAnalyzer, StopAnalyzer ne može prepoznati URL-ove.

4.3. SimpleAnalyzer

SimpleAnalyzer sastoji se od LetterTokenizer i a LowerCaseFilter:

@Test public void whenUseSimpleAnalyzer_thenAnalyzed () baca IOException {Rezultat popisa = analizirati (SAMPLE_TEXT, novi SimpleAnalyzer ()); assertThat (rezultat, sadrži ("ovo", "je", "baeldung", "com", "lucen", "analizatori", "test")); }

Evo, SimpleAnalyzer nije uklonio zaustavne riječi. Također ne prepoznaje URL-ove.

4.4. Analizator razmaka

The Analizator razmaka koristi samo a WhitespaceTokenizer koji dijeli tekst na razmake:

@Test public void whenUseWhiteSpaceAnalyzer_thenAnalyzed () baca IOException {Rezultat popisa = analiziraj (SAMPLE_TEXT, novi WhitespaceAnalyzer ()); assertThat (rezultat, sadrži ("Ovo", "je", "baeldung.com", "Lucen", "Analizatori", "test")); }

4.5. KeywordAnalyzer

The KeywordAnalyzer tokenizira unos u jedan žeton:

@Test public void whenUseKeywordAnalyzer_thenAnalyzed () baca IOException {Rezultat popisa = analizirati (SAMPLE_TEXT, novi KeywordAnalyzer ()); assertThat (rezultat, sadrži ("Ovo je baeldung.com test Lucene Analyzers")); }

The KeywordAnalyzer korisno je za polja poput ID-ova i poštanskih brojeva.

4.6. Analizatori jezika

Postoje i posebni analizatori za različite jezike poput Engleski analizator, Francuski Analizator, i Španjolski Analizator:

@Test public void whenUseEnglishAnalyzer_thenAnalyzed () baca IOException {Rezultat popisa = analizirati (SAMPLE_TEXT, novi EnglishAnalyzer ()); assertThat (rezultat, sadrži ("baeldung.com", "lucen", "analyz", "test")); }

Ovdje koristimo Engleski analizator koji se sastoji od Standardni tokenizer, StandardFilter, EngleskiPossessiveFilter, LowerCaseFilter, StopFilter, i PorterStemFilter.

5. Prilagođeni analizator

Dalje, pogledajmo kako izraditi naš prilagođeni analizator. Izgradit ćemo isti prilagođeni analizator na dva različita načina.

U prvom primjeru, koristit ćemo CustomAnalyzer graditelj za izradu našeg analizatora od unaprijed definiranih tokenizatora i filtara:

@Test public void whenUseCustomAnalyzerBuilder_thenAnalyzed () baca IOException {Analyzer analyzer = CustomAnalyzer.builder () .withTokenizer ("standard") .addTokenFilter ("smallcase") .addTokenFilter ("stop") .addTokenFilter ("stop") .addTokenFilter ("stop"). pisanje velikih slova ") .build (); Rezultat popisa = analizirati (SAMPLE_TEXT, analizator); assertThat (rezultat sadrži ("Baeldung.com", "Lucen", "Analyz", "Test")); }

Naš analizator je vrlo sličan Engleski analizator, ali umjesto toga koristi velika slova.

U drugom primjeru, izradit ćemo isti analizator proširivanjem Analizator apstraktna klasa i nadjačavanje createComponents () metoda:

javna klasa MyCustomAnalyzer proširuje Analyzer {@Override zaštićen TokenStreamComponents createComponents (String fieldName) {StandardTokenizer src = new StandardTokenizer (); TokenStream rezultat = novi StandardFilter (src); rezultat = novi LowerCaseFilter (rezultat); rezultat = novi StopFilter (rezultat, StandardAnalyzer.STOP_WORDS_SET); rezultat = novi PorterStemFilter (rezultat); rezultat = novi CapitalizationFilter (rezultat); vratiti nove TokenStreamComponents (src, rezultat); }}

Također možemo stvoriti prilagođeni tokenizer ili filtar i po potrebi ga dodati u naš prilagođeni analizator.

Pogledajmo sada naš prilagođeni analizator na djelu - mi ćemo ga koristiti InMemoryLuceneIndex u ovom primjeru:

@Test javna praznina givenTermQuery_whenUseCustomAnalyzer_thenCorrect () {InMemoryLuceneIndex luceneIndex = novi InMemoryLuceneIndex (novi RAMDirectory (), novi MyCustomAnalyzer ()); luceneIndex.indexDocument ("uvod", "uvod u lucen"); luceneIndex.indexDocument ("analizatori", "vodič za analizatore lucena"); Upit upita = novi TermQuery (novi pojam ("body", "Introduct")); Popis dokumenata = luceneIndex.searchIndex (upit); assertEquals (1, documents.size ()); }

6. PerFieldAnalyzerWrapper

Konačno, možemo dodijeliti različite analizatore različitim poljima pomoću PerFieldAnalyzerWrapper.

Prvo, moramo definirati svoje analizatorKarta za mapiranje svakog analizatora u određeno polje:

Map analyzerMap = novi HashMap (); analyzerMap.put ("naslov", novi MyCustomAnalyzer ()); analyzerMap.put ("body", novi EnglishAnalyzer ());

Mapirali smo "naslov" na naš prilagođeni analizator, a "tijelo" na EnglishAnalyzer.

Dalje, kreirajmo naše PerFieldAnalyzerWrapper pružanjem analizatorKarta i zadani Analizator:

PerFieldAnalyzerWrapper omot = novi PerFieldAnalyzerWrapper (novi StandardAnalyzer (), AnalyzerMap);

Ajmo sada testirati:

@Test javna praznina givenTermQuery_whenUsePerFieldAnalyzerWrapper_thenCorrect () {InMemoryLuceneIndex luceneIndex = nova InMemoryLuceneIndex (nova RAMDirectory (), omot); luceneIndex.indexDocument ("uvod", "uvod u lucen"); luceneIndex.indexDocument ("analizatori", "vodič za analizatore lucena"); Upit upita = novi TermQuery (novi pojam ("tijelo", "uvod")); Popis dokumenata = luceneIndex.searchIndex (upit); assertEquals (1, documents.size ()); query = novi TermQuery (novi pojam ("naslov", "Uvođenje")); dokumenti = luceneIndex.searchIndex (upit); assertEquals (1, documents.size ()); }

7. Zaključak

Razgovarali smo o popularnim analizatorima lucena, kako izraditi prilagođeni analizator i kako koristiti drugačiji analizator po polju.

Cjeloviti izvorni kod možete pronaći na GitHubu.


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