CN103440331B - 基于逆波兰和多叉树的搜索引擎查询语句解析方法 - Google Patents

基于逆波兰和多叉树的搜索引擎查询语句解析方法 Download PDF

Info

Publication number
CN103440331B
CN103440331B CN201310399206.1A CN201310399206A CN103440331B CN 103440331 B CN103440331 B CN 103440331B CN 201310399206 A CN201310399206 A CN 201310399206A CN 103440331 B CN103440331 B CN 103440331B
Authority
CN
China
Prior art keywords
node
heap
operator
search engine
multiway tree
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201310399206.1A
Other languages
English (en)
Other versions
CN103440331A (zh
Inventor
刘凯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing 58 Information Technology Co Ltd
Original Assignee
Beijing 58 Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing 58 Information Technology Co Ltd filed Critical Beijing 58 Information Technology Co Ltd
Priority to CN201310399206.1A priority Critical patent/CN103440331B/zh
Publication of CN103440331A publication Critical patent/CN103440331A/zh
Application granted granted Critical
Publication of CN103440331B publication Critical patent/CN103440331B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供了一种基于逆波兰和多叉树的搜索引擎查询语句解析方法,其特征在于,包括如下步骤:a)将查询语句转化为逆波兰表达式;b)遍历所述逆波兰表达式,生成多叉树;c)遍历所述多叉树;d)输出遍历后的查询结果。根据本发明的基于逆波兰和多叉树的搜索引擎查询语句解析方法,能够优化查询操作,能够减小时间复杂度,从而降低响应延迟。

Description

