lucene2.2,字符+逗号+数字 被standardAnalyzer分析后的问题
licco1
2007-09-06
先放上我的测试代码:
Analyzer analyzer = new StandardAnalyzer(); Reader reader = new BufferedReader(new InputStreamReader(new StringBufferInputStream("Abc,123"))); TokenStream tokenStream = analyzer.tokenStream("abc",reader); org.apache.lucene.analysis.Token token = tokenStream.next(); while(token != null){ System.out.println(token); token = tokenStream.next(); } } 控制台出来的结果是(abc,123,0,7,type=<NUM>) 这里standardAnalyzer将"Abc,123"分析为一个类型为NUM的token。而不是分成"abc"和"123"两个token。 不知道lucene对这样处理有什么用意(不希望是个bug)。 大家有没有碰到过这样的?如果将逗号(comma)换成空格,就会分为两个token(期望的结果) (abc,0,3,type=<ALPHANUM>) (123,4,7,type=<ALPHANUM>) 没办法,只能研究StandardTokenizerTokenManager,希望已经解决这个问题的同学帮忙提点提点啊。 |
|
licco1
2007-09-06
在debug StandardTokenizerTokenManager 的getNextToken()时发现(line:1200):
if (jjmatchedPos + 1 < curPos) input_stream.backup(curPos - jjmatchedPos - 1); 这里,当jjmatchedPos + 1 < curPos条件满足时,就会执行 FastCharStream中的:public final void backup(int amount) { bufferPosition -= amount; } 这里的bufferPosition 会影响在生成一个token对象时截取FastCharStream里buffer字符串的位数: public final String GetImage() { return new String(buffer, tokenStart, bufferPosition - tokenStart); } 如果是英文字符+逗号+英文字符,测试时每次jjmatchedPos + 1 < curPos,如果是英文字符+逗号+数字,测试时每次jjmatchedPos + 1 == curPos(jjMoveStringLiteralDfa0_0()里面的算法很奇妙,也不知道这是不是bug)。因此英文字符+逗号+数字会被分为一个词,郁闷。 |
|
licco1
2007-09-06
现在又站在一个人生十字路口,我要往哪个方向走呢?迷茫中,找工作也不知道是去找互联网行业的还是找做外包的......
|
|
licco1
2007-09-06
天哪,这个bug在1.4里就提出来了,竟然到了2.2
还没修复http://www.gossamer-threads.com/lists/lucene/java-dev/27760?search_string=comma%20bug;#27760 |
|
licco1
2007-09-13
终于发现了JAVACC这块新大陆。独自成长。
|
|
roki
2007-09-14
看这种Tokenizer的代码,要直接看javacc格式的源码的把,
那才是人看的东西 |
|
licco1
2007-09-17
恩,已经搞定了,呵呵
|