2011-10-01 27 views
5

Tôi đã tạo bộ lọc mã thông báo tùy chỉnh kết hợp tất cả các mã thông báo trong luồng. Đây là chức năng incrementToken() tôiSolr (Lucene) chỉ lập chỉ mục tài liệu đầu tiên sau khi thêm một TokenFilter tùy chỉnh

public boolean incrementToken() throws IOException {       
    if (finished) {               
     logger.debug("Finished");           
     return false;              
    }                  
    logger.debug("Starting");            
    StringBuilder buffer = new StringBuilder();        
    int length = 0;               
    while (input.incrementToken()) {           
     if (0 == length) {             
      buffer.append(termAtt);           
      length += termAtt.length();          
     } else {                
      buffer.append(" ").append(termAtt);        
      length += termAtt.length() + 1;         
     }                 
    }                  
    termAtt.setEmpty().append(buffer);          
    //offsetAtt.setOffset(0, length);          
    finished = true;               
    return true;                
} 

tôi đã thêm bộ lọc mới đến hết chỉ mục và truy vấn chuỗi phân tích cho một trường và kiểm tra các bộ lọc từ http://localhost:8983/solr/admin/analysis.jsp dường như được làm việc. Bộ lọc đang nối các mã thông báo trong luồng. Nhưng khi lập chỉ mục lại các tài liệu, tài liệu đầu tiên của tôi chỉ được lập chỉ mục.

Đây là cách chuỗi bộ lọc của tôi trông như thế nào.

 <analyzer type="index">            
      <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[-_]" replacement=" " /> 
      <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[^\p{L}\p{Nd}\p{Mn}\p{Mc}\s+]" replacement="" /> 
      <tokenizer class="solr.WhitespaceTokenizerFactory" />   
      <filter class="solr.LowerCaseFilterFactory" />     
      <filter class="solr.StopWordFilterFactory" ignoreCase="true"    words="words.txt" /> 
      <filter class="org.custom.solr.analysis.ConcatFilterFactory" /> 
     </analyzer>               
     <analyzer type="query">            
      <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[-_]" replacement=" " /> 
      <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[^\p{L}\p{Nd}\p{Mn}\p{Mc}\s+]" replacement="" /> 
      <tokenizer class="solr.WhitespaceTokenizerFactory" />   
      <filter class="solr.LowerCaseFilterFactory" />     
      <filter class="solr.StopWordFilterFactory" ignoreCase="true"    words="words.txt" /> 
      <filter class="org.custom.solr.analysis.ConcatFilterFactory" /> 
     </analyzer> 

Nếu không có sự ConcatFilterFactory tất cả các từ đang nhận được lập chỉ mục đúng nhưng với ConcatFilterFactory chỉ tài liệu đầu tiên là nhận được lập chỉ mục. Tôi đang làm gì sai? Vui lòng giúp tôi hiểu vấn đề.

UPDATE:

Cuối cùng tìm ra vấn đề này.

if (finished) {               
    logger.debug("Finished"); 
    finished = false;         
    return false;              
} 

Có vẻ như cùng một lớp đang được sử dụng lại. Có ý nghĩa.

+0

Bạn nên đăng câu trả lời của riêng mình và đánh dấu nó là được chấp nhận. Câu hỏi này vẫn xuất hiện như một trong những câu hỏi chưa được trả lời hàng đầu cho Lucene. –

+0

Tôi đã làm việc trong những năm này trở lại và bây giờ tôi không thể nhớ chính xác những gì tôi đã làm để sửa chữa. :( – Jithin

Trả lời

0

Bạn nên viết kiểm tra đơn vị cho bộ lọc của mình. Nó sẽ thất bại ngay cả khi phân tích của bạn hoạt động. Dường như bạn quên thêm dòng này trước khi trả về false:

finished = false; 
Các vấn đề liên quan