我正在使用自定义分析器对代码进行索引和搜索。给定文本“will wi-fi work”,会生成以下标记('will'是停用词,被排除):
当我搜索wi-fi、work这些词时,我可以得到搜索结果。但是,当我搜索wifi、wi、fi这些词时,无论是短语还是非短语查询,都没有返回任何结果。生成的令牌有问题吗?
解析后的搜索查询:
对于wi-fi(正常工作)。
对于“will wifi work”的问题,没有返回结果。
在上面加粗的那行中,我是在说
当我搜索wi时,没有任何结果,但是wi*可以给出结果。看起来这个top.buffer()包含一些额外的垃圾,导致奇怪的行为。
浪费了一整天时间 :(
wi-fi {position:2 start:5 end:10}
wifi {position:2 start:5 end:10}
wi {position:2 start:5 end:7}
fi {position:2 start:8 end:10}
work {position:3 start:11 end:15}
当我搜索wi-fi、work这些词时,我可以得到搜索结果。但是,当我搜索wifi、wi、fi这些词时,无论是短语还是非短语查询,都没有返回任何结果。生成的令牌有问题吗?
解析后的搜索查询:
对于wi-fi(正常工作)。
Lucene's: +matchAllDocs:true +(alltext:wi-fi alltext:wifi alltext:wi alltext:fi)
关于wifi的问题(无结果返回)
Lucene's: +matchAllDocs:true +alltext:wifi
"Wi-Fi会工作吗" (表现良好)
Lucene's: +matchAllDocs:true +alltext:"(wi-fi wifi wi fi) work"
对于“will wifi work”的问题,没有返回结果。
Lucene's: +matchAllDocs:true +alltext:"? wifi work"
更新
发现问题:
public boolean incrementToken() throws IOException
{
/*
* first return all tokens in the list
*/
if (tokens.size() > 0)
{
Token top = tokens.removeFirst();
restoreState(current);
**termAtt.setEmpty().append(new String(top.buffer(), 0, top.length()));**
offsetAtt.setOffset(top.startOffset(), top.endOffset());
posIncrAtt.setPositionIncrement(0);
return true;
}
/*
* if there are no more incoming tokens return false
*/
if (!input.incrementToken())
return false;
Token wrapper = new Token();
wrapper.copyBuffer(termAtt.buffer(), 0, termAtt.length());
wrapper.setStartOffset(offsetAtt.startOffset());
wrapper.setEndOffset(offsetAtt.endOffset());
wrapper.setPositionIncrement(posIncrAtt.getPositionIncrement());
normalizeHyphens(wrapper);
current = captureState();
return true;
}
在上面加粗的那行中,我是在说
termAtt.setEmpty().append(new String(top.buffer()));
当我搜索wi时,没有任何结果,但是wi*可以给出结果。看起来这个top.buffer()包含一些额外的垃圾,导致奇怪的行为。
浪费了一整天时间 :(