clucene 读源码记录

2023-11-10 16:48
文章标签 源码 记录 clucene

本文主要是介绍clucene 读源码记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[b]0\ iconv 的使用[/b][url]http://www.gnu.org/software/libc/manual/html_node/iconv-Examples.html#iconv-Examples[/url]
[b]1\ TestUtf8 中的 测试把GBK中的数据转换为unicode,然后索引[/b]
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);
}

[b]2\ clucene 中util 库代码中的FileInputStream,一个从文件中读出数据填充到缓存中方法[/b]
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;
}


[b]4\GBK转UCS-2码,然后索引[/b]
 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));



[b]4\从gb2312转 utf8 ,再从utf8转 ucs-2[/b]
//代码转换:从一种编码转为另一种编码
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 读源码记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/383985

相关文章

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

基于Spring Boot 的小区人脸识别与出入记录管理系统功能

《基于SpringBoot的小区人脸识别与出入记录管理系统功能》文章介绍基于SpringBoot框架与百度AI人脸识别API的小区出入管理系统,实现自动识别、记录及查询功能,涵盖技术选型、数据模型... 目录系统功能概述技术栈选择核心依赖配置数据模型设计出入记录实体类出入记录查询表单出入记录 VO 类(用于

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手