JZSearch全文精准搜索中间件内核经过精心设计,具有高扩展性和高通用性。可支持文本、数字、日期、字符串等各种数据类型的高效索引,支持丰富的查询语言和查询类型,支持少数民族语言的搜索。 同时,全文搜索中间件可以无缝地与现有数据库系统融合,实现全文搜索与相关的数据库管理应用系统。 全文精准搜索 其主要特色在于: 可以按照任意指定字段的排序,支持指定字段的搜索,也可以搜索多个字段,以及复杂表达式的综合搜索; 支持精确匹配以及模糊匹配,默认为精确匹配,忽略字母大小写进行模糊匹配; 实现的是多线程搜索服务; 每秒可索引3000条记录(主要瓶颈为数据库或文件记录的读取效率);搜索速度在毫秒级别。 兼容当前所有厂商的数据库系统,其中SQLServer,Oracle,MySQL,DB2等。 建立索引接口 (1)索引初始化操作 FuncName:LJIndexerInit Description:索引系统初始化,必须初始化后,才能使用CLJIndexer Parameters:sDictFilename:词典文件名;为空时,采用ngram索引方法 sFieldInfoFile:域字段信息,用于支持多域索引,为空则只支持一个字段 如果API定义了CODELIMIT,需要从开发商处获得授权码,作为第三个参数 Returns:successorfail Author:灵玖软件 History: ifndefCODELIMIT LJSEARCHAPIAPIboolLJIndexerInit(constcharsDictFilename0,constcharsFieldInfoFile0); else LJSEARCHAPIAPIboolLJIndexerInit(constcharsDictFilename0,constcharsFieldInfoFile0,constcharsLicenseCodes0); endif (2)多字段定义操作 系统定义的字段数据类型 defineFIELDTYPETEXT1文本类型 defineFIELDTYPEINT2整型数 defineFIELDTYPELONG3长整型数 defineFIELDTYPEDATETIME4日期类型 FuncName:LJIndexerFieldAdd Description:添加字段信息 Parameters:sFieldName:域名称,在索引建立与搜索过程中,域的唯一标示符 sDBFieldName:对应于数据库的字段名称;在数据库搜索的时候,用于获取数据库的数据 nFieldType:数据类型,对应的范围如下: FIELDTYPETEXT FIELDTYPEINT FIELDTYPELONG FIELDTYPEDATETIME bIndexed:是否需要索引 bRetrieved:搜索结果中是否要输出该字段内容 bGeneral:是否纳入通配搜索的范畴 Returns:successorfail Author:灵玖软件 History: LJSEARCHAPIAPIboolLJIndexerFieldAdd(constcharsFieldName,constcharsDBFieldName,intnFieldType,boolbIndexed,boolbRetrieved,boolbGeneralfalse); FuncName:LJIndexerFieldSave Description:保存字段定义的内容,一般都在定义完LJIndexerFieldAdd之后,执行 Parameters:sFieldInfoDataFile:保存的域信息数据文件 Returns:successorfail Author:灵玖软件 History: LJSEARCHAPIAPIboolLJIndexerFieldSave(constcharsFieldInfoDataFile); FuncName:LJIndexerFieldLoad Description:读取已经保存好的域信息数据文件 Parameters:sFieldInfoDataFile:保存的域信息数据文件 Returns:successorfail Author:灵玖软件 History: LJSEARCHAPIAPIboolLJIndexerFieldLoad(constcharsFieldInfoDataFile); (3)索引系统退出 FuncName:LJIndexerExit Description:索引系统退出,索引相关的内存全部释放 Parameters: Returns:successorfail Author:灵玖软件 History: LJSEARCHAPIAPIboolLJIndexerExit(); (4)索引合并操作 FuncName:LJIndexerMerge Description:索引合并,要求sIndexFile1的docid编号均小于sIndexFile2的docid Parameters:sIndexFile1:索引文件1 sIndexFile2:索引文件2 sIndexMerged:索引合并后的文件名 Returns:successorfail Author:灵玖软件 History: LJSEARCHAPIAPIboolLJIndexerMerge(constcharsIndexFile1,constcharsIndexFile2,constcharsIndexMerged); (5)索引类操作 FuncName:CLJIndexer Description:建立索引的类 Parameters: Returns:successorfail Author:灵玖软件 History: classLJSEARCHAPIAPICLJIndexer{ public: CLJIndexer(intnMaxMemSize512000000); 内存大小控制 CLJIndexer(void); TODO:addyourmethodshere。 intMemIndexing(constcharpText,intdocid,constcharsFieldName0,intnMemSize0); 索引一段内存; pText:待索引的内存块指针 docid由应用程序维护, sFieldName:字段名称,为空则表示无字段信息,则该索引不支持多字段索引与检索 nMemSize:指的是pText内存块的大小,默认为0,需要系统通过strlen自行计算内存大小 intFileIndexing(constcharsTextFilename,intdocid,constcharsFieldName0); 索引一个文本文件 sTextFilename:文本文件名 docid由应用程序维护 sFieldName:字段名称,为空则表示无字段信息 intIdIndexing(inttermid,intdocid,constcharsFieldName0); 词ID索引 termid:词ID docid由应用程序维护 sFieldName:字段名称,为空则表示无字段信息 boolSave(constcharsIndexFile); 索引保存的名称 一般都选择在索引建立全部完成后,调用。 private:以下部分为系统使用,应用开发者不要改写,只能读取数据 intmnH索引器的Handle,无需调用申请 }; 全文检索接口 (1)搜索的排序选项 搜索的排序选项 defineSORTTYPEDOCID1按照DocID排序,默认方式 defineSORTTYPERELEVANCE2按照相关度排序 (2)搜索的初始化设置 FuncName:LJSearchInit Description:搜索系统初始化,必须初始化后,才能使用CLJSearch Parameters:sIndexFile:已经建立的索引文件 sDictFilename:词典文件名;为空时,采用ngram索引方法 sFieldInfoFile:域字段信息,用于支持多域索引,为空则只支持一个字段 如果API定义了CODELIMIT,需要从开发商处获得授权码,作为第三个参数 Returns:successorfail Author:灵玖软件 History: ifndefCODELIMIT LJSEARCHAPIAPIboolLJSearchInit(constcharsIndexFile,constcharsDictFilename0,constcharsFieldInfoFile0); else LJSEARCHAPIAPIboolLJSearchInit(constcharsIndexFile,constcharsDictFilename0,constcharsFieldInfoFile0,constcharsLicenseCodes0); endif (3)搜索系统的退出 FuncName:LJSearchExit Description:搜索系统退出,释放所有相关的内存 Parameters: Returns:successorfail Author:灵玖软件 History: LJSEARCHAPIAPIboolLJSearchExit(); 系统退出 (4)搜索结果的内存存储格式 DataStructureName:tRESULTRECORD Description:搜索结果结构,用于检索计算使用 Parameters: Returns: Author:灵玖软件 History: typedefstructtRESULTRECORD{搜索结果结构,用于检索计算使用 在域字段内的偏移量 排序用的打分 }RESULTRECORD; typedefRESULTRECORDRESULTRECORDVECTOR; (5)搜索类 ClassName:CLJSearcher Description:用于搜索的类 Parameters: Returns: Author:灵玖软件 History: classLJSEARCHAPIAPICLJSearcher{ public: CLJSearcher(intsorttypeSORTTYPEDOCID); CLJSearcher(void); TODO:addyourmethodshere。 voidSearch(constcharqueryline,intnStart,intnPageCount,constcharsResultName); queryline:查询表达式 nStart:记录起始地址 nPageCount:当前页返回结果数目 nPageCount1:当前页需要返回所有的结果数目 sResultName:结果存储的XML地址 constRESULTRECORDVECTORCLJSearcher::Search(constcharqueryline,intpnResultCountRet); queryline:查询表达式 pnResultCountRet:搜索结果总数 private:以下部分为系统使用,应用开发者不要改写,只能读取数据 intmnH intmnSortT排序方法编号 }; 检索语法说明 查询表达式语法说明 {〔FIELD〕fieldname〔ANDORNOTNEARPREC〕value1value2。。。valuen} 说明: 1。查询是由〔FIELD〕fieldname〔ANDORNOTNEARPREC〕value1value2。。。valuen形式的表达式无限叠加组成的;可以针对多个字段进行查询,也可以针对同一个字段编写多条查询语句; 2。其中每个字符串之间采用空格或者TAB键隔开; 3。其中〔FIELD〕指定字段名称; 4。〔ANDORNOTNEARPREC〕为候选的操作符;操作符的意义解释如下: 1)AND:与操作,即返回的结果必须同时包括后面指定的值value1value2。。。 2)OR:或操作,即返回的结果必须包括后面指定值范围value1value2。。。valuen中的任意一个; 3)NOT:非操作,即返回的结果不能包括后面指定值范围value1value2。。。valuen中的任意一个; 4)NEAR:邻接操作:即返回的结果中,后续的搜索串value1value2。。。valuen必须出现在邻接的位置上(系统目前自定义为10个词间隔) 5)PREC:精准操作:即返回的结果中,如果包含数据的话,必须严格匹配:例如检索号码“GB997”,不能命中“GB19972009”,或者GB9970,只能是“GB997”或者GB9972008。 5。fieldname为索引字段名称,必须和实现建立索引对应的字段名一致; 也可以给出通配符,表示在指定的通配符字段范围内任意搜索; 6。检索语法示例: Sample1:〔FIELD〕title〔AND〕解放军 Sample2:〔FIELD〕title〔AND〕甲流 Sample3:〔FIELD〕title〔AND〕解放军甲流 Sample4:〔FIELD〕title〔OR〕解放军甲流 Sample5:〔FIELD〕title〔AND〕解放军〔FIELD〕title〔NOT〕甲流 Sample6:〔FIELD〕content〔AND〕解放军张雁灵〔FIELD〕title〔AND〕解放军 Sample7:〔FIELD〕content〔AND〕解放军张雁灵〔FIELD〕title〔AND〕解放军 Sample8:〔FIELD〕title〔AND〕解放军某部发生数百人感染甲流疫情 Sample9:〔FIELD〕title〔AND〕解放军某部发生数百人感染甲流疫情 Sample10:〔FIELD〕content〔AND〕甲型H1N1流感 Sample11:〔FIELD〕content〔NEAR〕张雁灵解放军 Sample12:〔FIELD〕content〔AND〕解放军〔FIELD〕content〔NOT〕张雁灵 建立索引的示例程序 以下部分为索引建立的API调用示例 索引初始化 LJIndexerInit(E:LJSearch20Datadictionary。pdat,NULL,LingjoinICTCLAS2010!!); 设置字段信息 LJIndexerFieldAdd(title,NULL,FIELDTYPETEXT,true,true,true); 对标题建索引,需要搜索 LJIndexerFieldAdd(content,NULL,FIELDTYPETEXT,true,true,true); 对内容建索引,需要搜索 LJIndexerFieldSave(FieldInfo。dat); 保存字段信息 CLJIndexerpIndexernewCLJIndexer(); 对文档列表进行索引 for(intdocid0;docidMemIndexing(vecFileList〔docid〕。cstr(),docid,title); 对文件标题进行索引 printf(Indexingstitlecompleted!n,vecFileList〔docid〕。cstr()); pIndexerFileIndexing(vecFileList〔docid〕。cstr(),docid,content); 对文件内容进行索引 printf(Indexingscontentcompleted!n,vecFileList〔docid〕。cstr()); } pIndexerSave(Test0430test);保存索引结果 deletepI索引完成,释放空间 LJIndexerExit();退出索引系统 搜索系统的示例程序 LJSearchInit(Test0430test,E:LJSearch20Datadictionary。pdat,FieldInfo。dat,LingjoinICTCLAS2010!!); 搜索系统初始化 CLJSearcherpSearchernewCLJSearcher(SORTTYPERELEVANCE);按照相关度排序 申请搜索类 intnRecordCount0; RESULTRECORDVECTORpResult0; intnL charpQueryString,sL sLinenewchar〔100〕; strcpy(sLine,〔FIELD〕content〔AND〕解放军张雁灵);甲型H1N1流感 Sample1:〔FIELD〕title〔AND〕解放军 Sample2:〔FIELD〕title〔AND〕甲流 Sample3:〔FIELD〕title〔AND〕解放军甲流 Sample4:〔FIELD〕title〔OR〕解放军甲流 Sample5:〔FIELD〕title〔AND〕解放军〔FIELD〕title〔NOT〕甲流 Sample6:〔FIELD〕content〔AND〕解放军张雁灵〔FIELD〕title〔AND〕解放军 Sample7:〔FIELD〕content〔AND〕解放军张雁灵〔FIELD〕title〔AND〕解放军 Sample8:〔FIELD〕title〔AND〕解放军某部发生数百人感染甲流疫情 Sample9:〔FIELD〕title〔AND〕解放军某部发生数百人感染甲流疫情 Sample10:〔FIELD〕content〔AND〕甲型H1N1流感 Sample11:〔FIELD〕content〔NEAR〕张雁灵解放军 Sample12:〔FIELD〕content〔AND〕解放军〔FIELD〕content〔NOT〕张雁灵 intnSize0; pQueryStringsL pResultpSearcherSearch(pQueryString,nRecordCount); 搜索pQuerySearch,结果总数存在nRecordCount内,搜索结果数组指针存储在pResult printf(Querys,SearchResultCountd,listasfollows:n,pQueryString,nRecordCount); 逐个输出搜索结果 for(inti0;inRecordCi) { printf(No。d:docidds〔d〕scorefn, i, pResult〔i〕。docid, vecFileList〔pResult〔i〕。docid〕。cstr(), pResult〔i〕。offset, pResult〔i〕。score ); } deletepS释放搜索类 deletesL LJSearchExit();退出搜索系统