2014-06-26 52 views
0

我是Solr中的新成員,我必須執行過濾器來將文本解讀爲索引文檔以及解析查詢。Solr自定義Tokenizer Factory隨機工作

我在將文本文本傳遞給標準標記器之前爲其創建了自定義標記器工廠。

在Solr分析部分中進行測試的工作相當不錯(在索引正常但在查詢時有時會分析文本兩次),但索引文檔時只分析第一個文檔並隨機分析查詢(它只分析第一個文檔,並分析另一個你必須等待一段時間)。這不是性能問題,因爲我嘗試修改文本而不是引文。

下面是代碼:

package test.solr.analysis; 

import java.io.IOException; 
import java.io.Reader; 
import java.io.StringReader; 
import java.util.Map; 
import org.apache.lucene.analysis.util.TokenizerFactory; 
import org.apache.lucene.util.AttributeSource.AttributeFactory; 
import org.apache.lucene.analysis.standard.StandardAnalyzer; 
import org.apache.lucene.analysis.standard.StandardTokenizer; 

//import test.solr.analysis.TestLemmatizer; 

    public class TestLemmatizerTokenizerFactory extends TokenizerFactory { 
    //private TestLemmatizer lemmatizer = new TestLemmatizer(); 
    private final int maxTokenLength; 

    public TestLemmatizerTokenizerFactory(Map<String,String> args) { 
     super(args); 
     assureMatchVersion(); 
     maxTokenLength = getInt(args, "maxTokenLength", StandardAnalyzer.DEFAULT_MAX_TOKEN_LENGTH); 
     if (!args.isEmpty()) { 
      throw new IllegalArgumentException("Unknown parameters: " + args); 
     } 
    } 

    public String readFully(Reader reader){ 
     char[] arr = new char[8 * 1024]; // 8K at a time 
     StringBuffer buf = new StringBuffer(); 
     int numChars; 
     try { 
      while ((numChars = reader.read(arr, 0, arr.length)) > 0) { 
       buf.append(arr, 0, numChars); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("### READFULLY ### => " + buf.toString()); 
     /* 
      The original return with lemmatized text would be this: 
      return lemmatizer.getLemma(buf.toString()); 

      To test it I only change the text adding "lemmatized" word 
     */ 
     return buf.toString() + " lemmatized"; 
    } 

    @Override 
    public StandardTokenizer create(AttributeFactory factory, Reader input) { 
     // I print this to see when enters to the tokenizer 
     System.out.println("### Standar tokenizer ###"); 
     StandardTokenizer tokenizer = new StandardTokenizer(luceneMatchVersion, factory, new StringReader(readFully(input))); 
     tokenizer.setMaxTokenLength(maxTokenLength); 
     return tokenizer; 
    } 
} 

據此,只索引的第一個文本加入「lemmatized」的文本字。 然後在第一次查詢時,如果我搜索「example」單詞,它會查找「example」和「lemmatized」,以便返回第一個文檔。 在下一次搜索時,它不會修改查詢。要創建一個新的查詢,在查詢中添加「lemmatized」單詞,我必須等待幾分鐘。

會發生什麼?

謝謝大家。

回答

0

我非常懷疑create方法是在每個查詢中調用的(對於初學者來說,性能問題都會想起來)。我將採取安全的路線,並創建一個Tokenizer一個包裝了StandardTokenizer,那麼就重寫setReader方法,做我的工作有

+0

我意識到,要求它之後,我一直在尋找如何做到這一點。謝謝 – Gotz84