我正在使用自定义分析器索引和搜索代码.给定文本“将wi-fi工作”,生成以下标记(‘将’作为停止词,被消除). wi-fi {position:2 start:5 end:10}wifi {position:2 start:5 end:10}wi {position:2 start:5 end:7}fi
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术语时,我会得到搜索结果.但是,当我为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"
对于“将wifi工作”(没有返回结果)
Lucene's: +matchAllDocs:true +alltext:"? wifi work"
UPDATE
发现问题:
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()包含一些额外的垃圾,这导致了奇怪的行为.
浪费了一天这个:(
只是在不知道你的分析器或解析器的情况下猜测.>确保在搜索中使用的单词wi,fi不是停用词的一部分.可能停止列表文件是您检查的位置>分面搜索/加权搜索.确保你没有搞砸这些.>解析/分析后,请确保获得要搜索的标记化术语.>确保将您的条款推送到索引中.