2016-07-30 3 views
0

Я прошу о помощи с API Lucene 6.1.Lucene 6.1 Пользовательский токенизатор и анализатор

Я попытался расширить Lucene's Tokenizer и Analyzer, но я не понимаю всех руководств. Во всех обучающих программах пользовательский Tokenizer переопределяет приращение. В конструкторе они имеют класс Reader, а в классе пользователя Analyzer они переопределяют метод createComponents. Но в Lucene у него есть только 1 аргумент String, поэтому как я могу добавить Reader к моему Analyzer?

Мой код:

public class ChemTokenizer extends Tokenizer{ 
    protected CharTermAttribute charTermAttribute = addAttribute(CharTermAttribute.class); 
    protected String stringToTokenize; 
    protected int position = 0; 
    protected List<int[]> chemicals = new ArrayList<>(); 

    @Override 
    public boolean incrementToken() throws IOException { 
     // Clear anything that is already saved in this.charTermAttribute 
     this.charTermAttribute.setEmpty(); 

     // Get the position of the next symbol 
     int nextIndex = -1; 
     Pattern p = Pattern.compile("[^A-zА-я]"); 
     Matcher m = p.matcher(stringToTokenize.substring(position)); 
     nextIndex = m.start(); 
     // Did we lose chemicals? 
     for (int[] pair: chemicals) { 
      if (pair[0] < nextIndex && pair[1] > nextIndex) { 
       //We are in the chemical name 
       if (position == pair[0]) { 
        nextIndex = pair[1]; 
       } 
       else { 
        nextIndex = pair[0]; 
       } 
      } 
     } 
     // Next separator was found 
     if (nextIndex != -1) { 
      String nextToken = stringToTokenize.substring(position, nextIndex); 
      charTermAttribute.append(nextToken); 
      position = nextIndex + 1; 
      return true; 
     } 
     // Last part of text 
     else if (position < stringToTokenize.length()) { 
      String nextToken = stringToTokenize.substring(position); 
      charTermAttribute.append(nextToken); 
      position = stringToTokenize.length(); 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
    public ChemTokenizer(Reader reader,List<String> additionalKeywords) { 
     int numChars; 
     char[] buffer = new char[1024]; 
     StringBuilder stringBuilder = new StringBuilder(); 
     try { 
      while ((numChars = 
        reader.read(buffer, 0, buffer.length)) != -1) { 
       stringBuilder.append(buffer, 0, numChars); 
      } 
     } 
     catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
     stringToTokenize = stringBuilder.toString(); 
     //Checking for keywords 
     //Doesnt work properly if text has chemical synonyms 
     for (String keyword: additionalKeywords) { 
      int[] tmp = new int[2]; 
      //Start of keyword 
      tmp[0] = stringToTokenize.indexOf(keyword); 
      tmp[1] = tmp[0] + keyword.length() - 1; 
      chemicals.add(tmp); 
     } 
    } 

    /* Reset the stored position for this object when reset() is called. 
    */ 
    @Override 
    public void reset() throws IOException { 
     super.reset(); 
     position = 0; 
     chemicals = new ArrayList<>(); 

    } 
} 

И код Analyzer:

public class ChemAnalyzer extends Analyzer{ 

    List<String> additionalKeywords; 
    public ChemAnalyzer(List<String> ad) { 
     additionalKeywords = ad; 
    } 
    @Override 
    protected TokenStreamComponents createComponents(String s, Reader reader) { 
     Tokenizer tokenizer = new ChemTokenizer(reader,additionalKeywords); 
     TokenStream filter = new LowerCaseFilter(tokenizer); 
     return new TokenStreamComponents(tokenizer, filter); 
    } 

} 

Проблема заключается в том, что этот код не работает с Lucene 6

+0

Что это значит, он не работает с Lucene 6? Ошибка компиляции? Ошибка? Нежелательное поведение? – Mysterion

+0

В lucene 6 createComponents имеет другое описание. – 01ghost13

ответ

0

Это то, что я нашел в github search , угадайте, что вам нужно создать новый токенизатор без чтения.

@Override 
protected TokenStreamComponents createComponents(String fieldName) { 
    return new TokenStreamComponents(new WhitespaceTokenizer()); } 
Смежные вопросы