基于逆波兰和多叉树的搜索引擎查询语句解析方法
技术领域
本发明涉及搜索引擎的查询语句解析领域,特别是一种基于逆波兰和多叉树的搜索引擎查询语句解析方法。
背景技术
搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。百度和谷歌等是搜索引擎的代表。
解析查询语句是搜索引擎进行信息检索的一个重要步骤。在用户使用搜索引擎进行搜索时,通常输入由多个关键字以及关键字之间的逻辑关系构成的检索式。搜索引擎常用的逻辑关系语法一般为布尔运算,即“逻辑与”、“逻辑非”和“逻辑或”。“逻辑与”的检索式“Q1AND Q2”(其中Q1、Q2为输入的关键词),即查找既包含关键词Q1又包含关键词Q2目标搜索结果。“逻辑非”的检索式“!Q1”,即查找不既包含关键词Q1的目标搜索结果。“逻辑或”的检索式“Q1OR Q2”,即查找或者包含关键词Q1或者包含关键词Q2的目标搜索结果。举例来说,若搜索所有包含关键词“搜索引擎”和“历史”的目标结果,则可以输入检索式搜索:“搜索引擎AND历史”。如在上述搜索结果中,发现大量的搜索结果是涉及“文化历史”、“艺术历史”等和搜索引擎历史无关的内容,则可以改进检索式为“搜索引擎AND历史!文化!艺术”,即可以将目标结果中涉及文化历史的内容去掉,进一步筛选搜索结果。在有的情况下,如果进行关键字逻辑与的查询时,发现几乎无法命中目标结果,或仅命中有限的结果但无法令人满意,则多采用逻辑或的检索式以扩大目标结果的命中范围,查找用户所需要的检索结果。
现有的搜索引擎对查询语句解析的方法是将查询语句以逆波兰方式解析后,生成一棵以二叉树表示的查询语法树,然后以先序遍历二叉树的方式进行逻辑操作及结果集的合并,每次输出最小的文档编号。
然而,在现有的搜索引擎查询语句的解析过程中,如果有多个连续或者并列的逻辑或(OR)查询操作,则会导致生成的二叉树的深度较大。由于遍历操作是从叶子节点向根节点聚合,每次比较后输出一个元素,这样树的深度以及叶节点在树中的位置不同都会影响比较的次数,树的深度越大比较次数越多,结果集大的叶子节点越深查询时间越长。而且,二叉树每个节点最多只有左右两个子节点,每次只对不超过两个元素操作,也是制约了查询速度的因素之一。
因此,需要一种能够优化查询操作,减少计算量,从而降低响应延迟的搜索引擎查询语句解析方法。
发明内容
本发明的目的是提供一种基于逆波兰和多叉树的搜索引擎查询语句解析方法。
根据本发明的一个方面,提供了一种基于逆波兰和多叉树的搜索引擎查询语句解析方法,其特征在于,包括如下步骤:a)将查询语句转化为逆波兰表达式;b)遍历所述逆波兰表达式,生成多叉树;c)遍历所述多叉树;d)输出遍历后的查询结果。
优选地,所述步骤b)的生成多叉树的过程包括如下子步骤:a)按从左到右的顺序遍历逆波兰表达式的一个元素;b)判断是否完成对逆波兰式的遍历,是则遍历过程结束,此时生成的多叉树即为所述多叉树;否则,提取当前遍历到的一个元素,进入步骤c);c)判断所提取的元素是否为查询词,是则将该查询词入栈,返回步骤a),否则所提取的元素为操作符,并将栈顶元素出栈,进入步骤d);d)将所述操作符作为临时多叉树的根节点,并将出栈元素作为叶子节点进行组合,形成临时多叉树;e)将生成的临时多叉树的根节点及其叶子节点重新入栈,返回步骤a)。
优选地,在所述步骤c)中,若遍历到单目操作符则出栈一个栈顶元素,若遍历到双目操作符则出栈两个栈顶元素。
优选地,在所述步骤d)中,当所有出栈元素均为查询词时,则将所述查询词直接作为临时多叉树的子节点;当其中至少一个出栈元素为操作符,并且与当前遍历到的操作符相同时,则将相同操作符的子节点合并;当其中至少一个出栈元素为操作符元素并且与遍历到的操作符不同时,该出栈的操作符元素附带其子节点直接作为当前遍历到的操作符的子节点。
优选地,在所述步骤c)的遍历多叉树的过程包括如下子步骤:a)将所述多叉树的根节点的所有子节点构成小根堆;b)提取所述根堆的堆顶节点的元素,更新查询结果;c)将所述堆定节点出堆,判断所述出堆节点的元素是否为空,是则进入步骤d),否则将所述出堆节点重新入堆并调整,返回步骤b);d)判断所述跟堆中的节点是否为空,是则结束遍历,否则返回步骤b)。
优选地,所述节点的元素包含查询词对应的编号为从小到大排序的有序文档列表。
优选地,若跟堆的节点是AND操作符,则对该操作符的每个子节点的文档编号列表进行与操作得到所有子节点共有的有序文档编号。
优选地,在所述子步骤b)中更新查询结果时,剔除重复的查询结果。
优选地,若在所述子步骤b)中更新查询结果时节点为操作符非,则从当前的查询结果中去掉该操作符非对应的查询词对应的文档。
优选地,所述子步骤c)中的调整是指将节点重新入堆调整后的堆仍然满足小跟堆的形式。
根据本发明的基于逆波兰和多叉树的搜索引擎查询语句解析方法,能够优化查询操作,能够减小时间复杂度,从而降低响应延迟。
附图说明
参考随附的附图,本发明更多的目的、功能和优点将通过本发明实施方式的如下描述得以阐明,其中:
图1示意性示出了本发明的基于逆波兰和多叉树的搜索引擎查询语句解析方法的流程图。
图2(a)示意性地示出了由逆波兰表达式生成多叉树的示意图。
图2(b)示意性地示出了由逆波兰表达式生成多叉树的方法流程图。
图3示意性地示出了遍历根据本发明的多叉树的方法流程图。
图4示意性地示出了构成小根堆的示意图。图4(a)示意性地示出了在节点中显示节点元素的多叉树示意图。图4(b)示意性地示出了初始状态的小根堆的状态的示意图。图4(c)示意性地示出了初始状态的查询结果状态示意图。
图5示意性地示出了遍历初始状态的小根堆的堆顶节点当前元素的示意图。图5(a)示意性地示出了提取堆顶节点当前元素时的小根堆的状态的示意图。图5(b)示意性地示出了堆顶节点出堆并调整小根堆堆内节点位置时的小根堆状态的示意图。图5(c)示意性地示出了出堆节点入堆并且调整堆内节点位置时的小根堆状态的示意图。
图6示意性地示出了提取AND节点的当前元素并且利用该元素更新查询结果的示意图。图6(a)示意性地示出了第一次遍历到AND节点时小根堆的示意图。图6(b)示意性地示出了AND节点的迭代器指针的指向的示意图。图6(c)示意性地示出了利用AND节点的当前元素更新查询结果的示意图。
图7示意性地示出了提取!节点的当前元素并且利用该元素更新查询结果的示意图。图7(a)示意性地示出了第一次遍历到!节点时小根堆的示意图。图7(b)示意性地示出了!节点的迭代器指针的指向的示意图。图7(c)示意性地示出了利用!节点的当前元素更新查询结果的示意图。
具体实施方式
通过参考示范性实施例,本发明的目的和功能以及用于实现这些目的和功能的方法将得以阐明。然而,本发明并不受限于以下所公开的示范性实施例;可以通过不同形式来对其加以实现。说明书的实质仅仅是帮助相关领域技术人员综合理解本发明的具体细节。
在下文中,将参考附图描述本发明的实施例。在附图中,相同的附图标记代表相同或类似的部件,或者相同或类似的步骤。
图1示意性地示出了本发明的基于逆波兰和多叉树的搜索引擎查询语句解析方法的流程图。该方法包括如下步骤:
步骤101,将查询语句转化为逆波兰表达式。例如,若查询语句为“Q1OR(Q2OR Q3)OR Q4AND Q5OR!Q6”,将其转换为逆波兰表达式,结果为“Q1Q2Q3OR OR Q4Q5AND OR Q6!OR”。其中Q1、Q2、Q3、Q4、Q5和Q6为查询词,“OR”为“或”操作符,“AND”为“与”操作符,“!”为“非”操作符。可以理解的是,这里举出的操作符仅仅是示意性的,可以根据需要增加其他的操作符。
步骤102,从左到右遍历逆波兰表达式,通过借助于辅助栈的逻辑操作,生成多叉树。具体的生成多叉树过程将在下文参考附图2(a)和2(b)进行详细说明。
步骤103,遍历多叉树。具体的遍历过程将在下文参考附图进行详细说明。
步骤104,输出遍历后的结果,即最终的查询结果。
生成多叉树的过程
图2(a)示出了示例性的由逆波兰表达式借助辅助栈生成根据本发明的多叉树结构的过程。如图2(a)所示,将逆波兰表达式中的元素逐个遍历后入辅助栈203,箭头201表示由辅助栈的栈底指向栈顶的方向,箭头202表示辅助栈的状态改变方向。
图2(b)示意性地示出了由示例性的逆波兰表达式生成多叉树的方法流程图。生成多叉树的具体步骤如下:
步骤102a,按从左到右的顺序遍历逆波兰表达式的一个元素;
步骤102b,判断是否完成对逆波兰式的遍历。是则遍历过程结束,组合后形成的多叉树即为目标多叉树;否则,提取当前遍历到的一个元素,进入步骤102c;
步骤102c,判断所提取的元素是否为查询词,是则进入步骤102d进行查询词的相应处理;否则遍历到的即为操作符,则将该操作符元素作为临时多叉树的根节点构造临时多叉树,然后进入步骤102e;
步骤102d,将该查询词入栈,返回步骤102a继续遍历逆波兰表达式;例如,如图2(a)所示,遍历得到的前三个元素Q1、Q2和Q3均为查询词,则依次入栈。
步骤102e,将栈顶元素出栈,将出栈后的元素作为该临时多叉树的根节点的叶子节点,进入步骤102f构造临时多叉树。
在该步骤102e中,栈顶元素根据遍历到的操作符的种类不同,出栈的元素数量也不同。若遍历到单目操作符(如“!”操作)则出栈一个元素,若遍历到双目操作符(如“OR”、“AND”等)则出栈两个元素。
步骤102f,将该操作符作为临时多叉树的根节点,并与作为叶子节点的出栈元素进行组合,形成临时多叉树;
步骤102g将生成的临时多叉树的根节点及其叶子节点重新入栈。返回步骤102a继续遍历。
例如,如图2(a)中的箭头204a所示,此时遍历到操作符“OR”,为双目操作符,则将辅助栈栈顶的两个元素Q3和O2出栈。辅助栈中的查询词Q2及Q3与遍历到的操作符或“OR”进行组合,形成一个临时多叉树204b。然后将该临时多叉树的根节点及其叶子节点入栈,标记为OR1(Q2,Q3),即OR1=Q2OR O3。
特别的,在步骤102f中,以遍历到的操作符为临时多叉树的根节点构造临时多叉树时,会根据出栈元素进行不同方式的组合,分为3种情况:
(1)当所有出栈元素均为查询词时,则将该查询词直接作为临时多叉树的操作符根节点的子节点;
(2)当其中至少一个出栈元素为操作符,并且其中至少一个出栈的操作符元素与当前遍历到的操作符相同时,则把出栈操作符所包含的子节点添加到当前遍历到的操作符的子节点中,即将相同操作符的子节点合并。特别的,当出栈操作符和当前遍历到的操作符都为非(!)操作时,不进行对非(!)操作符的合并。
例如,在图2(a)中如箭头205a所示,当遍历到逆波兰表达式中的第二个OR操作符时,出栈的元素为“OR1”和“Q1”,此时判断出OR1与当前遍历到的操作符OR相同,则将Q1添加到OR1的子节点元素中,即生成的OR2=Q1OR Q2OR O3。
(3)当其中至少一个出栈元素为操作符元素并且与遍历到的操作符不同时,该出栈的不同操作符元素(附带其子节点)将直接作为当前遍历到的操作符的子节点。即生成一个子树。
例如,在图2(a)中如箭头207a所示,当遍历到逆波兰表达式中的第三个OR操作符时,出栈的元素为“OR2(Q1,Q2,O3)”和“AND(Q4,Q5)”,此时判断出AND与当前遍历到的操作符OR不同,则直接将AND(附带其子节点)作为当前遍历到的操作符OR的子节点,即生成一个子树。
如图2(a)所示当已经遍历完逆波兰表达式中的最后一个操作符后,此时的多叉树209b即为最终得到的目标多叉树。
根据上述方法由逆波兰表达式生成的多叉树具有如下特征:在多叉树中,整个多叉树的根节点是OR操作符,因此,当遍历逆波兰表达式中遇到第一个为或“OR”的操作符时,则该操作符元素即为整个多叉树结构的根节点;叶子节点只能由查询词构成,而根节点(包括子树的根节点)一定由操作符构成;每个或(OR)查询节点的直接子节点中不会出现或(OR)查询节点。
通过步骤102的生成多叉树的方法可以减少查询语法树中的操作符节点的个数,从而减少树的深度,再利用步骤103就能够实现高效的查询操作。
遍历多叉树的过程
对于步骤102中生成的多叉树的每个叶子节点中的查询词,搜索引擎都保存与该查询词对应的一个文档列表。所以在接下来的步骤103中,遍历到一个节点时,不光可以得到该节包含的查询词,还可以同时得到与查询词对应的文档编号。在本发明中,在遍历多叉树时,查询词节点Q以(查询词Q:文档1,文档2……文档n)的数据结构来表示。
根据本发明的遍历多叉树的过程即使对每个查询词对应的文档进行合并、筛选等操作,并最后输出所查询的对应所有文档列表的过程。
图3示意性地示出了图1的步骤103的遍历多叉树的方法流程图。遍历多叉树的具体步骤如下:
步骤103a,将多叉树的根节点(OR)的所有子节点构成一个小根堆。图4(a)以一个具体的多叉树示例为例,示意性地示出了在节点中包含节点元素(即对应文档)的多叉树示意图。如图4(a)所示,在所构造的多叉树400中,OR为树的根节点。例如,图中的节点401的查询词为Q1,与其对应的文档编号列表为:1、7。根据本实施例,由于构造的是小根堆,因此在上述(查询词Q:文档1,文档2……文档n)的数据结构中,每个查询词节点Q的文档是按照文档编号由小到大排序的。
构造出的示意性小根堆402如图4(b)所示。小根堆是一种经过排序的完全二叉树,其中任一非叶子节点的数据值均不大于其左孩子和右孩子节点的值。元素指的是对应节点的查询词对应的文档编号列表。当完成对多叉树的遍历时,能够得到符合条件的查询结果,查询结果就是符合查询语法树意义的目标文档编号列表400。图4(c)示意性地示出了初始状态的查询结果状态示意图,如图4(c)所示,初始状态下的目标文档编号列表400中没有任何文档编号。
如图4(b)所示,将(OR)查询节点的所有的子节点(包括叶子节点和根节点)构成一个小根堆402,而小根堆402中的节点是按照节点的迭代器当前元素(即每个节点的当前最小的文档编号)的大小排序的。因此在建堆后,节点Q1包含最小的文档编号1,排在堆顶。在堆中,每个节点的元素数据值(即当前最小文档编号)均不大于其左孩子和右孩子节点的数据值。
堆中每个节点都构成一个迭代器,该迭代器的指针指向节点的当前元素。迭代器能够提取当前元素,然后利用该当前元素对查询结果进行符合该节点含义的操作,从而更新查询结果。
根据节点类型,迭代器指针的指向分为3种情况:
(1)若是节点为查询词,则该迭代器指针只需指向对应查询词的文档编号列表中的最小文档编号。如图4(a)中的节点401,其在初始状态下的迭代器指针会指向与查询词Q1对应的文档编号列表中的文档编号“1”。
(2)若是(AND)节点,则其迭代器先将所有AND节点的每个子节点的文档编号列表进行与操作比较,迭代器指针会指向它们共有的最小的文档编号。也就是说,若跟堆的节点是AND操作符,则对该操作符的每个子节点的文档编号列表进行与操作得到所有子节点共有的有序文档编号。
图6示意性地示出了提取AND节点的当前元素并且利用该元素更新查询结果的示意图。图6(a)示意性地示出了第一次遍历到AND节点时小根堆的示意图。图6(b)示意性地示出了AND节点的迭代器指针的指向的示意图。图6(b)的文档编号列表601以及文档编号列表602分别是节点403的子节点404以及子节点405(如图4(a)所示)所对应的文档编号列表,迭代器对这两个文档编号列表进行比较,得到具有公共的文档编号的文档编号列表603,即共有的文档为(3,7)。在初始状态下,迭代器指向最小的文档编号“3”。可以理解的是,若AND节点包含两个以上的子节点,则生成的公关文档编号列表是所有子节点的文档编号进行与操作的结果。
(3)若是!节点,则迭代器指针直接指向!节点的子节点的文档编号列表中的最小文档编号。
如图7所示,图7示意性地示出了提取!节点的当前元素并且利用该元素更新查询结果的示意图。图7(a)示意性地示出了第一次遍历到!节点时小根堆的示意图。图7(b)示意性地示出了!节点的迭代器指针的指向的示意图。图7(b)的文档编号列表701为!节点的子节点407的文档编号列表,!节点406(如图4(a)所示)的迭代器指针指向其子节点407的文档编号列表中的文档编号“2”。
返回图3,在步骤103b,提取堆顶节点的当前元素并更新查询结果。即更新图4(c)所示的目标文档编号列表400。迭代器首先将当前元素其节点中取出,然后进行对查询结果的更新操作。节点中的迭代器提取当前元素并利用其更新目标文档编号列表400之后,迭代器的指针后移,从而指向当前该节点中元素中的最小元素。
图5(a)示意性地示出了提取堆顶节点当前元素时的小根堆的状态的示意图。在小根堆402中,初始状态的堆顶节点401中的元素为文档编号“1”和文档编号“7”,如图5(a)所示,节点401中的迭代器将该节点的当前元素即文档编号“1”从该节点中取出并利用取出的当前元素对查询结果进行更新操作后,节点401中的剩余的元素为文档编号“7”。
根据堆中节点的类型不同,利用提取的当前元素(即文档编号)进行更新查询结果的方法有所不同,分为2种情况:
(1)若节点为查询词或AND操作符,则迭代器检查目标文档编号列表400中是否已有与取出的当前元素相同的文档编号,若没有则将提取的文档编号添加至目标文档编号列表400中;若有则不将该文档编号添加至目标文档编号列表400,从而避免查询结果重复。
图6(c)示意性地示出了利用AND节点的当前元素更新查询结果的示意图。如图6所示,例如,在第一次遍历到AND节点时,迭代器利用提取的文档编号“3”检查当前目标文档编号列表400中是否有文档编号“3”,因为目标文档编号列表400中已有文档编号“3”,所以不再对目标文档编号列表400进行添加操作。
(2)若节点为操作符非(!),则迭代器在目标文档编号列表400中寻找与提取的文档编号相同的文档编号(若目标文档编号列表400中有该取出的文档编号的话),并将其从目标文档编号列表400中删除。也就是说,由于操作符非(!)执行的是从检索出来的文档中去掉该操作符非(!)对应的查询词对应的文档,即需要将目标文档编号列表400中相应的该文档删除。
图7(c)示意性地示出了利用!节点的当前元素更新查询结果的示意图。如图7所示,非(!)节点的迭代器在目标文档编号列表中与提取的文档编号相同的文档编号“2”,然后对目标文档编号列表进行删除操作。
返回图3,进入步骤103c,在提取了堆顶节点的元素更新查询结果后,将步骤103b中的堆顶节点出堆。堆顶节点出堆后迭代器指针后移,也就是将迭代器指针指向该节点文档列表中的下一个文档。然后对堆中剩余的节点进行调整,此时会产生新的拥有最小当前元素的堆顶节点。
图5(b)示意性地示出了堆顶节点出堆并调整小根堆堆内节点位置时的小根堆状态的示意图。如图5(b)所示,堆顶节点401出堆,节点401的迭代器指针后移,小根堆402的堆内节点进行调整,产生拥有最小当前元素(即文档编号)“2”的堆顶节点409;
步骤103d,判断出堆节点的元素是否已为空,是则进入步骤103e;否则进入步骤103f;
步骤103e,判断堆中节点是否为空,是则说明多叉树的遍历已经完成,则完成查询操作,此时的目标文档编号列表400即为最终的查询结果;否则返回步骤103b,继续遍历堆中剩余节点的元素。
步骤103f,将出堆节点重新入堆,并按照此时各节点的当前元素大小对各节点重新排序调整,从而更新小根堆内节点,使该调整后的堆仍然满足小跟堆的形式,即满足堆顶节点拥有最小当前元素。然后返回步骤103b继续提取当前的堆顶节点元素进行操作。
图5(c)示意性地示出了出堆节点重新入堆并且调整堆内节点位置时的小根堆状态的示意图。如图5(c)所示,出堆节点401入堆,按照堆内各节点当前元素大小对各节点重新排序,由于此时节点401的当前元素(即文档编号为“7”,即只能按从小到大的顺序排在小根堆的最后。此时最小当前元素“2”的节点409调整为堆顶节点;
因为小根堆402中的元素是按节点当前元素有序的,每取出一个文档编号都会重新调整堆,所以将OR根节点的所有子节点以构成堆的方式来进行遍历,能够减少逻辑操作,从而加快查询速度。
本发明的基于逆波兰和多叉树的搜索引擎查询语句解析方法,与现有技术的生成二叉树的方法相比,在将逆波兰表达式生成查询语法树时,选择生成多叉树,使得能够合并部分节点,降低了树的深度;在遍历多叉树时,将OR根节点的所有子节点以构成堆的方式来进行遍历。能够降低合并结果集时的开销,减少响应延迟。
这里对本发明的方法的时间复杂度进行说明。假设只有(n-1)个逻辑或(OR)查询的语句,那么有n个查询词,如果每个查询词的结果集大小为m,那么本发明的方法的时间复杂度为m*log2n,而现有方法的时间负责度为m*n2,n越大效果越明显。当n大于9时,同样的查询语句,利用本发明的查询延迟能够降低到现有方法的查询延迟的50%。
根据本发明的基于逆波兰和多叉树的搜索引擎查询语句解析方法,能够优化查询操作,减小时间复杂度,从而降低响应延迟。
结合这里披露的本发明的说明和实践,本发明的其他实施例对于本领域技术人员都是易于想到和理解的。说明和实施例仅被认为是示例性的,本发明的真正范围和主旨均由权利要求所限定。

Claims (8)

1.一种基于逆波兰和多叉树的搜索引擎查询语句解析方法,其特征在于,包括如下步骤:
a)将查询语句转化为逆波兰表达式;
b)遍历所述逆波兰表达式,生成多叉树,搜索引擎保存与所述多叉树的每个叶子节点中的查询词对应的一个文档列表:
b1按从左到右的顺序遍历逆波兰表达式的一个元素;
b2判断是否完成对逆波兰式的遍历,是则遍历过程结束,此时生成的多叉树即为所述多叉树;否则,提取当前遍历到的一个元素,进入步骤b3;
b3判断所提取的元素是否为查询词,是则将该查询词入栈,返回步骤b1,否则所提取的元素为操作符,并将栈顶元素出栈,进入步骤b4;
b4将所述操作符作为临时多叉树的根节点,并将出栈元素作为叶子节点进行组合,形成临时多叉树;
b5将生成的临时多叉树的根节点及其叶子节点重新入栈,返回步骤b1;
c)遍历所述多叉树:
c1将所述多叉树的根节点的所有子节点构成小根堆;
c2提取所述根堆的堆顶节点的元素,所述元素是对应节点的查询词对应的文档编号列表,每个查询对应的文档编号按从小到大的顺序排列,更新查询结果;
c3将所述堆定节点出堆,判断所述出堆节点的元素是否为空,是则进入步骤c4,否则将所述出堆节点重新入堆并调整,返回步骤c2;
c4判断所述跟堆中的节点是否为空,是则结束遍历,否则返回步骤c2;
d)输出遍历后的查询结果。
2.根据权利要求1所述的搜索引擎查询语句解析方法,其特征在于,在所述步骤b3中,若遍历到单目操作符则出栈一个栈顶元素,若遍历到双目操作符则出栈两个栈顶元素。
3.根据权利要求1所述的搜索引擎查询语句解析方法,其特征在于,在所述步骤b4中,当所有出栈元素均为查询词时,则将所述查询词直接作为临时多叉树的子节点;当其中至少一个出栈元素为操作符,并且与当前遍历到的操作符相同时,则将相同操作符的子节点合并;当其中至少一个出栈元素为操作符元素并且与遍历到的操作符不同时,该出栈的操作符元素附带其子节点直接作为当前遍历到的操作符的子节点。
4.根据权利要求1所述的搜索引擎查询语句解析方法,其特征在于,所述节点的元素包含查询词对应的编号为从小到大排序的有序文档列表。
5.根据权利要求1所述的搜索引擎查询语句解析方法,其特征在于,若跟堆的节点是AND操作符,则对该操作符的每个子节点的文档编号列表进行与操作得到所有子节点共有的有序文档编号。
6.根据权利要求1所述的搜索引擎查询语句解析方法,其特征在于,在所述子步骤c2中更新查询结果时,剔除重复的查询结果。
7.根据权利要求1所述的搜索引擎查询语句解析方法,其特征在于,若在所述子步骤c2中更新查询结果时节点为操作符非,则从当前的查询结果中去掉该操作符非对应的查询词对应的文档。
8.根据权利要求1所述的搜索引擎查询语句解析方法,其特征在于,所述子步骤c3中的调整是指将节点重新入堆调整后的堆仍然满足小跟堆的形式。
CN201310399206.1A 2013-09-05 2013-09-05 基于逆波兰和多叉树的搜索引擎查询语句解析方法 Active CN103440331B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310399206.1A CN103440331B (zh) 2013-09-05 2013-09-05 基于逆波兰和多叉树的搜索引擎查询语句解析方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310399206.1A CN103440331B (zh) 2013-09-05 2013-09-05 基于逆波兰和多叉树的搜索引擎查询语句解析方法

