一种基于数据库的中文全文本搜索方法与流程

文档序号:14120456阅读:1598来源:国知局

本发明涉及数据识别;数据表示;记录载体;记录载体的处理的技术领域,特别涉及一种基于数据库的中文全文本搜索方法。



背景技术:

随着互联网技术的持续快速发展,人类社会进入了一个前所未有的信息化时代,数据已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素,大数据时代已经来临。在大数据时代,人们掌握的数据在以爆炸性的速度增长,同时,数据的形态也在发生着根本性的变化,大数据的存储和分析方法成为处理大数据的关键,研究如何处理大规模数据成为解决人们在大数据时代如何快速获取有效信息的必由之路。

全文检索是信息检索领域一个非常重要的研究方向,它在数据处理方面具有无可比拟的优势,其核心就是索引技术。

目前的主流数据库在实现文本的搜索上主要有两种方法。第一种是通过like关键字,利用通配操作符匹配文本,查找包括特殊值和部分值的行;第二种是通过正则表达式,编写查找所需数据的非常复杂的匹配模式。虽然这两种搜索机制都非常有用,但存在几个重要的限制:首先,是性能上的限制,通配操作符和正则表达式的匹配通常要求数据库尝试匹配表中所有的行,因此,随着被搜索的行数的不断增加,这些操作可能会非常耗时;其次,是查找控制上的限制,使用通配操作符和正则表达式匹配,很难明确地控制匹配什么和不匹配什么,例如指定这次搜索必须匹配某些关键词,或者搜索不包含该关键字的信息,或者是在匹配成功第一个关键词后,搜索不包含第二个关键字的信息,在部分场景下很难发挥作用;最后,是对于结果的处理,虽然基于通配操作符和正则表达式的搜索都提供了非常灵活的搜索,但是它们都不能提供智能化的选择结果的方法,例如,一个特殊词的搜索将不会找出不包含该词但是包含其他相关词的数据。

事实上,以上所有的限制以及更多的限制都可以使用全文本搜索来解决,在使用全文本搜索时,数据库不需要分别查看每个行,不需要分别分析和处理每个关键词,数据库会创建指定列中各个词对应的索引,搜索可以针对这些词进行,基于此,数据库可以快速有效地决定哪些词匹配、哪些词不匹配以及它们匹配的频率等。然而,现有的主流数据库,例如mysql和postgresql数据库,均不支持中文的全文本搜索方法,同时,scws作为目前使用最方便的开源免费中文分词插件之一,能将一整段的汉字切分成词,但是该插件本身并不支持检索功能,只提供了中文分词的功能。



技术实现要素:

为了解决现有技术中存在的问题,本发明提供一种优化的基于数据库的中文全文本搜索方法,有效组合数据库的全文本搜索优势和分词的模块,实现了中文的全文本搜索。

本发明所采用的技术方案是,一种基于数据库的中文全文本搜索方法,所述方法包括以下步骤:

步骤1:为所述数据库集成中文分词模块;

步骤2:根据搜索需求,利用中文分词模块生成解释器,对所述数据库中要搜索的中文数据进行分词;

步骤3:将分词后的中文数据和分词前的中文数据存入数据库,建立分词后的中文数据和分词前的中文数据间的关联,并在数据库中用于存储分词后的中文数据的字段上建立索引;

步骤4:通过搜索函数对分词后的中文数据进行搜索;

步骤5:获得分词后的中文数据的搜索结果,经过分词后的中文数据和分词前的中文数据间的关联,获得分词前的中文数据,获得全文本搜索的结果。

优选地,所述步骤1包括以下步骤:

步骤1.1:连接数据库;

步骤1.2:下载中文分词插件;

步骤1.3:将中文分词插件安装至数据库,集成为数据库中的中文分词模块。

优选地,所述步骤2中,解释器通过配置设定分词,针对长词进行复合切分。

优选地,所述解释器分词中忽略标点符号。

优选地,所述步骤3中,在数据库中用于存储分词后的中文数据的字段上建立索引后,建立触发器,当原始数据发生变化时,更新对应的存储分词后的中文数据的字段。

本发明提供了一种优化的基于数据库的中文全文本搜索方法,通过在数据库中集成中文分词模块,利用中文分词模块生成解释器并对数据库中要搜索的中文数据进行分词,将分词后的中文数据和分词前的中文数据都存入数据库,建立分词后的中文数据和分词前的中文数据间的关联,并在数据库中用于存储分词后的中文数据的字段上建立索引,通过搜索函数对分词后的中文数据进行搜索,获得分词后的中文数据的搜索结果,经过分词后的中文数据和分词前的中文数据间的关联,获得分词前的中文数据,进而获得全文本搜索的结果。本发明能对数据库中存储的大量数据进行快速的全文本搜索功能,效率比起现有技术中的通配操作符和正则表达式的方式要高得多,经测试,在一千万条数据量的情况下,like通配操作符需要20166.568毫秒进行全文本的搜索,而本发明只需要0.651毫秒。本发明弥补了当前主流的数据库,包括mysql和postgresql数据库的中文全文本搜索的空白。

