`
sealbird
  • 浏览: 571426 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

clucene 读源码记录

阅读更多
0\ iconv 的使用http://www.gnu.org/software/libc/manual/html_node/iconv-Examples.html#iconv-Examples
1\ TestUtf8 中的 测试把GBK中的数据转换为unicode,然后索引
void _Index(CuTest *tc, IndexWriter* ndx,char* file){
    char path[CL_MAX_PATH];
    TCHAR tlang[20];
 
 
	strcpy(path,clucene_data_location);
	strcat(path,"/utf8text");
	CuAssert(tc,_T("Utf8 directory does not exist"),Misc::dir_Exists(path));
	strcat(path,"/");
	strcat(path,file);
	/*strcat(path,"_utf8.txt");*/
	strcat(path,"_gbk.txt");

	CuAssert(tc,_T("Language file does not exist"),Misc::dir_Exists(path));
	
	STRCPY_AtoT(tlang,file,CL_MAX_PATH);

    Document doc;
	doc.add(*Field::Keyword(_T("language"),tlang));	   
	
	jstreams::FileReader* fr = new jstreams::FileReader(path, "GBK");

  //  StandardAnalyzer analyzer;
 //   TokenStream* stream = analyzer.tokenStream(NULL, _CLNEW CL_NS(util)::Reader(fr,true));

	doc.add(*Field::Text(_T("contents"), _CLNEW CL_NS(util)::Reader(fr,true) ));
	ndx->addDocument(&doc);
  }

2\ clucene 中util 库代码中的FileInputStream,一个从文件中读出数据填充到缓存中方法 
int32_t FileInputStream::fillBuffer(char* start, int32_t space) {
    if (file == 0) return -1;
    // read into the buffer
    int32_t nwritten = fread(start, 1, space, file);
    // check the file stream status
    if (ferror(file)) {
        error = "Could not read from file '" + filepath + "'.";
        fclose(file);
        file = 0;
        status = Error;
        return -1;
    }
    if (feof(file)) {
        fclose(file);
        file = 0;
    }
    return nwritten;
}

3\
有关的

template <class T> template <class char>
void InputStreamBuffer<T>::setSize(int32_t size) {
    // store pointer information
    int32_t offset = (int32_t)(readPos - start);

	// allocate memory in the buffer
    if ( start == 0 )
		start = (T*)malloc(size*sizeof(T));
	else
		start = (T*)realloc(start, size*sizeof(T));
    this->size = size;

    // restore pointer information
    readPos = start + offset;
}


4\GBK转UCS-2码,然后索引
 iconv_t converter = iconv_open("UCS-2-INTERNAL", "GBK");
	//iconv_t converter = iconv_open("UCS-2-INTERNAL", "UTF-8");
	// iconv_t converter = iconv_open("UCS-2-INTERNAL", "ASCII");
	 
	 const char *inbuf ="我喜欢你欧阳";
     size_t inbytesleft = strlen(inbuf);
	 wchar_t* start=(wchar_t*)malloc(inbytesleft*sizeof(wchar_t));
	 memset(start,0,inbytesleft*sizeof(wchar_t));
     size_t outbytesleft = sizeof(wchar_t)*inbytesleft;
     char *outbuf = (char*)start;
     size_t r = iconv(converter, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
     iconv_close(converter);
 doc.add(*Field::Text(_T("contents"),start));



4\从gb2312转 utf8 ,再从utf8转 ucs-2
//代码转换:从一种编码转为另一种编码
int code_convert(char *from_charset,char *to_charset,const char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
	iconv_t cd;
	int rc;
	const char **pin = &inbuf;
	char **pout = &outbuf;

	cd = iconv_open(to_charset,from_charset);
	if (cd==0) return -1;
	memset(outbuf,0,outlen);
	if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
	iconv_close(cd);
	return 0;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
	return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
	return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}

 iconv_t converter = iconv_open("UCS-2-INTERNAL", "UTF-8");

	 //gb2312码转为unicode码
	 char *in_gb2312="我喜欢你欧阳";
	  size_t tmpleng = strlen(in_gb2312);
	// char out[500];
	 
	 char* out=(char*)malloc(3*tmpleng*sizeof(char));
     int  rec = g2u(in_gb2312,strlen(in_gb2312),out,3*tmpleng);
	 const char * inbuf=out;
	 size_t inbytesleft = strlen(inbuf);
	 wchar_t* start=(wchar_t*)malloc(inbytesleft*sizeof(wchar_t));
	 memset(start,0,inbytesleft*sizeof(wchar_t));
     size_t outbytesleft = sizeof(wchar_t)*inbytesleft;
     char *outbuf = (char*)start;
     size_t r = iconv(converter, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
     iconv_close(converter);

	 doc.add(*Field::Text(_T("contents"),start));
分享到:
评论

相关推荐

    搜索引擎 CLucene 源代码

    CLucene 是C++版本的Lucene, .CLucene API文档地址:http://clucene.sourceforge.net/doc/html/index.html

    C++搜索引擎Clucene源码

    C++搜索引擎Clucene源码

    CLucene 最新源码

    09年最新源码,鼎力推荐,吐血推荐。非常好的东西,值得学习。

    CLUCENE资料合集+代码源码

    这是我学CLUCENE时期整理出来的几个不错的资料,我觉得里面总有一款会适合你,而且你所需要知道的技术里面基本上都是涵盖的,所以可以当作教材或者参考手册使用。(里面有CLUCENE,可以用的)

    C++搜索引擎 CLucene源码

    CLucene是Lucene的一个C++端口,Lucene是一个基于java的高性能的全文搜索引擎。CLucene因为使用C++编写,所以理论上要比lucene快。

    clucene源码

    大名鼎鼎的clucene,是lucene的c++ 版; CLucene README ============== ------------------------------------------------------ CLucene is a C++ port of Lucene. It is a high-performance, full-featured ...

    clucene2.3.3.4源码 windows下vs2013工程

    clucene2.3.3.4源码 CMake制作的,windows下的vs2013工程,编译通过,学习全文检索、搜索引擎的好资料

    clucene源代码

    用C语言写的Lucene的源代码 clucene-core-0.9.16.rar

    CLucene

    用C++改写的Lucene

    CLucene结构文档

    CLucene类结构文档 内嵌源代码及各类关系图

    CLucene源代码-Lucene的C++版本

    信息检索系统Lucene v2.3.3.4的C++开源代码。是学习信息检索,搜索引擎的杀手锏。

    Clucene库以及自己封装好的Clucene方法库

    Clucene库,以及自己封装好的Clucene方法库。该库提供了可直接调用的用于建立索引,查询索引的接口。输出结果返回的是一个满足条件的文件链表。

    clucene中文处理

    对clucene的一些改进,能够处理中文字符

    Clucene使用示例

    Clucene使用示例 用c++写的搜索引擎使用实例,简单明了,是一个非常好的学习资料

    luceneDemo_pure1aa_DEMO_clucene_

    对clucene0.9.21版本在vc6下调试demo希望对你的开发有帮助

    clucene-core lucene c

    总得来说用Lucene来进行建立 和搜索和操作数据库是差不多的(有点像),Document可以看作是 数据库的一行记录,Field可以看作是数据库的字段。用lucene实 现搜索引擎就像用JDBC实现连接数据库一样简单。

    lucene3源码分析

    lucene3源码分析

    开放源代码的全文检索引擎Lucene

    一、 Lucene源码实现分析的说明··· 9 二、 Lucene索引文件格式··· 10 三、 一些公用的基础类··· 12 四、 存储抽象··· 13 五、 关于cLucene项目··· 15 第四节 Lucene索引构建逻辑模块分析··· ...

    clucenes _64位

    clucene-core-2.3.3.4版本,cmake基于vs2012 64位库编译的c++源码,内部bin目录有编译好动态库,内有完整的源码,也可以自己编译。

    clucene_32位

    clucene-core-2.3.3.4版本,基于vs2012版,cmake出来的c++源码,内部的bin目录有编译好的动态库

Global site tag (gtag.js) - Google Analytics