Publications (2)

Publication Number Publication Date
CN103440331A CN103440331A (zh) 2013-12-11
CN103440331B true CN103440331B (zh) 2017-02-08

Family

ID=49694024

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310399206.1A Active CN103440331B (zh) 2013-09-05 2013-09-05 基于逆波兰和多叉树的搜索引擎查询语句解析方法

Country Status (1)

Country Link
CN (1) CN103440331B (zh)

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106598963B (zh) * 2015-10-14 2021-08-10 五八同城信息技术有限公司 查询语句优化方法及装置
CN108491207B (zh) * 2018-03-02 2020-11-17 平安科技(深圳)有限公司 表达式处理方法、装置、设备及计算机可读存储介质
CN110493167B (zh) * 2018-07-14 2021-06-29 北京数安鑫云信息技术有限公司 一种高效能深度威胁识别引擎的实现方法及系统
CN109492383B (zh) * 2018-11-09 2022-02-01 四川长虹电器股份有限公司 一种数据权限的解析方法
CN110933077A (zh) * 2019-11-29 2020-03-27 深圳市风云实业有限公司 一种报文解析系统及方法
CN112633710B (zh) * 2020-12-26 2023-10-13 中国农业银行股份有限公司 作业任务调度方法、装置、设备及存储介质
CN112632110A (zh) * 2021-01-06 2021-04-09 上海合合信息科技股份有限公司 一种自动生成查询语句的数据提取方法及装置
CN115906802B (zh) * 2023-02-09 2023-08-22 成都数联云算科技有限公司 一种条件逻辑数据的解析方法、装置、设备及介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101576929A (zh) * 2009-06-16 2009-11-11 程治永 一种快速词条提示的实现方法
CN103177038A (zh) * 2011-12-26 2013-06-26 昆山麦克斯泰科技有限公司 一种垂直搜索引擎中的查询表达式
CN103259793A (zh) * 2013-05-02 2013-08-21 东北大学 基于后缀自动机正则引擎构造的深度包检测方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101576929A (zh) * 2009-06-16 2009-11-11 程治永 一种快速词条提示的实现方法
CN103177038A (zh) * 2011-12-26 2013-06-26 昆山麦克斯泰科技有限公司 一种垂直搜索引擎中的查询表达式
CN103259793A (zh) * 2013-05-02 2013-08-21 东北大学 基于后缀自动机正则引擎构造的深度包检测方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
复杂表达式解析和计算的研究实现;何云东;《中国科技信息》;20090830(第8期);第35-38页 *