附图说明

图1为本发明的方法流程图。

具体实施方式

下面结合实施例对本发明做进一步的详细描述,但本发明的保护范围并不限于此。

本发明涉及一种基于数据库的中文全文本搜索方法。在本发明的实现过程中,会涉及到多个软件功能模块的应用,如在仔细阅读申请文件、准确理解本发明的实现原理和发明目的以后,在结合现有公知技术的情况下,本领域技术人员完全可以运用其掌握的软件编程技能实现本发明。前述软件功能模块包括但不限于:中文分词插件、解释器、gin索引、触发器等,凡本发明申请文件提及的均属此范畴,申请人不再一一列举。

所述方法包括以下步骤。

步骤1:为所述数据库集成中文分词模块。

所述步骤1包括以下步骤:

步骤1.1:连接数据库;

步骤1.2:下载中文分词插件;

步骤1.3:将中文分词插件安装至数据库,集成为数据库中的中文分词模块。

本发明中,以对postgresql数据库进行中文全文本搜索为例。

本发明中,中文分词插件为scws中文分词插件,其是目前使用最方便的开源免费中文分词插件之一。当采用scws中文分词插件时,步骤1.3即是去相应的网站下载压缩包,将压缩包进行解压和安装,如http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2。

本发明中,一般情况下,连接数据库由开发人员主动连接。

步骤2:根据搜索需求,利用中文分词模块生成解释器,对所述数据库中要搜索的中文数据进行分词。

所述步骤2中,解释器通过配置设定分词,针对长词进行复合切分。

所述解释器分词中忽略标点符号。

本发明中,举例来说,可以生成一个叫testzhcfg的解释器,并且制定相关的分词规则,包括且不限于设置分词、针对长词进行复合切分、设置分词忽略标点符号。

本发明中,以“浙江省”为例,普通切分的结果是“浙江省”,而复合切分的结果是“浙江省”、“浙江”、“省”三个词,在普通切分的情况下,如果用户输入“浙江”两个字是无法搜索到相应结果的,必须输入“浙江省”才行,而复合切分则没有这样的问题。

步骤3:将分词后的中文数据和分词前的中文数据存入数据库,建立分词后的中文数据和分词前的中文数据间的关联,并在数据库中用于存储分词后的中文数据的字段上建立索引。

所述步骤3中,在数据库中用于存储分词后的中文数据的字段上建立索引后,建立触发器,当原始数据发生变化时,更新对应的存储分词后的中文数据的字段。

本发明中,建立分词后的中文数据和分词前的中文数据间的关联主要通过将原来的数据分词,并在分词前的数据上建立新的一列用于存放分词后的数据,建立关系。例如通过语句新建字段tsv,数据类型为tsvector,用来关联分词后的中文数据和分词前的中文数据,对tsv进行初始化。

本发明中,在实际的操作中,可以对存储分词后的中文数据的字段上建立特殊的gin索引,gin索引可以提高全文本搜索时的性能。

本发明中,触发器在进行操作后能马上给出相应反应。

本发明中,当原始数据发生变化时,更新是存在特定机制的,所谓的特定机制是指在修改了原来的数据之后,对应的分词也必须要进行更新,不然原来的分词和新的数据会不对应,新增的数据对其进行分词也是通过触发器进行控制。

步骤4:通过搜索函数对分词后的中文数据进行搜索。

步骤5:获得分词后的中文数据的搜索结果,经过分词后的中文数据和分词前的中文数据间的关联,获得分词前的中文数据,获得全文本搜索的结果。

本发明中,搜索函数包括以“select”、“to_tsvector”、“to_tsquery”在分词字段上搜索。

本发明中,由于分词后的中文数据和分词前的中文数据间存在关联,故可以将在分词后的中文数据中搜到的行通过前述关联找到分词前的中文数据的对应行并返回,获得全文本搜索的结果。

本发明通过在数据库中集成中文分词模块,利用中文分词模块生成解释器并对数据库中要搜索的中文数据进行分词,将分词后的中文数据和分词前的中文数据都存入数据库,建立分词后的中文数据和分词前的中文数据间的关联,并在数据库中用于存储分词后的中文数据的字段上建立索引,通过搜索函数对分词后的中文数据进行搜索,获得分词后的中文数据的搜索结果,经过分词后的中文数据和分词前的中文数据间的关联,获得分词前的中文数据,进而获得全文本搜索的结果。本发明能对数据库中存储的大量数据进行快速的全文本搜索功能,效率比起现有技术中的通配操作符和正则表达式的方式要高得多,经测试,在一千万条数据量的情况下,like通配操作符需要20166.568毫秒进行全文本的搜索,而本发明只需要0.651毫秒。本发明弥补了当前主流的数据库,包括mysql和postgresql数据库的中文全文本搜索的空白。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1