本文主要是介绍全文搜索算法的思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、作用
全文搜索算法适合文本文件的搜索。
二、应用场景
全文搜索算法广泛应用在各个网站的搜索功能中。
三、全文搜索和正则模糊查询的区别
1、全文搜索可以把搜索关键字进行分割,提取出相关的关键词。
2、正则模糊查询只能把关键字作为整体,不能分割词汇。
四、全文搜索的思路
(一)将那些被查询的文本文件建立索引库
1、在磁盘中确定一个文件作为索引文件。
索引文件的格式自定义,方便进行查询。
2、索引文件的作用:
建立关键字和文件路径、出现位置的对应关系。
假设词汇“漂亮” 出现在文本文件 《我的对象》.txt中,那么这个词汇在索引中的记录内容是:
漂亮 : 《我的对象》文件存放路径 : 出现的起始字节位置
3、如何确定索引文件的内容?
3.1、按照顺序读取文本文件的字符,按照分词规则忽略无用词汇,提取关键词汇。
3.2、给每个关键词汇存入一个索引到索引文件里。
(二)开发网络接口给外部查询
1、提供HTTP接口给外部查询
2、查询思路:
用户输入查询关键字,提交给后台。
后台获取关键字,开始分词。
把词汇到索引文件中查询。
如果词汇出现在索引文件中,返回文件的路径和坐标。
后台把该文件内容返回(把目标词汇高亮显示)。
五、关键思路
(一)如何分词
1、建立忽略词汇表
把那些代词、介词、标点符号组成一个忽略表,用来忽略不计。
例如 我、我们、的、地、你、了
忽略标点符号: 、;,!?。
2、建立关键词汇表
需要用户不断的录入词汇,方便查询。
把汉语的词汇都录进去,例如:目录、模型、关键、物质、组织、基础、训练、右击、考试、老师等。
3、把文字序列进行分词
从最左边开始,判断每一个字符:
如果在忽略词汇表中,就忽略该词汇,读取下一个字符。
如果在关键词汇表的词汇中,有词汇的第一个词和该词汇相等,那么读取下一个字符是否匹配第二个字符。
例如当前字符是‘礼’,在关键词汇表中有 ‘礼仪’这个词汇的第一个词汇和它相等,那么读取第二个字符是否等于‘仪’。
注意:可能只有匹配一个字符也满足。
4、如果查询序列和关键词汇表有相等的,就获取索引文件中记录的对应出现过的文件路径。
(二)索引文件如何建立
采用二进制格式,每条记录连续存放。
单条记录格式:20字节关键字 50字节相关文件路径 4字节出现的起始索引位置
六、通俗介绍
(一)被搜索的文本文件通过分词操作,建立索引。
(二)用户提交关键句进行查询,后台根据关键句子也进行分词操作,从索引文件中找到关键字相等的那些文件路径,把文件内容返回给用户。
案例:
1、搜索时有一句话: 我的未来不是梦。
2、分词后忽略: 我 的 。
3、分词后获得的关键字:未来 不是 是梦 梦
4、把未来、不是、是梦、梦这四个关键字去索引文件里查询,如果存在就返回对应的文件路径。
5、假设找到以下文件路径(这些文件内容中出现过关键字):
/doc/关于未来的演讲.html
/doc/我的未来生活.txt
/doc/我做了一个梦.doc
6、把这些文件路径代表的文件读取,用内容列表返回给用户。
七、判断是否为关键词汇的算法改进
(一)背景
关键词汇表存放很多的关键词汇,查询时需要判断搜索词汇是否在表中,才能进行分词。
有一些关键词汇有4个甚至5个字组成,也需要进行判断。
因此:把搜索词汇到关键词汇表中进行查询是很频繁的事情。
(二)如何查询关键词汇的算法
1、第一种、全文遍历查询。
把词汇表中每个词汇用循环遍历,来判断是否和搜索词汇相等。
缺点是当词汇量很多时,耗费时间长,效率不高。
2、第二种,词汇分区法
把词汇按照拼音或者某些方式分区,相同类型的放在一起。
查询时根据搜索词汇的类型来确定分区,跳转到词汇表中对应的分区开始位置,开始遍历查询。
3、第三种,哈希索引法
把每个词汇和词汇表的字节起始位置用哈希函数对应起来。
通过哈希函数,传入词汇,就能计算出该词汇在词汇表中的存放索引位置,直接跳转到该位置进行比对。
或者每个词汇有一个唯一的编号(字符的字节值),用编号来获取存放位置。
这篇关于全文搜索算法的思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!