Also Published As

Publication number Publication date
CN103440331A (zh) 2013-12-11

Similar Documents

Publication Publication Date Title
CN103440331B (zh) 基于逆波兰和多叉树的搜索引擎查询语句解析方法
KR101190230B1 (ko) 정보 검색 시스템에서의 문구 식별
CN1552032B (zh) 数据库
JP5241738B2 (ja) 表からツリー構造データを構築する方法及び装置
Park et al. XML-OLAP: A multidimensional analysis framework for XML warehouses
US20040221229A1 (en) Data structures related to documents, and querying such data structures
WO2005088479A1 (ja) ツリー型データ構造を取り扱う方法、情報処理装置、及び、プログラム
WO2015044223A1 (en) Methods and systems for data management and analysis
JP2006185408A (ja) データベース構築装置及びデータベース検索装置及びデータベース装置
CN103617273B (zh) Sql脚本对象化的方法及系统
KR102088435B1 (ko) 검색 결과 다양성 인덱스 기반의 효율적 검색 장치 및 그 방법
Zhou Exposing relational database as RDF
CN104899262B (zh) 一种支持用户自定义归类规则的信息归类方法
JP5844824B2 (ja) Sparqlクエリ最適化方法
JPH08147320A (ja) 情報検索方法及びシステム
Fürnkranz et al. Guest editorial: Global modeling using local patterns
JP2005521953A (ja) リレーショナルデータベースをクエリーする方法および装置
CN107391690B (zh) 一种处理文献信息的方法
Gugale Super sort sorting algorithm
Akram et al. Intelligent Web Mining Techniques using Semantic Web
CN112148830A (zh) 一种基于最大区域网格的语义数据存储与检索的方法及装置
CN111737482A (zh) 一种适用于数据挖掘的全景可视化图谱生成方法及装置
KR101218577B1 (ko) 키워드 검색을 위한 sparql 질의 처리 수행 장치 및 방법
CN112559527B (zh) 一种基于多叉树节点关系匹配的数据转换方法
KR100341418B1 (ko) 문서자료 검색 데이터베이스화 및 이를 이용한 문서자료검색 방법

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant