gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:58:15 25 4
gpt4 key购买 nike

我创建了一个自定义 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com