尝试使用python模拟搜索引擎工作原理,做一个简单的搜索引擎

搜索引擎原理简单的来解释通过检索输入信息中的索引来返回索引对应的信息,所以主要的算法有两个:一是检索信息中是否存在索引,二是索引对应数据库中的信息。

检索信息中是否存在索引

我是选择的直接扫描输入信息中是否包含索引库中的索引,非常简单暴力的方法。

import list1 #list1指索引库keywords = input()if key not in list1():list_temporary_storage = []# 临时列表,将筛选出来的有效键临时储存dictionary_temporary_storage = {}# 临时字典,将筛选出来的有效键和对应的字符串长度储存for key_exist in dictionary.keys():if key_exist in key:list_temporary_storage.append(key_exist)# 筛选有效键(当字典中存在的键在问题中时,判断该键为有效键)else:continueif len(list_temporary_storage) == 0:# 临时列表长度为零即字典中没有键和有效键,记录新键new_reply = input()if new_reply.lower() == 'none':return '好吧'elif type(new_reply.lower()) is str:with open(r'data_base/replenish_dictionary.txt', 'a') as f:f.write(str(key) + ' ' + str(new_reply))f.write('\n')# 将问题与回答加入txt文件,使得信息得以保存return ''elif type(new_reply) is int:with open(r'date_base/dict.txt', 'a')as f:f.write(str(key) + ' ' + new_reply)f.write('\n')return '数据库更新成功'else:for efficacious_key in list_temporary_storage:dictionary_temporary_storage[efficacious_key] = len(efficacious_key)# 在临时字典中添加有效键和对应的有效键长度list_temporary_storage_2 = list(dictionary_temporary_storage.items())# 将临时字典中的键值对转化为元组储存在临时列表2中list_temporary_storage_2.sort(key=lambda x: x[1], reverse=True)# 对临时列表2中的元组按照第二个元素从大到小排列(使第一个元组中的第一个元素为最长的有效键)list_temporary_storage_3 = [x[0] for x in list_temporary_storage_2]# 将元组中的第一个元素储存到临时列表3中if type(dictionary[list_temporary_storage_3[0]]) is list:# 判断最长的有效键对应的值是否为列表import randomif '因为' or '所以' or ',' or ',' in key:number = random.choice(range(1, len(dictionary[list_temporary_storage_3[0]])))# 去掉第一个回答else:number = random.choice(range(0, len(dictionary[list_temporary_storage_3[0]])))# 在列表中任选一个答案回答print(dictionary[list_temporary_storage_3[0]][number])elif type(dictionary[list_temporary_storage_3[0]]) is str:# 当数据类型为字符串时print(dictionary[list_temporary_storage_3[0]])# 直接返回键对应的值elif type(dictionary[list_temporary_storage_3[0]]) is int:dictionary[list_temporary_storage_3[0]] = str(dictionary[list_temporary_storage_3[0]])# 当数据类型为整型时,先将数据类型改为字符串,便于调取相应的文件filepath = 'data_base/1/' + dictionary[list_temporary_storage_3[0]] + '/' \+ dictionary[list_temporary_storage_3[0]] + '.txt'file_open = open(filepath.rstrip())information = file_open.read()print(information)file_open.close()del list_temporary_storage_2del list_temporary_storage_3return ''del list_temporary_storagedel dictionary_temporary_storage# 删除临时列表和字典else:# 同42到62行if type(dictionary[key]) is list:# 判断最长的有效键对应的值是否为列表import randomnumber = random.choice(range(0, len(dictionary[key])))# 在列表中任选一个答案回答print(dictionary[key][number])elif type(dictionary[key]) is str:# 当数据类型为字符串时print(dictionary[key])# 直接返回键对应的值elif type(dictionary[key]) is int:dictionary[key] = str(dictionary[key])# 当数据类型为整型时,先将数据类型改为字符串,便于调取相应的文件filepath = 'data_base/1/' + dictionary[key] + '/' + dictionary[key] + '.txt'file_open = open(filepath.rstrip())information = file_open.read()print(information)

索引对应数据库中的信息

我一下就想到的是用字典中的键值对来表示索引对应数据,同时为了可以让数据库可以更新而把数据库单独拎了出来用txt文本文档来记录

def txt_read(files):"""将txt文件中的信息改为字典写入"""txt_dict = {}file_open = open(files.rstrip())for line in file_open.readlines():line = str(line).replace("\n", " ")txt_dict[line.split(' ', 1)[0]] = line.split(' ', 1)[1]# split()函数用法,逗号前面是以什么来分割,后面是分割成n+1个部分,且以数组形式从0开始file_open.close()return txt_dictdef txt_read_1(files):"""将另外一个用于记录历史事件txt文件中的信息改为字典写入"""txt_dict_1 = {}file_open = open(files.rstrip(), encoding="UTF-8")for line in file_open.readlines():line = str(line).replace("\n", " ")path = line.split('/', 1)[-1]txt_dict_1[line.split('/', 1)[0]] = int(path)file_open.close()return txt_dict_1

txt文件

今年是中国共产党建党一百周年,所以数据库选的是党史

我还单独写了一个计时的部分,可以作为长时间不使用提醒,为了和搜索引擎同时进行,创立一个子进程。

计时模块(timecheck.py)

import time
import osdef timecheck():"""用于计时和作出超时反应"""n = 0  # 每次循环刷新n值while True:  # 这是一个无限循环!if n < 60:time.sleep(1)  # 每一秒钟检测一次n值n += 1elif n >= 60:os.system('cls')  # 页面刷新print('你已经有60秒没有跟我说话了哦,我会寂寞的哦\n如果还不会用的话可以试试输入‘说明’')print('输入区:')time.sleep(300)  # 每次执行一次超时提醒后5分钟不做提示

子进程

from multiprocessing import Process
from functions.timecheck import timecheck
import os
import timeif __name__ == '__main__':while True:P = Process(target=timecheck, args=())  # 调用timecheck函数发起子进程P.start()  # 子进程时间检测与父进程判断一起运行keywords = input('输入区:')P.terminate()  # 当输入后强制结束进程

到这里基本上整个搜索引擎已经构建完成了,不过只是完成了一个不完整的搜索引擎,商用的搜索引擎还有网络爬虫来自动更新数据库(当然商用的搜索引擎也不是用python写的),像索引中的分词这里也没有还原,也还有很多更先进的技术就不提及了,这里的搜索引擎只能算是为了学习编程语言的项目。

点击这里下载文件:搜索引擎文件

欢迎大家评论说说自己的意见

[学习]简易搜索引擎的制作相关推荐

  1. 简易智能手环制作教程

    前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. 转载地址:简易智能手环制作教程 1.智能手环简介 智能手环是一种穿戴式智能 ...

  2. 如何用excle制作黑人拉馆_家居DIY带你学习如何用塑料勺制作壁挂!

    「家居DIY」带你学习如何用塑料勺制作壁挂! DIY生活馆图片展示内容介绍 传承手工艺术,放飞指尖梦想,每一节教学我们都会认真对待!只为传递手工技艺,动手实践能够让生活更美好,它让这一平淡的生活眼前一 ...

  3. 按照一定策略把网页抓回到搜索引擎服务器的,SEO新手学习:搜索引擎的基本步骤...

    初始搜索引擎的原理:第一步就是需要了解"搜索引擎的基本步骤". 搜索引擎的基本步骤(大概架构)如下.可以分成虚线左右两个部分:一部分是搜索引擎抓取:主动抓取网页进行一系列处理后建立 ...

  4. python自动化可以做什么菜_Python自动化开发学习之三级菜单制作

    本文实例为大家分享了Python三级菜单展示的具体代码,供大家参考,具体内容如下 作业需求: (1)运行程序输出第一级菜单 (2)选择一级菜单某项,输出二级菜单,同理输出三级菜单 (3)让用户选择是否 ...

  5. 如何制作linux系统硬盘,手把手带你自制Linux系统之二 简易Linux的制作

    手把手带你自制Linux系统之二 简易Linux的制作 本文利用CentOS5.5自带内核制作一个可以正常启动的Mini Linux. 打开上一篇准备工作中创建的CentOS虚拟机,为另一台虚拟机Mi ...

  6. 基于51单片机的简易减法器设计制作

    基于C51单片机的简易减法器设计制作 51单片机可实现很多功能,今天笔者介绍一种使用C51编写程序,通过4*4矩阵键盘和8位共阴数码管实现的简易减法器.矩阵键盘以及数码管的原理图如下: (1)4*4矩 ...

  7. 【信息检索】Java简易搜索引擎原理及实现(三)B+树索引和轮排索引结构

    上一篇文章 :[信息检索]Java简易搜索引擎原理及实现(二)新增停用词表 + 查询处理,我们在建立好的倒排索引的结构中剔除了停用词,同时引入了AND.OR.ANDNOT操作符,支持三种查询方式. 这 ...

  8. SEO搜索引擎方案制作与数字货币交易所SEO方案模版制作

    SEO搜索引擎方案制作是目前众多数字货币交易所站长面临的一个重要的问题,由于目前国内以及国际上对数字货币交易所网站的限制使得交易所类网站在获取网站流量的问题上面临着严重的挑战,今天我们就通过数字货币交 ...

  9. javascript简易留言板制作 -- 案例

    js简易留言板制作 @Draven 效果预览 html部分 css部分 js部分 效果预览 html部分 <textarea name="text" cols="3 ...

最新文章

  1. Android学习之JSON数据解析
  2. iPhone销量低迷,或导致苹果放弃自动驾驶项目?
  3. 包钢集团、云南建投、南粤交通等大型国企选择用友BIP 实现财务数智能化
  4. OpenSAP网址收藏
  5. python修改html的td_python3修改HTMLTestRunner,生成有截图的测试报告,并发送测试邮件(一)...
  6. Hybris DDIC type and its counterpart model class
  7. React路由组件传递参数
  8. 华为手机系统更新后有什么大的变化?
  9. 2018福布斯全球科技女性TOP 50榜单:李飞飞、滴滴柳青上榜
  10. 生产环境CPU过高问题定位
  11. 陈坤发微博调侃 回应儿子生母话题
  12. 程序员必备开发工具(IDE)推荐
  13. Vue Element 使用required提示语问题 出现‘xxx is required‘解决方案
  14. JAVA启动杀怒尖塔_杀戮尖塔如何修改class 杀戮尖塔修改class文件方法步骤图解
  15. 微信小程序:中老年用户群体的流量生意如何做?
  16. 阿里云大数据型实例规格族d1配置性能详解
  17. 安卓毕业设计- 基于Android的旅游计划APP
  18. 格式塔心理学5项法则的学习与思考
  19. sharding-jdbc系列之按月动态分表(十二)
  20. Linux结构体变量报错,C语言中的结构体

热门文章

  1. K8s项目实战笔记 图文并茂带你深度解析Kubernetes
  2. 邻域、邻接、通路、连通、连通集、区域概念区分​​​​​​​
  3. wxFormBuilder + wxPython 工具开发第二章-日记本工具数据连接与展示
  4. excel中的文本转换成数值
  5. visio如何安装-示例教程
  6. buuctf pwn wp(第四波)格式化字符串漏洞系列
  7. 作用域和自由变量的介绍
  8. 安卓与“Proguard”——安卓的代码混淆
  9. MATLAB设计FIR数字滤波器GUI界面
  10. 网页中,M3U8格式的视频下载