发明内容
为了在保证检索准确性的前提下,降低XML文档的检索复杂度,本发明实施例提供了一种可扩展标记语言文档的检索方法及装置。所述技术方案如下:
一方面,提供了一种可扩展标记语言文档的检索方法,所述方法包括:
根据用户输入的关键字构建查询路径;
根据所述查询路径及所述关键字构建可扩展标记语言XML查询语句;
根据所述XML查询语句在XML文档数据库中进行检索。
进一步地,所述根据用户输入的关键字构建查询路径之前,还包括:
解析获取到的XML文档,得到所述XML文档的结构路径信息;
根据所述XML文档的结构路径信息对所述XML文档及结构路径进行聚类,并将聚类后的XML文档及结构路径进行存储,得到XML文档数据库。
所述根据所述XML文档的结构路径信息对所述XML文档及结构路径进行聚类之后,还包括:
建立并存储每一类XML文档的索引信息;
相应地,所述根据用户输入的关键字构建查询路径,具体包括:
对所述用户输入的关键字进行预处理,根据预处理后的关键字查找对应的索引信息,并确定对应的XML文档的类别;
根据确定的XML文档的类别构建查询路径。
所述根据用户输入的关键字构建查询路径之前,还包括:
接收上传的检索算法和XML文档,将所述上传的检索算法和XML文档存储到指定位置,并记录所述上传的检索算法和XML文档的大小。
所述记录所述上传的检索算法和XML文档的大小之后,还包括:
提示用户指定检索信息,所述检索信息包括XML文档的大小及检索算法;
相应地,所述根据所述XML查询语句在XML文档数据库中进行检索,具体包括:
根据所述XML查询语句及用户指定的检索信息在XML文档数据库中进行检索。
可选地,所述根据所述XML查询语句在XML文档数据库中进行检索之后,还包括:
统计检索算法的检索效率,使用户根据统计结果选择检索算法。
所述根据所述XML查询语句在XML文档数据库中进行检索之后,还包括:
显示检索算法的检索结果及性能指标。
另一方面,还提供了一种可扩展标记语言文档的检索装置,所述装置包括:
第一构建模块,用于根据用户输入的关键字构建查询路径;
第二构建模块,用于根据所述第一构建模块构建的查询路径及所述预处理模块预处理后的关键字构建可扩展标记语言XML查询语句;
检索模块,用于根据所述第二构建模块构建的XML查询语句在XML文档数据库中进行检索。
进一步地,所述装置,还包括:
解析模块,用于解析获取到的XML文档,得到所述XML文档的结构路径信息;
聚类模块,用于根据所述解析模块解析的XML文档的结构路径信息对所述XML文档及结构路径进行聚类;
存储模块,用于将所述聚类模块聚类后的XML文档及结构路径进行存储,得到XML文档数据库。
所述存储模块,还用于建立并存储每一类XML文档的索引信息;
相应地,所述第一构建模块,具体包括:
预处理单元,用于对所述用户输入的关键字进行预处理;
构建单元,用于根据所述预处理单元预处理后的关键字查找对应的索引信息,并确定对应的XML文档的类别,根据确定的XML文档的类别构建查询路径。
所述装置,还包括:
接收模块,用于接收上传的检索算法和XML文档,将所述上传的检索算法和XML文档存储到指定位置;
记录模块,用于记录所述接收模块接收的上传的检索算法和XML文档的大小。
所述装置,还包括:
提示模块,用于提示用户指定检索信息,所述检索信息包括XML文档的大小及检索算法;
相应地,所述检索模块,用于根据所述XML查询语句及用户指定的检索信息在XML文档数据库中进行检索。
优选地,所述装置,还包括:
统计模块,用于统计检索算法的检索效率,使用户根据统计结果选择检索算法。
所述装置,还包括:
显示模块,用于显示检索算法的检索结果及性能指标。
本发明实施例提供的技术方案的有益效果是:
通过根据关键字进行XML检索,使用户在不需要了解XML文档结构的情况下实现检索,不仅能够在保证检索准确性的前提下,降低XML文档的检索复杂度,还能提升用户体验。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例一
参见图1,本实施例提供了一种可扩展标记语言文档的检索方法,该方法流程具体如下:
101:根据用户输入的关键字构建查询路径;
102:根据查询路径及关键字构建可扩展标记语言XML查询语句;
103:根据XML查询语句在XML文档数据库中进行检索。
进一步地,根据用户输入的关键字构建查询路径之前,还包括:
解析获取到的XML文档,得到XML文档的结构路径信息;
根据XML文档的结构路径信息对XML文档及结构路径进行聚类,并将聚类后的XML文档及结构路径进行存储,得到XML文档数据库。
进一步地,根据XML文档的结构路径信息对XML文档及结构路径进行聚类之后,还包括:
建立并存储每一类XML文档的索引信息;
相应地,根据用户输入的关键字构建查询路径,具体包括:
对用户输入的关键字进行预处理,根据预处理后的关键字查找对应的索引信息,并确定对应的XML文档的类别;
根据确定的XML文档的类别构建查询路径。
可选地,根据用户输入的关键字构建查询路径之前,还包括:
接收上传的检索算法和XML文档,将上传的检索算法和XML文档存储到指定位置,并记录上传的检索算法和XML文档的大小。
进一步地,记录上传的检索算法和XML文档的大小之后,还包括:提示用户指定检索信息,检索信息包括XML文档的大小及检索算法;
相应地,根据XML查询语句在XML文档数据库中进行检索,具体包括:
根据XML查询语句及用户指定的检索信息在XML文档数据库中进行检索。
优选地,根据XML查询语句在XML文档数据库中进行检索之后,还包括:统计检索算法的检索效率,使用户根据统计结果选择检索算法。
根据XML查询语句及用户指定的检索信息在XML文档数据库中进行检索之后,还包括:显示检索算法的检索结果及性能指标。
本实施例提供的方法,通过根据关键字进行XML检索,使用户在不需要了解XML文档结构的情况下实现检索,不仅能够在保证检索准确性的前提下,降低XML文档的检索复杂度,还能提升用户体验。
实施例二
本实施例提供了一种可扩展标记语言文档的检索方法,该方法通过根据关键字进行XML检索,使用户在不需要了解XML文档结构的情况下实现检索。参见图2,本实施例提供的方法流程具体如下:
201:解析获取到的XML文档,得到XML文档的结构路径信息;
其中,本实施例不对获取XML文档的方式进行具体限定,对于单文档数据,本实施例支持数据上传功能,用户可以点击上传XML文档数据,且仅接受XML文档数据,其他数据将会被过滤掉。如果上传的XML文档数据已经存在的话,则将原文档覆盖,并用一个txt文档保存已经上传的XML文档数据的记录信息,同时提供一个JavaBean用于操作txt中的已上传数据记录(主要是取数据、增加数据等);并用一个专门的类AccessTextFile来操纵数据、算法以及索引记录(增删改),数据上传是通过jsp的upload实现的。当上传操作发生时,调用DataUploadServlet来上传相应的数据,同时如果上传数据成功的话就在数据记录信息文档里面增加一条记录。数据上传时还可以统计数据的大小以供后面高级搜索时供用户选择,所有上传的数据都将统一上传到一个指定目录下的文件夹中,用于读取数据的类。此外,除接受用户上传XML文档数据外,为了保证XML文档数据的动态更新,可采用网络爬虫定期抓取互联网中的XML网页。
解析获取到的XML文档时,本实施例采用VTD-XML解析技术,首先将XML文档以二进制数据形式加载到内存,然后用深度优先遍历XML文档,并将相同路径进行合并记录它们出现的频率,具体过程如下:
a、将XML文档以二进制(byte数组)加载到内存;
b、用VTD-XML中的AutoPilot类定位到XML文档的根节点,申请一个节点栈,用于深度优先遍历,并将根节点压入栈中;
c、运用深度优先搜索从根节点开始遍历XML文档,对于XML文档中每一个非叶子节点,保存它们的遍历路径到一个hashtable(哈希表)中,若该路径已出现过,则频率加1,否则***该节点路径并置频率为1;
d、当节点栈为空时,即深度优先遍历结束,将hashtable中的路径和频率信息存入BDB(Berkeley Date Base,伯克利数据库)数据库。
202:根据XML文档的结构路径信息对XML文档及结构路径进行聚类;
具体地,对于每个XML文档,解析后的结构路径都可以创建一棵Trie树,和XML文档的DTD(Document Type Definition,文档类型定义)树相似,Trie是一种用于快速检索的多叉树结构。对于每两个XML文档,如果两棵Trie树符合一定的相似度,即可将它们聚到一类,最后将聚类后的类结构信息用树的双亲存储方式优化后,存入BDB数据库中,再将聚类后的文档存入到BDB XML中用于XQuery查询。
其中,标准Trie用来匹配单词,每个node结点包括一个字母键值和26个字母指针域,而用Trie来匹配路径时,node结点的键值变为一个单词,26个字母指针在空间存储上有很大的浪费,本实施例采用一个哈希表来存储指针域,用来直接定位(0(1))下一个单词,因此改进后的node结点存储结构如下:
class TrieNode{
private String elemString;//存储element值
private long freq;//记录路径的频率
public Hashtable<String,TrieNode>points;//单词的指针域
}
解析后的XML结构信息是以路径形式存储,将XML文档的结构路径构建成一棵Trie的过程就是不断***结点的过程,***过程如下:
a、对于一条路径长度L的路径P,将其分割成L个单词的数组E;
b、若根结点为空,置根结点键值为E[0];否则转c;
c、在当前结点的哈希指针域中查找路径P的下一个元素,若定位成功,则转d;若定位不成功,则在当前结点哈希指针域中***以该元素为键值的node结点,转d;
d、重复c步骤,直到定位完P的所有元素,路径P***成功。
给定一个XML文档结构Trie和一条路径P,路径P的前缀匹配过程如下:
a、将P其分割成L个单词的数组E。
b、设当前结点为根结点,若根结点键值与E的第一个元素比较,若相等转c;否则匹配结束,返回空;
c、在当前结点的哈希指针域中定位E的下一个元素,若定位成功,置当前结点为定位成功的结点,继续3);否则匹配结束,返回前缀匹配路径prefixMatchedPath。
为度量两个文档结构Trie的相似度,首先给出如下两个定义:
定义1:XML文档结构Trie路径总长度Lp
对于给定的XML文档x,若x有n1条路径,每条路径长度为li,则总长度
定义2:两XML文档结构的相似度θ
对于给定的两XML文档x1、x2,设x1为被匹配对象,x2为匹配对象,x1的Trie路径总长度分别为Lp1,前缀匹配的路径总长度为Lpp,则两XML文档结构相似度
若θ(x1,x2)之θthreshold,则认为两文档结构相似,可聚成一类;反之两文档结构不相似。其中,0≤θthreshold≤1,θthreshold由用户自己定义,θthreshold越大,相似度越高,对聚类要求越高,反之相似度越低,对聚类要求越低。
假设现有N个XML文档,分别为x1x2...xN,它们的结构信息分别存储于Stru1Stru2...StruN,其中Strui数组存储文档xi的所有路径,利用Trie匹配的聚类算法描述如下:
1)定义数组currentXMLFiles,用于记录当前未被聚类的XML文档名,初始化为全部文档名,L为数组currentXMLFiles的长度;
2)取current XMLFiles里第一个元素x1的所有路径Stru1,用Stru1构建结构Trie1;
3)取x
i(i=2..L)的Stru
i,对于Stru
i的每条路径p
i,都在Trie
1中进行查询匹配,得到前缀匹配的路径总长度为Lpp
i,若
(此算法中θ
threshold=0.5),则转4);否则若i<L,继续3),否则转5)
4)将Strui的每条路径pi利用构建Trie方式***到Trie1中,即保存该类所有的路径信息,并从currentXMLFiles中删除x1。若i<L,继续3),否则转至5)。
5)保存已聚好类的结构信息Trie1和属于该类的文档名X,其中,文档名可认为是该类的索引信息,若currentXMLFiles数组不为空,继续2),否则聚类结束。
203:将聚类后的XML文档及结构路径进行存储,得到XML文档数据库;
针对该步骤,对于聚类后的每一个Trie,可以直接保存路径信息,但路径信息中包含很多冗余的前缀信息,浪费了存储空间,为此本实施例提出一种树的双亲结点存储法。直接存储路径信息时,如果user/personalInfo被存储了6次,而在树的双亲结点存储下<personalInfo,user>仅被存储了1次,这样大大节省了存储空间。因此,在实验数据中,可以发现优化的树双亲结点存储要比路径存储在结构信息存储上节省60-70%的空间,而且在树双亲结点存储方式下,对于给定的关键词,可以在常量级的时间复杂度内动态生成查询路径。
大规模的XML文档数据首先需要对文档集进行聚类,聚类后具有相同结构的文档被分为一类,同时保存了每一个类别的结构信息(该操纵在聚类过程中完成)。根据不同的类别,将属于同种类别的XML文档放到相同的container里面,并建立每一类XML文档的索引信息后,在这种情况下保证能够根据关键字查找索引信息,确定container的名字,逐渐缩小检索范围。
上面主要解释了为什么会将文档按类分到不同的container里面,下面是存储过程:
第一步:初始化BDB XML环境变量,更传统的方法是创建一个类来单独完成相关操作,本实施例新建了一个类(myDbEnv),在初始化环境变量的时候只需要实例化该类;
第二步:获取XMLManager对象来操纵BDB数据库,同时需要创建一些配置信息来完成相关操纵;
第三步:打开指定的container,如果不存在的话就创建;
第四步:用for循环将所有的XML文档存入到相应的container里面。
可选地,在得到XML文档数据库之后,本实施例提供的方法还支持数据库重置,即重新构造数据库。当重置操作发生时,首先删除原来的数据库文件,然后将重新启动聚类算法对现有的所有文档进行聚类分析,建立存储索引信息,最后按照聚类的结果将同种类型的XML文档存入到相同的container里面。
204:对用户输入的关键字进行预处理,并根据预处理后的关键字构建查询路径;
具体地,对用户输入的关键字进行预处理时,可先对关键字进行多空格分词,并进行字符串编辑距离的计算和同义词纠正,具体过程如下:
1)用正则表达式进行多空格分词;
其中,用一个或多个空格作为分隔符进行分词。
2)计算两字符串间的编辑距离;
edit(i,j)表示源字符串S中[0....i]的子串s i到目标字符串T中[0....j]的子串t1的编辑距离。f(i,j)表示S中第i个字符s(i)转换到T中第j个字符s(j)所需要的操作次数,如果s(i)==s(j),则不需要任何操作f(i,j)=0;否则,需要替换操作,f(i,j)=1。
此处是将长字符串间的编辑距离问题一步一步转换成短字符串间的编辑距离问题,直至只有1个字符的串间编辑距离为1。
3)判断编辑距离d是否小于纠正阈值D,如果是,则执行4),如果否,则执行5);
其中,本实施例不对纠正阈值D的大小进行限定,可根据实际情况设定。如果编辑距离d小于纠正阈值D,则意味着无需对关键字进行纠正,相反,如果编辑距离d大于纠正阈值D,则意味着需要对关键字进行纠正。
4)如果编辑距离d=0,则判断关键字输入正确,预处理过程结束;如果0<d<D,则对关键字进行拼写纠正之后,预处理过程结束;
5)对关键字进行同义词纠正,并在纠正成功之后,预处理过程结束;如果纠正未成功,则判断关键字输入错误,返回错误提示,预处理过程结束。
具体地,进行关键词的同义词纠正时,可在myElemSynSetDB数据库中以关键字作为键值查找,若查找成功,则将查找到的data值作为同义词纠正。关键字预处理后,若拼写纠正或同义词纠正正确,则将该次输入关键字存入myFrequentInputDB数据库,为自动补全、相关搜索和热门词汇提供库支持。其中,返回相关搜索,是指将预处理后的关键字在myFrequentInputDB数据库中进行查询匹配,返回匹配度最高的6个词汇作为相关搜索显示在结果页的showOptions模块,该匹配算法采用两字符串间最多相同单词数匹配。返回热门词汇,同样是将预处理后的关键字在myFrequentInputDB数据库中进行查询,返回出现频率最高的6个输入词汇作为热门词汇显示在结果页的show Options模块。在将关键字存入myFrequentInputDB数据库时,若该关键字在数据库中已出现,则频率加1,否则***该关键字并置频率为1。
进一步地,关键字预处理结束后,根据预处理后的关键字查找对应的索引信息,并确定对应的XML文档的类别,根据确定的XML文档的类别构建查询路径的过程如下:
1)根据element倒排表定位到关键字所属的cluster,并保存到数组clusterNames中;
2)对于每个cluster database,运用哈希双亲键对动态构建从根结点到查询关键字的路径;
3)若为单关键字,则直接保存该cluster下的路径及其频率,转4);否则运用Trie查询匹配求得公共前缀路径,并保存该cluster下的公共前缀路径及其频率,转4);
4)重复2),直到数组clusterNames中每个cluster都被访问过,转5);
5)对于每条路径,根据它们出现的频率从大到小进行降序排列,为XQuery查询结果提供一级排序。
其中,在动态构建查询路径过程中,步骤2)与步骤3)是核心,详细描述为哈希双亲键对动态构建从根结点到关键字的路径,运用Trie查询匹配求公共前缀路径。例如,在对XML文档聚类后,将属于汽车类的XML文档存储之后,建立该类的索引信息为汽车,则当用户输入的关键字为某汽车品牌或是与汽车有关的词汇时,则根据该关键字可以查找到对应的索引信息为汽车,并可确定对应的XML文档的类别,通过在该类别中构建查询路径,从而可以缩小检索范围,提高检索效率。
205:根据查询路径及预处理后的关键字构建XML查询语句,并根据XML查询语句在XML文档数据库中进行检索。
具体地,查询路径是根据之前的前缀编码算法产生的,当检索发生时,利用查询路径和文本关键词来创建出XQuery(XML查询)语句,从而更精确地定位检索的文档在哪个container里面,让检索更高效更精确。
则在检索的时候打开相应的container,用XQuery语句按以下步骤查询:
第一步:定位并打开container。按照上述的初始化环境变量后,利用给定的container名称打开相应的container;
第二步:构建XQuery语句执行查询;
第三步:处理得到的查询结果。
在根据XML查询语句在XML文档数据库中进行检索时,本实施例不对采用的具体检索算法进行限定。与获取XML文档的方式类似,本实施例提供的方法同样支持检索算法的上传,且该检索算法的上传也是通过upload+Servlet实现的。当算法上传发生时,调用AlgorithmUploadServlet将算法的jar包上传的指定的文件目录下,此处将指定目录设为webroot底下的lib目录(用于配合实现反射)。同时非jar包的文件不支持上传,如果上传文件不是jar包也将被拦截。如果算法上传成功,则修改算法记录文件,且在算法上传后应重启***让***能够识别已经上传过的算法,从而用于读取算法的类。
对于查询结果,一般有两种处理方式:一是直接将查询结果存储到结果container里面,二是将查询结果写入XML文件中。由于需要将查询结果送入到页面进行显示,所以处理起来相对复杂一点,此处暂不作赘述,仅需要将查询结果的XMLResults对象返回即可。
本实施例提供的方法实现对查询结果文档的两级排序,第一级排序在生成查询路径的时候进行排序,原理是基于聚类时统计的路径频率,频率高的排在前面;第二级排序是根据经典的TF(Term Frequency,词频)/IDF(InverseDocument Frequency,逆向文件频率)进行排序。
定义:属性值结构权重,用ω-t(vi,ti)表示。一个关键字ti包含于某Text节点中,也可能被多个Text节点包含,因此,一个ti可能属于多个属性。该步骤根据TF/IDF理论,并对其改进,即将TF/IDF的计算粒度变为XML文档中element,一个ti包含于某Element节点vi下的属性值中的次数越多,说明ti越能表达属性vi的含义;一个Element节点vi中,包含的属性值越少,则该关键字ti越能说明vi含义,因此可得出属性值ti结构权重的计算公式为:
在执行根据XQuery语句进行检索时,每次执行检索都会得到一个XMLResults对象,该对象里包含所有满足XQuery条件的记录。一次检索的所有XMLResults存放在XMLResultsSet对象中,数据量十分庞大。如果将所有的XMLResults对象中的记录都转换成可以用于前台显示的记录,会花费掉太多时间(一般会消耗3s以上),本实施例采取的是细分的策略,具体步骤是:
先取100条记录(未到一百条,取出所有的记录)用于显示。如果用户点击分页栏到10页以后的记录时,再取后面的100条给用户(前面已经取出的所有记录也被保存),由于用户在点击下一页的时候花费的时间很少,已经感觉不到是否是新取出的100条记录,也就是将3s时间细分到用户点击下一页的时间里,因而能将效率提高3s左右。又由于EntitiyBean集成了各种用于前台显示的信息,同时本实施例采用JavaScript的dTree进行XML树形结构显示,则将XMLSegment转换成EntityBean时,将content文本转换成XML树(用于前台显示的树形目录)。
进一步地,对于XML文档检索来说,不同的算法在检索时间,准确度以及排序上都有差别。为了提供一个算法研究的平台,从而选出比较完善健全的算法,使XML文档检索更加高效,并实现对大的单文档进行检索,使检索更精确更快速,本实施例提供的方法,还支持将不同的算法、数据以及索引在后台进行预处理后,由用户在前台选择算法和数据进行高级查询。且本实施例提供的方法还可以对高级检索中检索算法的检索效率进行统计,除此之外,还可以显示检索算法的性能指标,使用户通过查看统计来比较相关算法对数据集和关键字的检索效率,还可以通过查看性能指标来比较检索算法的性能,从而选择相应算法,即实现算法的动态使用。
在实现算法的动态使用时,需要实现类的动态加载,因而将涉及到反射机制。反射(Reflection)是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public,static等等)、superclass(例如Object)、实现的interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。本实施例采用了反射机制的一个方面,通过名称加载类定义。使用Class.forName(″包名.类名″),返回一个Class对象,里面包含了关于这个类的信息,包括构造函数,成员函数和变量等。用这个Class对象的newInstance()方法可以得到实际上是″包名.类名″对象的一个Object对象,可以使用强制类型转换变成实际需要的数据。实际使用时,在网站初始化的过程中扫描存放算法的文件夹,把所有符合要求的jar文件加载进网站后台,并存储在全局变量里。以后要使用算法的时候,用名字在那个全局变量里查找,并使用公用的接口对找到的算法类进行调用。
在进行高级检索时,与上述步骤中的多文档检索预处理一样,此处使用VTD-XML技术深度优先遍历XML文档,不同的是,统计了更多的信息,具体表现在SLCA+xmlfileName+TokensIdDB和SLCA+xmlfileName+TokensRecordDB两数据库存储上。需要提出的是,在解析XML文档前,为了在之后的XML文档存储上节省存储空间,并去除冗余符号,规范XML文档格式,便于计算Object对象结点的endOffset属性值,首先要对XML文档进行去除换行符以及换行符前后的空格、Tab符号。正则表达式处理为:xmlValue=xmlValue.replaceAll(″*\n{1,}*″,″″);其次,当得到汇聚的Object对象结点后,需要将XML文档加载到内存中才能取出相应的片段。若XML文档很小,直接加载到内存即可,若XML文档很大,则没必要全部加载到内存,仅需要加载包含片段的文档即可。本实施例不对存储的方式进行限定,仅以采用将XML文档分块存储的方式为例,例如,块大小可以为1M,不足1M就直接存储。
存储时采用SLCA+xml fileName+TokensIdDB,tokenValue表示文档中每个单词的字符串值,tokenId表示该单词在文档中的编号,TokensIdDB存储形式为<tokenValue,tokenId>。深度优先遍历时,给每个非叶子结点唯一编号,叶子结点的文本单词共享同一个编号,这样在输入关键字时,就能直接定位到该关键字在文档中的编号,当然如果该关键字在文档中多次出现,就能得到多个编号。此外在存储叶子结点的文本单词时,本实施例去除如a,the等停用词以节省存储空间。TokensRecordDB存储形式为<tokenId,tokenRecord>,tokenRecord为一个byte数组,存储时byte数组长度根据token是否为object对象结点而不同,若token是object对象结点,长度为23;若token不是object对象结点,长度为11。在存储tokenRecord时,为节省存储空间我们将tokenRecord的所有属性都转换成byte存储。
对于给定的关键字,首先进行多空格分词,然后在TokensIdDB中查询到关键字的tokenId,将所有的token id进行向上汇聚并一直汇聚到object对象结点,再从TokensRecordDB中取出汇聚后的tokenRecord,最后用每个tokenRecord的起始偏移量和结束偏移量从磁盘文件中读取响应片段,并进行tf*idf排序。在关键字检索中,对于给出tokenId汇聚、从TokensRecordDB中取tokenRecord和根据偏移量读取片段三个过程的详细描述如下:
1)tokenId汇聚
对于有N个关键字的输入,首先选取前两个关键字汇聚,再用汇聚到的结点与第三个结点进行汇聚,如此迭代,直到最后汇聚到一个结点结束。以图3所示的3个关键字K1、K2、K3在一XML文档树中的汇聚示意图为例,其中,带箭头的线表示汇聚过程。
2)从TokensRecordDB中取tokenRecord
从TokensRecordDB中取出的tokenRecord包含两种类型,若为Object对象,则取出的是长度为23的byte数组,否则是长度为11的byte数组。为了tokenRecord的id,pid,endOffset,type等属性值,本实施例编写了一个SlcaTokenRecord中间类,该类可以直接byte数组创建,并可直接调用方法得到id,pid,endOffset,type等属性值,极大地方便将byte数组中的某些位转换成int值。例如,如果type只有一位,所以不需要用int转换成4个字节数组,而只需将一字节转换成字符串然后再转换成int即可,这样可以节省3个字节的存储空间。如果type只有三位,所以不需要用int转换成4个字节数组,仅需将3字节转换成字符串然后再转换成int即可,这样可以节省1个字节的存储空间。
3)据偏移量读取片段
根据汇聚后id的起始偏移量和结束偏移量,将磁盘文件块加载到内存并读取相应片段。需要注意的是,如果汇聚后id的起始偏移量和结束偏移量在同一个块中,直接加载该块到内存读取即可;如果起始偏移量和结束偏移量不在同一个块中,这时需要加载两个或两个以上的块到内存中,并重新计算在跨块中的结束偏移量,拼接后才能得到结果片段。
对于互联网海量XML文档的检索,本实施提出一种分布式架构,相对于传统的分布式搜索在检索效率上有很大的提高,该种方式下的分布式检索架构如图4所示。查询服务器(即slave服务器)不需要返回所有结果信息,而只需要返回显示的摘要信息、排序score值和自身的服务器地址,具体的结果信息保存在自身数据库中,大大减少了查询服务器返回结果所需的网络带宽。当终端服务器(即master服务器)将所有查询服务器返回的结果摘要信息排序后返回给用户,用户点击摘要查看详细结果时,将网页重定向到该结果所在的查询服务器上,此时仅需从该查询服务器中取出结果显示给用户即可。
对于XML文档的显示方式,本实施例不进行具体限定。实际应用中,可采用XML DOM(Document Object Model,文档对象模型)对象来动态显示XML文档片段,XML DOM对象是通过load和loadXML方式载入XML文件或者字符串,XMLDOM默认是异步载入XML文件的,通过用户点击来异步加载XML片段或是字符串信息。
本实施例提供的方法,通过根据关键字进行XML检索,使用户在不需要了解XML文档结构的情况下实现检索,不仅能够在保证检索准确性的前提下,降低XML文档的检索复杂度,还能提升用户体验。
实施例三
参见图5,本实施例提供了一种可扩展标记语言文档的检索装置,该装置包括:
第一构建模块501,用于根据用户输入的关键字构建查询路径;
第二构建模块502,用于根据第一构建模块501构建的查询路径及关键字构建可扩展标记语言XML查询语句;
检索模块503,用于根据第二构建模块502构建的XML查询语句在XML文档数据库中进行检索。
参见图6,该装置还包括:
解析模块504,用于解析获取到的XML文档,得到XML文档的结构路径信息;
聚类模块505,用于根据解析模块504解析的XML文档的结构路径信息对XML文档及结构路径进行聚类;
存储模块506,用于将聚类模块505聚类后的XML文档及结构路径进行存储,得到XML文档数据库。
其中,存储模块506,还用于建立并存储每一类XML文档的索引信息;
相应地,参见图7,第一构建模块501,具体包括:
预处理单元501a,用于对用户输入的关键字进行预处理;
构建单元501b,用于根据预处理单元501a预处理后的关键字查找对应的索引信息,并确定对应的XML文档的类别,根据确定的XML文档的类别构建查询路径。
参见图8,该装置还包括:
接收模块507,用于接收上传的检索算法和XML文档,将上传的检索算法和XML文档存储到指定位置;
记录模块508,用于记录接收模块507接收的上传的检索算法和XML文档的大小。
参见图9,该装置还包括:
提示模块509,用于提示用户指定检索信息,检索信息包括XML文档的大小及检索算法;
相应地,检索模块503,用于根据XML查询语句及用户指定的检索信息在XML文档数据库中进行检索。
参见图10,该装置还包括:
统计模块510,用于统计检索算法的检索效率,使用户根据统计结果选择检索算法。
参见图11,该装置还包括:
显示模块511,用于显示检索算法的检索结果及性能指标。
本实施例提供的装置,通过根据关键字进行XML检索,使用户在不需要了解XML文档结构的情况下实现检索,不仅能够在保证检索准确性的前提下,降低XML文档的检索复杂度,还能提升用户体验。
需要说明的是:上述实施例提供的可扩展标记语言文档的检索装置在进行检索时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的可扩展标记语言文档的检索装置与可扩展标记语言文档的检索方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本发明实施例中的全部或部分步骤,可以利用软件实现,相应的软件程序可以存储在可读取的存储介质中,如光盘或硬盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。