Java的lucene是正统,功能更强大,开发快速,而且和J2EE天然融合(都是使用Java),怎么看都比clucene强多了。那为什么要使用clucene呢?原因有两个:
一:C++的速度快。当对索引速度有更高数量级的要求时,单纯设置MergeFactor和MinMergeDocNum无法实现的。
二:索引的内容如果是另外的C++写的工具的结果,那么用clucene就比lucene有优势,否则要么使用文件作为中间结果,要么使用JNI,都不是很好的办法。综上,clucene还是有点用的。
《lucene in action》中在介绍clucene是居然没有提clucene的索引与lucene的兼容性,倒是对C#的Dotlucene大书特书。实际上,clucene的索引目前来说还是和lucene兼容的。clucene的作者mail list里提到好像要放弃这种兼容性,天晓得以后会怎样。反正现在是兼容的。
默认情况下(configure的时候带参数--enable-ucs2 即使用ucs2编码),clucene使用的是wchar_t类型。这个wchar_t在windows下为2个字节,在linux下为4个字节,不过无所谓,对于clucene来说没有什么影响。
Java在读入文本时,可以指定编码。如果没有指定,则使用系统默认的编码。windows(中文版)为ansi,实际上就是GBK。linux系统默认的编码似乎和locale有关,一般情况下为utf-8。将文本读入内存后,Java统一使用unicode对字符编码,所以只要读入时的编码正确,就没有问题。Java版的lucene写索引时使用modified utf-8编码,与utf-8的区别在于对'\0'进行处理,把它写成两个字节。另外modified utf-8编码最长使用3字节。
可惜clucene(http://clucene.org/)没有Java那么多库可以用。为了省事,它才不管原始文件是GBK、BIG5还是UTF-8编码,完全按照UNICODE处理。这种情况下,如果程序没有崩溃(奇迹...),生成的索引对于Java版的lucene来说完全是天书。当然,ASCII码除外。
为了解决这个问题,可以在进行索引之前,把文本转化为unicode。linux下有著名的iconv包。听说windows下有专门的api。这里需要注意的是,用iconv生成的unicode是小尾端(little endian),所以转化后读入wchar_t时要
char* result;
iconv(...,&result,...);
......
//result中保存转换好的unicode字符
size_t s = strlen(result);
size_t i = 0;
char high, low;
while(i<s){
low = result[i];
high = result[i+1];
wchar_t w = (low & 0xff) + ((high & 0xff)<<8);
i += 2;
}
......
这样子才能正确解析。
如此一来,clucene生成的索引就可以被lucene识别了。前台还是使用J2EE,管它什么Struts,还是Servlet,后台生成索引部分就完全用clucene来替代。经过实验对比,在数据量不大的情况下,clucene建索引的速度是lucene的两倍左右。
之所以提高不明显,因为创建索引时的io太多。对于io来说C++相对与Java确实优势不大。但是待索引的内容是其他C++工具生成的,比如SVM,CRF,LDA等等,这些工具的C++版肯定是比Java版要快得多,所以改用clucene还是值得的。
http://bbs.rednet.cn/thread-24398963-1-1.html
分享到:
相关推荐
"clucene中文处理"这个主题,正是针对这一问题,对Clucene进行了优化和扩展,使其具备了处理中文字符的能力。 中文处理的关键在于分词,因为中文没有明显的分隔符,不像英文有空格或标点符号。因此,要在Clucene中...
封装可以将复杂的库操作隐藏在简单的API后面,使得开发人员可以更轻松地使用Clucene进行文本搜索。 描述中提到的".h"文件是C++中的头文件,包含了类定义、函数声明和其他接口信息。在使用Clucene库时,开发人员需要...
2. **创建索引**:使用CLucene API读取文档内容,进行文本分析,并建立索引。 3. **查询索引**:编写查询代码,解析用户输入的查询语句,利用CLucene的查询解析器生成查询对象。 4. **执行搜索**:使用搜索器执行...
1. **建立索引**:Clucene允许开发者对大量文本数据进行索引,这个过程包括分词、建立倒排索引等步骤。分词是将文本拆分成独立的词语,倒排索引则是将每个词语对应的文档位置信息存储起来,以便于快速查找。 2. **...
1. **索引创建**:DEMO首先会读取文本数据,使用Clucene的Analyzer进行分词,然后创建IndexWriter对象,将分词后的文档写入索引。 2. **索引优化**:创建索引后,可能需要进行优化操作,以提高检索效率。这通常通过...
4. **分词支持**:CLucene 内置了对多种语言的分词支持,可以处理英文、中文等不同语言的文本。 5. **索引和存储**:CLucene 可以创建倒排索引,将文本数据转化为可快速查询的结构。同时,它还提供了对原始数据的...
1. **分词和分析**:CLucene内建了对文本的分词处理,支持多种语言的分词器。它提供了Tokenization(分词)和Analyzer(分析器)的概念,允许用户自定义文本处理流程,以适应不同语言和应用场景。 2. **索引构建**:...
2. **分析器(Analyzer)**:在建立索引之前,CLucene会使用分析器对输入的文本进行预处理。分析器负责分词、去除停用词、词形还原等任务,以确保索引的质量。CLucene和CLucene都支持自定义分析器,可以根据具体需求...
Clucene的设计目标是提供快速、可扩展的文本检索功能,它采用了倒排索引(Inverted Index)这一经典的搜索引擎数据结构,使得搜索操作可以高效地在大量文本数据中进行。 首先,我们来看看倒排索引。倒排索引是一种...
通过这些文件,开发者可以直接编译并运行CLucene,也可以对其进行二次开发,根据项目需求进行定制。 总的来说,CLucene是一个强大的C++全文搜索引擎库,其源码提供了丰富的学习材料,有助于开发者深入了解信息检索...
3. 查询解析:用户输入的查询字符串被解析成一系列的搜索条款,然后与索引进行匹配。 4. 高级查询语法:支持布尔运算符、短语搜索、近似搜索等多种复杂查询。 5. 排序和评分:Clucene可以根据相关性对搜索结果进行...
5. **优化和更新**:Clucene允许对索引进行优化,合并多个段以提高检索效率,并支持实时更新,即使在索引过程中也可以进行搜索。 6. **多线程支持**:考虑到性能需求,Clucene支持多线程操作,可以在多处理器系统上...
2. **查询解析**:查看查询字符串如何被转换为查询对象,进而与索引进行匹配。 3. **搜索算法**:分析BM25、TF-IDF等评分算法的实现,理解它们在搜索结果排序中的作用。 4. **性能优化**:研究CLucene如何利用内存和...
CLucene是Java Lucene在C++领域的移植版,它继承了Lucene的强大搜索功能,提供了高效的文本索引和搜索能力。Lucene是一个高性能、可扩展的信息检索库,广泛应用于各类信息检索系统。CLucene则为C++开发者提供了一种...
1. **Clucene**:Clucene是一个C++实现的全文搜索引擎库,它是对Java的Lucene搜索引擎的移植,旨在提供高性能、可扩展的文本搜索功能。它支持索引和搜索大量文本数据,并且可以嵌入到各种C++应用程序中。 2. **...
大名鼎鼎的clucene,是lucene的c++ 版; CLucene README ============== ------------------------------------------------------ CLucene is a C++ port of Lucene. It is a high-performance, full-featured ...
为了解决这个问题,我们需要对cmake配置文件进行适当的修改。 1. **理解CMakeLists.txt**:这是CMake的配置文件,包含了构建项目所需的所有指令。你需要打开这个文件并检查其中的指令,特别是与Visual Studio生成器...
本文将对"clucene-core-0.9.16"这一版本的源代码进行深入解析,探讨其设计理念和核心功能。 一、clucene概述 clucene是基于Apache Lucene的一个C语言实现,它旨在提供与Java Lucene相似的功能,包括文本分析、索引...
这是我学CLUCENE时期整理出来的几个不错的资料,我觉得里面总有一款会适合你,而且你所需要知道的技术里面基本上都是涵盖的,所以可以当作教材或者参考手册使用。(里面有CLUCENE,可以用的)