CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

lucene中文检索

楼主zenghongmei(这个才是是真的)2002-06-20 14:26:19 在 Java / J2SE / 基础类 提问

lucene只支持检索英文或象英文这种特点的语言.  
  而不支持中文检索.  
  不知哪位有好的解决方案或改进过的lucene支持中文检索. 问题点数:200、回复次数:2Top

1 楼gfzhx(小小)回复于 2002-06-20 14:45:37 得分 0

好像研究这个的比较少,我比较关注该问题。  
   
  gzTop

2 楼yakuu(BraveT)回复于 2002-06-20 14:56:13 得分 200

这个问题在年初就解决了。  
  我从大富翁的孙老大那学了不少。^_^  
   
  下面给你三个类,你看看:  
  //ChineseTokenizer.java  
   
  package   org.apache.lucene.analysis.cn;  
   
  import   java.io.Reader;  
  import   org.apache.lucene.analysis.*;  
   
  public   final   class   ChineseTokenizer   extends   Tokenizer   {  
          public   ChineseTokenizer(Reader   in)   {  
                  input   =   in;  
          }  
          private   int   offset   =   0,   bufferIndex=0,   dataLen=0;  
          private   final   static   int   MAX_WORD_LEN   =   255;  
          private   final   static   int   IO_BUFFER_SIZE   =   1024;  
          private   final   char[]   buffer   =   new   char[MAX_WORD_LEN];  
          private   final   char[]   ioBuffer   =   new   char[IO_BUFFER_SIZE];  
          private   int   length;  
          private   int   start;  
          private   final   void   push(char   c)   {  
                  if   (length   ==   0)   start   =   offset-1;                         //   start   of   token  
                  buffer[length++]   =   Character.toLowerCase(c);     //   buffer   it  
          }  
          private   final   Token   flush()   {  
                  if   (length>0)   {  
                          //System.out.println(new   String(buffer,   0,   length));  
                          return   new   Token(new   String(buffer,   0,   length),   start,   start+length);  
                  }  
                  else  
                          return   null;  
          }  
   
          public   final   Token   next()   throws   java.io.IOException   {  
                  length   =   0;  
                  start   =   offset;  
                  while   (true)   {  
                          final   char   c;  
                          offset++;  
                          if   (bufferIndex   >=   dataLen)   {  
                                  dataLen   =   input.read(ioBuffer);  
                                  bufferIndex   =   0;  
                          };  
                          if   (dataLen   ==   -1)   return   flush();  
                          else  
                                  c   =   (char)   ioBuffer[bufferIndex++];  
                          switch(Character.getType(c))   {  
                          case   Character.DECIMAL_DIGIT_NUMBER:  
                          case   Character.LOWERCASE_LETTER:  
                          case   Character.UPPERCASE_LETTER:  
                                  push(c);  
                                  if   (length   ==   MAX_WORD_LEN)   return   flush();  
                                  break;  
                          case   Character.OTHER_LETTER:  
                                  if   (length>0)   {  
                                          bufferIndex--;  
                                          return   flush();  
                                  }  
                                  push(c);  
                                  return   flush();  
                          default:  
                                  if   (length>0)   return   flush();  
                                  break;  
                          }  
                  }  
          }  
  }  
   
  ///////////////////////////////////////////////////////  
  //ChineseFilter.java  
   
  package   org.apache.lucene.analysis.cn;  
   
  import   java.io.Reader;  
  import   java.util.Hashtable;  
  import   org.apache.lucene.analysis.*;  
   
  public   final   class   ChineseFilter   extends   TokenFilter   {  
          //   Only   English   now,   Chinese   to   be   added   later.  
          public   static   final   String[]   STOP_WORDS   =   {  
          "and",   "are",   "as",   "at",   "be",   "but",   "by",  
          "for",   "if",   "in",   "into",   "is",   "it",  
          "no",   "not",   "of",   "on",   "or",   "such",  
          "that",   "the",   "their",   "then",   "there",   "these",  
          "they",   "this",   "to",   "was",   "will",   "with"  
          };  
          private   Hashtable   stopTable;  
          public   ChineseFilter(TokenStream   in)   {  
                  input   =   in;  
                  stopTable   =   new   Hashtable(STOP_WORDS.length);  
                  for   (int   i   =   0;   i   <   STOP_WORDS.length;   i++)  
                          stopTable.put(STOP_WORDS[i],   STOP_WORDS[i]);  
          }  
          public   final   Token   next()   throws   java.io.IOException   {  
                  for   (Token   token   =   input.next();   token   !=   null;   token   =   input.next())   {  
                          String   text   =   token.termText();  
                          if   (stopTable.get(text)   ==   null)   {  
                                  switch   (Character.getType(text.charAt(0)))   {  
                                  case   Character.LOWERCASE_LETTER:  
                                  case   Character.UPPERCASE_LETTER:  
                                          //   English   word/token   should   larger   than   1   character.  
                                          if   (text.length()>1)   {  
                                                  return   token;  
                                          }  
                                          break;  
                                  case   Character.OTHER_LETTER:  
                                          //   One   Chinese   character   as   one   Chinese   word.  
                                          //   Chinese   word   extraction   to   be   added   later   here.  
                                          return   token;  
                                  }  
                          }  
                  }  
                  return   null;  
          }  
  }  
   
  //////////////////////////////////////  
  //ChineseAnalyzer.java  
   
  package   org.apache.lucene.analysis.cn;  
   
  import   java.io.Reader;  
  import   org.apache.lucene.analysis.*;  
   
  /**  
    *   Title:   ChineseAnalyzer  
    *   Description:  
    *       Subclass   of   org.apache.lucene.analysis.Analyzer  
    *       build   from   a   ChineseTokenizer,   filtered   with   ChineseFilter.  
    *   Copyright:       Copyright   (c)   2001  
    *   Company:  
    *   @author   Yiyi   Sun  
    *   @version   1.0  
    *  
    */  
   
  public   class   ChineseAnalyzer   extends   Analyzer   {  
   
          public   ChineseAnalyzer()   {  
          }  
   
          /**  
          *   Creates   a   TokenStream   which   tokenizes   all   the   text   in   the   provided   Reader.  
          *  
          *   @return     A   TokenStream   build   from   a   ChineseTokenizer   filtered   with   ChineseFilter.  
          */  
          public   final   TokenStream   tokenStream(String   fieldName,   Reader   reader)   {  
                  TokenStream   result   =   new   ChineseTokenizer(reader);  
                  result   =   new   ChineseFilter(result);  
                  return   result;  
          }  
  }  
   
  我后来做了一些修改,加入了自己的功能。这里就不贴出来了。^_^  
   
  希望对你有帮助。Top

相关问题

  • 关于lucene的中文检索问题
  • 中文检索问题
  • 中文分词检索系统
  • 关于Lucene.Net的中文检索问题
  • lucene中文查询问题?
  • 有人研究过中文的全文检索算法么
  • 怎么实现任意表中文本字段的检索?
  • 难道没有人做过SQL SERVER2000 中文全文检索?
  • php+mysql如何解决中文的全文检索难题?
  • mysql 真的支持中文全文检索吗?

关键词

  • lucene
  • 检索
  • 中文
  • word
  • apache
  • start
  • chinesetokenizer
  • tokenstream
  • chineseanalyzer
  • 中文检索

得分解答快速导航

  • 帖主:zenghongmei
  • yakuu

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo