search - 添加自定义 TokenFilter 后,Solr(Lucene) 仅索引第一个文档

标签 search lucene solr tokenize

我创建了一个自定义 token 过滤器,它连接流中的所有 token 。这是我的 incrementToken()功能

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;                                                            
}

我将新过滤器添加到字段的索引和查询分析链的末尾,并测试来自 http://localhost:8983/solr/admin/analysis.jsp 的过滤器。似乎正在工作。过滤器正在连接流中的标记。但是在重新索引文档时,只有我的第一个文档被索引。

这就是我的过滤器链的样子。
        <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>

没有 ConcatFilterFactory所有单词都被正确编入索引,但带有 ConcatFilterFactory只有第一个文档被索引。我究竟做错了什么?请帮助我理解问题。

更新:

终于想通了这个问题。
if (finished) {                                                         
    logger.debug("Finished"); 
    finished = false;                                  
    return false;                                                       
}  

看起来正在重用同一个类。说得通。

最佳答案

您应该为过滤器编写单元测试。即使您的分析有效,它也应该失败。显然你忘记在返回 false 之前添加这一行:

finished = false;

关于search - 添加自定义 TokenFilter 后,Solr(Lucene) 仅索引第一个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7618513/

相关文章:

C:在文件中搜索字符串

java - 获取数据在 JTable 中的位置

java - Lucene 索引历史记录/最后一个索引文件

lucene - elasticsearch查询缺少过滤器

Solr 集合与核心

java - 如何设置 EmbeddedSolrServer 实例?

c - 在C中读取字符网格

php - 使用 PHP 输出谷歌搜索结果?

tomcat - 如何修复 Debian Wheezy 上缺少的 solr tomcat6 配置?

ruby-on-rails - 在 Rails 开发中使用 solr 和 sunspot