2009-07-28 3 views

ответ

20

Для этого вам необходимо написать собственный класс анализатора. Это относительно просто. Вот тот, который я использую. Он объединяет фильтрацию стоп-слов. Портер, связанный и (это может быть слишком много для ваших нужд), снятие акцентов с персонажей.

/// <summary> 
/// An analyzer that implements a number of filters. Including porter stemming, 
/// Diacritic stripping, and stop word filtering. 
/// </summary> 
public class CustomAnalyzer : Analyzer 
{ 
    /// <summary> 
    /// A rather short list of stop words that is fine for basic search use. 
    /// </summary> 
    private static readonly string[] stopWords = new[] 
    { 
     "0", "1", "2", "3", "4", "5", "6", "7", "8", 
     "9", "000", "$", "£", 
     "about", "after", "all", "also", "an", "and", 
     "another", "any", "are", "as", "at", "be", 
     "because", "been", "before", "being", "between", 
     "both", "but", "by", "came", "can", "come", 
     "could", "did", "do", "does", "each", "else", 
     "for", "from", "get", "got", "has", "had", 
     "he", "have", "her", "here", "him", "himself", 
     "his", "how","if", "in", "into", "is", "it", 
     "its", "just", "like", "make", "many", "me", 
     "might", "more", "most", "much", "must", "my", 
     "never", "now", "of", "on", "only", "or", 
     "other", "our", "out", "over", "re", "said", 
     "same", "see", "should", "since", "so", "some", 
     "still", "such", "take", "than", "that", "the", 
     "their", "them", "then", "there", "these", 
     "they", "this", "those", "through", "to", "too", 
     "under", "up", "use", "very", "want", "was", 
     "way", "we", "well", "were", "what", "when", 
     "where", "which", "while", "who", "will", 
     "with", "would", "you", "your", 
     "a", "b", "c", "d", "e", "f", "g", "h", "i", 
     "j", "k", "l", "m", "n", "o", "p", "q", "r", 
     "s", "t", "u", "v", "w", "x", "y", "z" 
    }; 

    private Hashtable stopTable; 

    /// <summary> 
    /// Creates an analyzer with the default stop word list. 
    /// </summary> 
    public CustomAnalyzer() : this(stopWords) {} 

    /// <summary> 
    /// Creates an analyzer with the passed in stop words list. 
    /// </summary> 
    public CustomAnalyzer(string[] stopWords) 
    { 
     stopTable = StopFilter.MakeStopSet(stopWords);  
    } 

    public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
    { 
     return new PorterStemFilter(new ISOLatin1AccentFilter(new StopFilter(new LowerCaseTokenizer(reader), stopWords))); 
    } 
} 
+1

Спасибо, я попробую это. – devson

+1

+1 спасибо Джеку, только то, что я искал. Если бы я мог отметить это как ответ! – andy

+0

Я использовал ваш пример, однако я не получаю результаты для запросов для числа '4656' (работает стандартный анализатор) Я заменил стоп-слова на встроенный' StopAnalyzer.ENGLISH_STOP_WORDS', который не включает числа, любые идеи о том, что происходит там? – Myster

7

Вы можете использовать Snowball или PorterStemFilter. См. Java Analyzer documentation в качестве руководства по объединению различных фильтров/токенизаторов/анализаторов. Обратите внимание, что для индексирования и извлечения необходимо использовать один и тот же анализатор, так что обработка начинается с времени индексирования.

+0

Спасибо, я попробую это. – devson

 Смежные вопросы

  • Нет связанных вопросов^_^