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
恩,已经搞定了,呵呵
Global site tag (gtag.js) - Google Analytics