Útmutató a Lucene elemzőihez

1. Áttekintés

A Lucene analizátorokat a szöveg elemzésére használják a dokumentumok indexelése és keresése közben.

Bevezető bemutatónkban röviden megemlítettük az elemzőket.

Ebben az oktatóanyagban megbeszéljük a gyakran használt elemzőket, hogyan készítsük el az egyedi elemzőinket, és hogyan rendeljünk különböző elemzőket a különböző dokumentum mezőkhöz.

2. Maven-függőségek

Először ezeket a függőségeket kell hozzáadnunk a sajátunkhoz pom.xml:

 org.apache.lucene lucene-core 7.4.0 org.apache.lucene lucene-queryparser 7.4.0 org.apache.lucene lucene-analyzers-common 7.4.0 

A legújabb Lucene verzió itt található.

3. Lucene Analyzer

A Lucene Analyzers jelekre osztotta a szöveget.

Az analizátorok főleg tokenekből és szűrőkből állnak. A különböző analizátorok tokenizátorok és szűrők különböző kombinációiból állnak.

A gyakran használt analizátorok közötti különbség bemutatásához a következő módszert fogjuk használni:

public Listanalízis (String text, Analyzer analyzer) dobja az IOException {List eredmény = new ArrayList (); TokenStream tokenStream = analyzer.tokenStream (FIELD_NAME, szöveg); CharTermAttribute attr = tokenStream.addAttribute (CharTermAttribute.class); tokenStream.reset (); while (tokenStream.incrementToken ()) {result.add (attr.toString ()); } visszatérési eredmény; }

Ez a módszer egy adott szöveget konvertál a tokenek listájába az adott elemző segítségével.

4. Általános Lucene-analizátorok

Most vessünk egy pillantást néhány általánosan használt Lucene analizátorra.

4.1. StandardAnalyzer

Kezdjük a StandardAnalyzer amely a leggyakrabban használt elemző:

private static final String SAMPLE_TEXT = "Ez a baeldung.com Lucene Analyzers tesztje"; @Test public void whenUseStandardAnalyzer_thenAnalyzed () IOException dob {List result = analysis (SAMPLE_TEXT, new StandardAnalyzer ()); assertThat (eredmény tartalmazza ("baeldung.com", "lucene", "analizátorok", "teszt")); }

Vegye figyelembe, hogy a StandardAnalyzer felismeri az URL-eket és az e-maileket.

Ezenkívül eltávolítja a leállítási szavakat és kisbetűkkel generálja a létrehozott tokeneket.

4.2. StopAnalyzer

A StopAnalyzer tartalmaz LetterTokenizer, LowerCaseFilter, és StopFilter:

@Test public void whenUseStopAnalyzer_thenAnalyzed () IOException dob {List eredmény = elemez (SAMPLE_TEXT, új StopAnalyzer ()); assertThat (az eredmény tartalmazza ("baeldung", "com", "lucene", "analizátorok", "teszt")); }

Ebben a példában a LetterTokenizer felosztja a szöveget nem betűs karakterekkel, míg a StopFilter eltávolítja a leállítási szavakat a token listából.

Azonban, ellentétben a StandardAnalyzer, StopAnalyzer nem ismeri fel az URL-eket.

4.3. SimpleAnalyzer

SimpleAnalyzer tartalmaz LetterTokenizer és a LowerCaseFilter:

@Test public void whenUseSimpleAnalyzer_thenAnalyzed () IOException dob {List eredmény = elemez (SAMPLE_TEXT, új SimpleAnalyzer ()); assertThat (eredmény, tartalmazza ("ez", "is", "baeldung", "com", "lucén", "analizátorok", "teszt")); }

Itt a SimpleAnalyzer nem távolította el a megállító szavakat. Nem ismeri fel az URL-eket sem.

4.4. WhitespaceAnalyzer

A WhitespaceAnalyzer csak a WhitespaceTokenizer amely a szöveget szóközökkel osztja fel:

@Test public void whenUseWhiteSpaceAnalyzer_thenAnalyzed () IOException dobja {A lista eredménye = elemez (SAMPLE_TEXT, új WhitespaceAnalyzer ()); assertThat (az eredmény tartalmazza ("This", "is", "baeldung.com", "Lucene", "Analyzers", "test")); }

4.5. KeywordAnalyzer

A KeywordAnalyzer tokenizálja a bemenetet egyetlen tokenbe:

@Test public void, amikor aUseKeywordAnalyzer_thenAnalyzed () dobja az IOException {List eredmény = elemzés (SAMPLE_TEXT, új KeywordAnalyzer ()); assertThat (az eredmény tartalmazza ("Ez a baeldung.com Lucene Analyzers teszt")); }

A KeywordAnalyzer hasznos olyan mezőkhöz, mint az azonosítók és irányítószámok.

4.6. Nyelvelemzők

Vannak speciális elemzők a különböző nyelvekhez, például EnglishAnalyzer, FrenchAnalyzer, és Spanyol elemző:

@Test public void whenUseEnglishAnalyzer_thenAnalyzed () IOException dob {List eredmény = elemez (SAMPLE_TEXT, új EnglishAnalyzer ()); assertThat (eredmény, tartalmazza ("baeldung.com", "lucen", "analízis", "teszt")); }

Itt használjuk a EnglishAnalyzer amely abból áll StandardTokenizer, StandardFilter, EnglishPossessiveFilter, LowerCaseFilter, StopFilter, és PorterStemFilter.

5. Egyedi elemző

Ezután nézzük meg, hogyan lehet felépíteni egyedi elemzőinket. Ugyanezt az egyedi elemzőt két különböző módon építjük fel.

Az első példában használjuk a CustomAnalyzer készítője előre meghatározott tokenizátorokból és szűrőkből állítja össze elemzőnket:

@Test public void whenUseCustomAnalyzerBuilder_thenAnalyzed () IOException dobja {Analyzer analyzer = CustomAnalyzer.builder () .withTokenizer ("standard") .addTokenFilter ("kisbetűs") .addTokenFilter ("stop") .addTokenFil. nagybetűs írás) ".build (); Lista eredménye = elemzés (SAMPLE_TEXT, analizátor); assertThat (az eredmény tartalmazza ("Baeldung.com", "Lucen", "Analyz", "Test")); }

Elemzőnk nagyon hasonlít a EnglishAnalyzer, de ehelyett nagybetűvel írja a tokent.

A második példában megépítjük ugyanazt az elemzőt a Elemző absztrakt osztály és felülírja a createComponents () módszer:

public class A MyCustomAnalyzer kiterjeszti az Analyzert {@Orride védett TokenStreamComponents createComponents (String fieldName) {StandardTokenizer src = new StandardTokenizer (); TokenStream eredmény = new StandardFilter (src); eredmény = új LowerCaseFilter (eredmény); eredmény = új StopFilter (eredmény, StandardAnalyzer.STOP_WORDS_SET); eredmény = új PorterStemFilter (eredmény); eredmény = új kapitalizációs szűrő (eredmény); return new TokenStreamComponents (src, result); }}

Létrehozhatunk egyéni tokenizálónkat vagy szűrőnket is, és szükség esetén hozzáadhatjuk egyéni elemzőinkhez.

Most lássuk működés közben az egyedi elemzőinket - használni fogjuk InMemoryLuceneIndex ebben a példában:

@Test public void givenTermQuery_whenUseCustomAnalyzer_thenCorrect () {InMemoryLuceneIndex luceneIndex = new InMemoryLuceneIndex (new RAMDirectory (), new MyCustomAnalyzer ()); luceneIndex.indexDocument ("bevezetés", "bevezetés a lucénba"); luceneIndex.indexDocument ("elemzők", "útmutató a lucén-analizátorokhoz"); Lekérdezés = új TermQuery (új kifejezés ("törzs", "Bevezetés")); Listázza a dokumentumokat = luceneIndex.searchIndex (lekérdezés); assertEquals (1, dokumentumok.méret ()); }

6. PerFieldAnalyzerWrapper

Végül, segítségével különböző elemzőket rendelhetünk különböző mezőkhöz PerFieldAnalyzerWrapper.

Először meg kell határoznunk a sajátunkat analizátorTérkép minden elemzőt egy adott mezőhöz rendelni:

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

A „címet” egyedi elemzőnkhez, a „testet” pedig az EnglishAnalyzerhez térképeztük fel.

Ezután hozzuk létre a sajátunkat PerFieldAnalyzerWrapper a analizátorTérkép és alapértelmezett Elemző:

PerFieldAnalyzerWrapper wrapper = új PerFieldAnalyzerWrapper (új StandardAnalyzer (), analyzerMap);

Most teszteljük:

@Test public void givenTermQuery_whenUsePerFieldAnalyzerWrapper_thenCorrect () {InMemoryLuceneIndex luceneIndex = new InMemoryLuceneIndex (new RAMDirectory (), wrapper); luceneIndex.indexDocument ("bevezetés", "bevezetés a lucénba"); luceneIndex.indexDocument ("elemzők", "útmutató a lucén-analizátorokhoz"); Lekérdezés = új TermQuery (új kifejezés ("törzs", "bevezetés")); Listázza a dokumentumokat = luceneIndex.searchIndex (lekérdezés); assertEquals (1, dokumentumok.méret ()); lekérdezés = új TermQuery (új kifejezés ("cím", "Bevezetés")); dokumentumok = luceneIndex.searchIndex (lekérdezés); assertEquals (1, dokumentumok.méret ()); }

7. Következtetés

Megbeszéltük a népszerű Lucene analizátorokat, hogy miként lehet egyedi elemzőt felépíteni és hogyan lehet egy mezőnként más elemzőt használni.

A teljes forráskód megtalálható a GitHub oldalon.