2012-04-17 14 views
4

カスタムトークナイザを作成しましたが、admin/analysis.jspとsystem.outログで確認するとうまくいくようです。しかし、このカスタムトークナイザを使用するフィールドでクエリを実行すると、最初のクエリ文字列(system.outログでチェック)に対してのみカスタムトークナイザsolrが呼び出されることがわかりました。 私が間違っていることを指摘してもらえますか?カスタムトークナイザsolrが最初に呼び出される

package com.fosp.searchengine; 
import java.io.Reader; 
import org.apache.lucene.analysis.WhitespaceTokenizer; 
import org.apache.solr.analysis.WhitespaceTokenizerFactory; 

public class JvnTextProTokenizerFactory extends WhitespaceTokenizerFactory{ 
    @Override 
    public WhitespaceTokenizer create(Reader input) { 
     System.out.println("WhitespaceTokenizer create(Reader input)"); 
     Reader processedStringReader = new ProcessedStringReader(input); 
     return new WhitespaceTokenizer(processedStringReader); 
    } 

} 


package com.fosp.searchengine; 
import java.io.IOException; 
import java.io.Reader; 

public class ProcessedStringReader extends java.io.Reader { 

    private static final int BUFFER_SIZE = 1024 * 8; 
    private static TextProcess m_textProcess = null; 
    private char[] m_inputData = null; 
    private int m_offset = 0; 
    private int m_length = 0; 
    public ProcessedStringReader(Reader input){ 
     char[] arr = new char[BUFFER_SIZE]; 
     StringBuffer buf = new StringBuffer(); 
     int numChars; 

     try { 
      while ((numChars = input.read(arr, 0, arr.length)) > 0) { 
       buf.append(arr, 0, numChars); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     if(m_textProcess == null){ 
      try { 
       m_textProcess = new TextProcess(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     m_inputData = m_textProcess.processText(buf.toString()).toCharArray(); 
     m_offset = 0; 
     m_length = m_inputData.length; 
    } 

    @Override 
    public int read(char[] cbuf, int off, int len) throws IOException { 
     int charNumber = 0; 
     for(int i = m_offset + off;i<m_length && charNumber< len; i++){ 
      cbuf[charNumber] = m_inputData[i]; 
      m_offset ++; 
      charNumber++; 
     } 
     if(charNumber == 0){ 
      return -1; 
     } 
     return charNumber; 
    } 

    @Override 
    public void close() throws IOException { 
     m_inputData = null; 
     m_offset = 0; 
     m_length = 0; 
    } 

} 

のSchema.xml

<fieldType name="text_jvnTextPro" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="com.fosp.searchengine.JvnTextProTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="com.fosp.searchengine.JvnTextProTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/>  
    </analyzer> 
</fieldType> 

答えて

0

あり、ここで何も悪い: これらは、私のコードです。ファクトリインスタンス化されたクラスが再利用されます。分析/管理ページではこれが異なります。違いはそれです。

関連する問題