Search Solr(Lucene)仅为添加自定义标记过滤器后的第一个文档编制索引
我创建了一个自定义令牌过滤器,它连接流中的所有令牌。这是我的Search Solr(Lucene)仅为添加自定义标记过滤器后的第一个文档编制索引,search,lucene,solr,tokenize,Search,Lucene,Solr,Tokenize,我创建了一个自定义令牌过滤器,它连接流中的所有令牌。这是我的incrementToken()函数 public boolean incrementToken() throws IOException { if (finished) { logger.debug("Finished");
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;
}
我在一个字段的索引和查询分析链的末尾添加了新的过滤器,并且从中测试过滤器似乎正在工作。筛选器正在连接流中的令牌。但是在重新索引文档时,只有我的第一个文档被索引
这就是我的过滤链的样子
<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>
看起来相同的类正在被重用。有道理。您应该为过滤器编写一个单元测试。即使你的分析有效,它也会失败。显然,在返回false之前,您忘记添加此行:
finished = false;
你应该发布自己的答案,并将其标记为已接受。这个问题仍然是Lucene未回答的首要问题之一。我在这几年前工作过,现在我记不起我为修复做了什么(
finished = false;