מדריך למנתחי לוסין

1. סקירה כללית

מנתחי Lucene משמשים לניתוח טקסט תוך יצירת אינדקס וחיפוש מסמכים.

הזכרנו מנתחים בקצרה בהדרכת ההיכרות שלנו.

במדריך זה, נדון במנתחים נפוצים, כיצד לבנות את המנתח המותאם אישית שלנו וכיצד להקצות מנתחים שונים לשדות מסמכים שונים.

2. תלות Maven

ראשית, עלינו להוסיף את התלות הללו שלנו 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 

את הגרסה האחרונה של לוסן תוכלו למצוא כאן.

3. מנתנת לוסין

מנתחי לוסין פיצלו את הטקסט לאסימונים.

המנתחים מורכבים בעיקר ממסמכים ומסננים. מנתחים שונים מורכבים משילובים שונים של טוקנייזרים ומסננים.

כדי להדגים את ההבדל בין מנתחים נפוצים, נשתמש בשיטה הבאה:

לנתח רשימה ציבורית (טקסט מחרוזת, מנתח מנתח) זורק IOException {List result = new ArrayList (); TokenStream tokenStream = analyzer.tokenStream (FIELD_NAME, טקסט); CharTermAttribute attr = tokenStream.addAttribute (CharTermAttribute.class); tokenStream.reset (); בעוד (tokenStream.incrementToken ()) {result.add (attr.toString ()); } להחזיר תוצאה; }

שיטה זו ממירה טקסט נתון לרשימת אסימונים באמצעות המנתח הנתון.

4. מנתחי לוסן נפוצים

עכשיו, בואו נסתכל על כמה מנתחי לוסן נפוצים.

4.1. Analyzer סטנדרטי

נתחיל עם ה- Analyzer סטנדרטי שהוא המנתח הנפוץ ביותר:

גמר סטטי פרטי מחרוזת SAMPLE_TEXT = "זה מבחן מנתחי לוסין baeldung.com"; @Test הציבור בטל כאשר UsStandardAnalyzer_thenAnalyzed () זורק IOException {List result = ניתוח (SAMPLE_TEXT, StandardAnalyzer חדש ()); assertThat (התוצאה מכילה ("baeldung.com", "lucene", "analyzers", "test")); }

שים לב שה- Analyzer סטנדרטי יכול לזהות כתובות אתרים ודואר אלקטרוני.

כמו כן, הוא מסיר מילות עצירה ומצמצם את הקטנות של האסימונים שנוצרו.

4.2. StopAnalyzer

ה StopAnalyzer מכיל LetterTokenizer, LowerCaseFilter, ו StopFilter:

@ מבחן ציבורי בטל כאשר UsStopAnalyzer_thenAnalyzed () זורק IOException {List result = ניתוח (SAMPLE_TEXT, StopAnalyzer חדש ()); assertThat (התוצאה מכילה ("baeldung", "com", "lucene", "analyzers", "test")); }

בדוגמה זו, LetterTokenizer מפצל טקסט לפי תווים שאינם אותיים, ואילו StopFilter מסיר מילות עצירה מרשימת האסימונים.

עם זאת, שלא כמו Analyzer סטנדרטי, StopAnalyzer אינו מסוגל לזהות כתובות אתרים.

4.3. SimpleAnalyzer

SimpleAnalyzer מכיל LetterTokenizer ו LowerCaseFilter:

@ מבחן ציבורי בטל כאשר UseSimpleAnalyzer_thenAnalyzed () זורק IOException {List result = ניתוח (SAMPLE_TEXT, SimpleAnalyzer חדש ()); assertThat (התוצאה מכילה ("זה", "הוא", "באלדונג", "com", "לוסין", "מנתחים", "מבחן")); }

הנה ה SimpleAnalyzer לא הסיר מילות עצירה. זה גם לא מזהה כתובות אתרים.

4.4. ניתוח חלל לבן

ה ניתוח חלל משתמש רק ב- WhitespaceTokenizer המפלג טקסט לפי תווים לבנים:

@ מבחן ציבורי בטל כאשר UsWhiteSpaceAnalyzer_thenAnalyzed () זורק IOException {List result = ניתוח (SAMPLE_TEXT, WhitespaceAnalyzer חדש) ()); assertThat (התוצאה מכילה ("This", "is", "baeldung.com", "Lucene", "Analyzers", "test")); }

4.5. KeywordAnalyzer

ה KeywordAnalyzer מסמל קלט לאסימון יחיד:

@ מבחן ציבורי בטל כאשר UseKeywordAnalyzer_thenAnalyzed () זורק IOException {List result = ניתוח (SAMPLE_TEXT, KeywordAnalyzer חדש ()); assertThat (התוצאה מכילה ("זה מבחן baeldung.com Lucene Analyzers")); }

ה KeywordAnalyzer שימושי עבור שדות כמו מזהים ומיקודים.

4.6. מנתחי שפה

ישנם גם מנתחים מיוחדים לשפות שונות כמו אנליזה, אנליזה צרפתית, ו אנליזה ספרדית:

@ מבחן פומבי בטל כאשר UsEnglishAnalyzer_thenAnalyzed () זורק IOException {List result = ניתוח (SAMPLE_TEXT, EnglishAnalyzer חדש ()); assertThat (התוצאה מכילה ("baeldung.com", "lucen", "analyz", "test")); }

הנה, אנו משתמשים ב- אנליזה שמורכב מ StandardTokenizer, StandardFilter, אנגליתפסיביתפילטר, LowerCaseFilter, StopFilter, ו PorterStemFilter.

5. מנתח מותאם אישית

לאחר מכן, בואו נראה כיצד לבנות את המנתח המותאם אישית שלנו. אנו בונים את אותו מנתח מותאם אישית בשתי דרכים שונות.

בדוגמה הראשונה, נשתמש ב- CustomAnalyzer בונה לבנות את המנתח שלנו מ- tokenizers ומסננים שהוגדרו מראש:

@Test הציבור בטל כאשר UsCustomAnalyzerBuilder_thenAnalyzed () זורק IOException {Analyzer analyzer = CustomAnalyzer.builder () .withTokenizer ("standard") .addTokenFilter ("smallcase") .addTokenFilter ("stop") .addTokenFilter ("stopTokenFilter)." היוון "). בניין (); תוצאת רשימה = לנתח (SAMPLE_TEXT, מנתח); assertThat (התוצאה מכילה ("Baeldung.com", "Lucen", "Analyz", "Test")); }

המנתח שלנו דומה מאוד ל- אנליזה, אך הוא עושה שימוש באותיות רישיות במקום זאת.

בדוגמה השנייה, נבנה את אותו מנתח על ידי הרחבת ה- מנתח מעמד מופשט ועוקף את createComponents () שיטה:

מחלקה ציבורית MyCustomAnalyzer מרחיב את Analyzer {@Override מוגן TokenStreamComponents createComponents (String fieldName) {StandardTokenizer src = New StandardTokenizer (); תוצאת TokenStream = StandardFilter חדש (src); תוצאה = LowerCaseFilter חדש (תוצאה); תוצאה = StopFilter חדש (תוצאה, StandardAnalyzer.STOP_WORDS_SET); תוצאה = PorterStemFilter חדש (תוצאה); תוצאה = CapitalizationFilter חדש (תוצאה); להחזיר TokenStreamComponents חדשים (src, תוצאה); }}

אנו יכולים גם ליצור טוקניזר או סינון מותאם אישית ולהוסיף אותו למנתח המותאם אישית שלנו במידת הצורך.

עכשיו, בואו נראה את המנתח המותאם אישית שלנו בפעולה - נשתמש InMemoryLuceneIndex בדוגמה זו:

@Test public void givenTermQuery_whenUseCustomAnalyzer_thenCorrect () {InMemoryLuceneIndex luceneIndex = InMemoryLuceneIndex חדש (RAMDirectory חדש (), MyCustomAnalyzer חדש ()); luceneIndex.indexDocument ("מבוא", "מבוא לוצנה"); luceneIndex.indexDocument ("מנתחים", "מדריך למנתחי לוצן"); שאילתת שאילתה = TermQuery חדש (מונח חדש ("גוף", "מבוא")); רשימת מסמכים = luceneIndex.searchIndex (שאילתה); assertEquals (1, document.size ()); }

6. PerFieldAnalyzerWrapper

סוף כל סוף, אנו יכולים להקצות מנתחים שונים לתחומים שונים באמצעות PerFieldAnalyzerWrapper.

ראשית, עלינו להגדיר את שלנו analyzerMap למפות כל מנתח לשדה ספציפי:

Map analyzerMap = HashMap חדש (); analyzerMap.put ("כותרת", MyCustomAnalyzer חדש ()); analyzerMap.put ("גוף", EnglishAnalyzer חדש ());

מיפנו את ה"כותרת "למנתח המותאם אישית שלנו ואת ה"גוף" ל- EnglishAnalyzer.

לאחר מכן, בואו ניצור את שלנו PerFieldAnalyzerWrapper על ידי מתן analyzerMap וברירת מחדל מנתח:

עטיפת PerFieldAnalyzerWrapper = PerFieldAnalyzerWrapper חדש (StandardAnalyzer חדש (), analyzerMap);

עכשיו, בואו נבדוק את זה:

@Test public void givenTermQuery_whenUsePerFieldAnalyzerWrapper_thenCorrect () {InMemoryLuceneIndex luceneIndex = InMemoryLuceneIndex חדש (RAMDirectory חדש (), עטיפה); luceneIndex.indexDocument ("מבוא", "מבוא לוצנה"); luceneIndex.indexDocument ("מנתחים", "מדריך למנתחי לוצן"); שאילתת שאילתה = מונח חדש (מונח חדש ("גוף", "מבוא")); רשימת מסמכים = luceneIndex.searchIndex (שאילתה); assertEquals (1, document.size ()); שאילתה = TermQuery חדש (מונח חדש ("כותרת", "מבוא")); מסמכים = luceneIndex.searchIndex (שאילתה); assertEquals (1, documents.size ()); }

7. מסקנה

דנו במנתחי לוסין פופולריים, כיצד לבנות מנתח מותאם אישית וכיצד להשתמש במנתח שונה בכל תחום.

קוד המקור המלא ניתן למצוא ב- GitHub.


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