全文搜索算法的思路

2024-06-03 02:28
文章标签 思路 搜索算法 全文

本文主要是介绍全文搜索算法的思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、作用

全文搜索算法适合文本文件的搜索。


二、应用场景

全文搜索算法广泛应用在各个网站的搜索功能中。


三、全文搜索和正则模糊查询的区别

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、第三种,哈希索引法
把每个词汇和词汇表的字节起始位置用哈希函数对应起来。

通过哈希函数,传入词汇,就能计算出该词汇在词汇表中的存放索引位置,直接跳转到该位置进行比对。

或者每个词汇有一个唯一的编号(字符的字节值),用编号来获取存放位置。

这篇关于全文搜索算法的思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025779

相关文章

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

速通GPT-3:Language Models are Few-Shot Learners全文解读

文章目录 论文实验总览1. 任务设置与测试策略2. 任务类别3. 关键实验结果4. 数据污染与实验局限性5. 总结与贡献 Abstract1. 概括2. 具体分析3. 摘要全文翻译4. 为什么不需要梯度更新或微调⭐ Introduction1. 概括2. 具体分析3. 进一步分析 Approach1. 概括2. 具体分析3. 进一步分析 Results1. 概括2. 具体分析2.1 语言模型

将添加功能的抽屉剥离,在父组件调用思路

一、新建组件 新建AddRoleEditerDrawer.vue <template><div><el-drawer v-model="dialog" title="添加角色" :before-close="handleClose" direction="rtl" @colse="cancelForm"class="demo-drawer" modal-class="add-drawer">

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem   [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页  我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索c

.Net Mvc-导出PDF-思路方案

效果图: 导语:     在我们做项目的过程中,经常会遇到一些服务性的需求,感到特别困扰,明明实用的价值不高,但是还是得实现;     因此小客在这里整理一下自己导出PDF的一些思路,供大家参考。     网上有很多导出PDF运用到的插件,大家也可以看看其他插件的使用,学习学习; 提要:     这里我使用的是-iTextSharp,供大家参考参考,借鉴方案,完善思路,补充自己,一起学习

.net MVC 导出Word--思路详解

序言:          一般在项目的开发过程中,总会接收到一个个需求,其中将数据转换成Work来下载,是一个很常见的需求;          那么,我们改如何处理这种需求,并输出实现呢?          在做的过程中,去思考 1、第一步:首先确认,Work的存在位置,并创建字符输出路:             //在的项目中创建一个存储work的文件夹             string