大家好,我是微学AI,今天给大家带来深度学习实战项目-文件智能搜索系统,文件智能搜索系统是一种能够帮助用户通过文件的内容快速搜索和定位文件的软件系统。
随着互联网和数字化技术的普及,数据和信息呈现爆炸式增长的趋势,文件管理和搜索变得越来越困难。传统的文件搜索方法,如手动查找文件的内容和使用操作系统自带的搜索功能只能按照文件名来进行搜索,往往需要花费大量的时间和精力,而且搜索结果准确性低,不能满足用户的需求。因此,文件智能搜索系统应运而生,它可以利用先进的技术和算法,快速准确地搜索和定位文件,提高用户的工作效率和生活质量。
一、搜索原理
文件智能搜索系统是基于whoosh索引进行搜索的,whoosh是一种基于Python语言开发的全文搜索引擎库,具有高效、灵活和易用的特点,能够快速构建全文索引和搜索功能。在文件智能搜索系统中,whoosh索引的基本原理如下:
构建索引:将待搜索的文件内容提取出来,并使用whoosh索引进行分词、建立索引。
搜索:用户输入关键词,系统将关键词与索引进行匹配,返回符合条件的搜索结果。
排序:根据匹配度、文件属性和其他因素,对搜索结果进行排序和过滤,使用户更容易找到想要的文件。
二、智能搜索功能点
文件智能搜索系统的主要功能是通过搜索文件内容来快速定位文件,具体的功能点包括:
关键词搜索:用户可以输入关键词,系统将搜索包含关键词的文件,并返回相关的搜索结果。
高级搜索:用户可以根据文件类型、文件大小、文件修改时间等属性进行高级搜索,过滤掉不符合条件的文件。
模糊搜索:用户可以输入模糊的关键词,系统将搜索相似或相关的内容,提高搜索结果的准确度。
精确搜索:用户可以输入精确的关键词,系统将搜索完全匹配的内容,减少搜索结果的数量。
三、代码实现
1.首先引入whoosh包,可以pip install whoosh,然后创建索引,选择你要搜索文件的文件夹。在同级目录下创建索引保存的文件夹indexdirs。
# -*- coding: utf-8 -*-
from whoosh.index import create_in
from whoosh.fields import *
import glob
import os
import chardet
size = 1024*1024 # 1MB
# 创建索引
schema = Schema(content=TEXT(stored=True), filename=ID(stored=True), filepath=ID(stored=True))
ix = create_in("indexdirs", schema)
writer = ix.writer()
for filename in glob.glob('E:/**/*.txt', recursive=True):
if os.path.isfile(filename):
try:
with open(filename, 'rb') as f:
result = chardet.detect(f.read())
encoding = result['encoding']
#print(encoding)
with open(filename, 'r', encoding=encoding) as f:
content = f.read(size)
while content:
writer.add_document(content=content,
filename=os.path.basename(filename),
filepath=os.path.abspath(filename))
content = f.read(size)
#print('索引创建成功')
except:
print(filename)
writer.commit()
2.加载索引,进行搜索,其中利用gui可视化呈现搜索结果。
# -*- coding:utf-8 -*-
import os, sys
from tkinter import *
from tkinter.font import Font
from tkinter.ttk import *
import re
import difflib
from whoosh.index import open_dir
from whoosh.qparser import QueryParser
from whoosh.query import FuzzyTerm, Term
ix = open_dir("indexdirs")
class Application_ui(Frame):
# 这个类仅实现界面生成功能,具体事件处理代码在子类Application中。
def __init__(self, master=None):
Frame.__init__(self, master)
self.master.title('文件智能搜索系统')
self.master.geometry('955x500')
self.createWidgets()
def createWidgets(self):
self.top = self.winfo_toplevel()
self.style = Style()
self.style.configure('Tftitle.TLabelframe', font=('楷体', 12))
self.style.configure('Tftitle.TLabelframe.Label', font=('楷体', 12))
self.ftitle = LabelFrame(self.top, text='智能匹配', style='Tftitle.TLabelframe')
self.ftitle.place(relx=0.008, rely=0.017, relwidth=0.982, relheight=0.998)
self.stext = Text(self.ftitle, font=('楷体', 12), wrap=NONE, )
self.stext.place(relx=0.017, rely=0.036, relwidth=0.957, relheight=0.212)
# 垂直滚动条
self.VScroll1 = Scrollbar(self.stext, orient='vertical')
self.VScroll1.pack(side=RIGHT, fill=Y)
self.VScroll1.config(command=self.stext.yview) # 将文本框关联到滚动条上,滚动条滑动,文本框跟随滑动
self.stext.config(yscrollcommand=self.VScroll1.set) # 将滚动条关联到文本框
# 水平滚动条
self.stextxscroll = Scrollbar(self.stext, orient=HORIZONTAL)
self.stextxscroll.pack(side=BOTTOM, fill=X) # side是滚动条放置的位置,上下左右。fill是将滚动条沿着y轴填充
self.stextxscroll.config(command=self.stext.xview) # 将文本框关联到滚动条上,滚动条滑动,文本框跟随滑动
self.stext.config(xscrollcommand=self.stextxscroll.set) # 将滚动条关联到文本框
self.totext = Text(self.ftitle, font=('楷体', 12), wrap=NONE)
self.totext.place(relx=0.017, rely=0.352, relwidth=0.957, relheight=0.612)
self.VScroll2 = Scrollbar(self.totext, orient='vertical')
self.VScroll2.pack(side=RIGHT, fill=Y)
# 将滚动条与文本框关联
self.VScroll2.config(command=self.totext.yview) # 将文本框关联到滚动条上,滚动条滑动,文本框跟随滑动
self.totext.config(yscrollcommand=self.VScroll2.set) # 将滚动条关联到文本框
# 水平滚动条
self.totextxscroll = Scrollbar(self.totext, orient=HORIZONTAL)
self.totextxscroll.pack(side=BOTTOM, fill=X) # side是滚动条放置的位置,上下左右。fill是将滚动条沿着y轴填充
self.totextxscroll.config(command=self.totext.xview) # 将文本框关联到滚动条上,滚动条滑动,文本框跟随滑动
self.totext.config(xscrollcommand=self.totextxscroll.set) # 将滚动条关联到文本框
def cut(editor, event=None):
editor.event_generate("<>")
def copy(editor, event=None):
editor.event_generate("<>")
def paste(editor, event=None):
editor.event_generate('<>')
def rightKey(event, editor):
menubar.delete(0, END)
menubar.add_command(label='剪切', command=lambda: cut(editor))
menubar.add_command(label='复制', command=lambda: copy(editor))
menubar.add_command(label='粘贴', command=lambda: paste(editor))
menubar.post(event.x_root, event.y_root)
menubar = Menu(self.top, tearoff=False) # 创建一个菜单
self.stext.bind("", lambda x: rightKey(x, self.stext)) # 绑定右键鼠标事件
self.totext.bind("", lambda x: rightKey(x, self.totext)) # 绑定右键鼠标事件
self.style.configure('Tcleartext.TButton', font=('楷体', 12))
self.cleartext = Button(self.ftitle, text='清空', command=self.cleartext_Cmd, style='Tcleartext.TButton')
self.cleartext.place(relx=0.139, rely=0.263, relwidth=0.086, relheight=0.073)
self.style.configure('Taddyh.TButton', font=('楷体', 12))
self.addyh = Button(self.ftitle, text='点击查找', command=self.addyh_Cmd,
style='Taddyh.TButton')
self.addyh.place(relx=0.512, rely=0.263, relwidth=0.2, relheight=0.073)
class Application(Application_ui):
# 这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。
def __init__(self, master=None):
Application_ui.__init__(self, master)
def cleartext_Cmd(self, event=None):
# TODO, Please finish the function here!
# 清空两个文本框
self.stext.delete(1.0, "end")
self.totext.delete(1.0, "end")
def addyh_Cmd(self, event=None):
# TODO, Please finish the function here!
keyword = self.stext.get(1.0, "end")
keyword = keyword.replace('\n','')
print(keyword)
#query = QueryParser("content", ix.schema).parse(keyword)
query = FuzzyTerm("content", keyword, maxdist=5)
filelist =[]
# 执行查询
with ix.searcher() as searcher:
results = searcher.search(query, limit=60)
#print(results)
for result in results:
filelist.append(result["filepath"])
print(result["filepath"])
for i in filelist:
self.totext.insert(1.0, i)
self.totext.insert(1.0, '\n')
self.totext.update()
if __name__ == "__main__":
top = Tk()
Application(top).mainloop()
运行结果:
3. 后续要添加新的文件,只有添加到原来的索引当中去:
import os
from whoosh.index import open_dir
from whoosh.query import Regex, Term, Or
size = 1024*1024 # 1MB
# 新文件路径
new_file_path = "新文件.txt"
# 索引文件路径
index_dir = "indexdirs"
# 打开索引文件
ix = open_dir(index_dir)
# 创建一个新的 IndexWriter 实例
writer = ix.writer()
# 添加新文件到索引中
with open(new_file_path, 'r', encoding='utf-8') as f:
content = f.read(size)
while content:
writer.add_document(content=content,
filename=os.path.basename(new_file_path),
filepath=os.path.abspath(new_file_path))
content = f.read(size)
# 提交更改
writer.commit()
文件智能搜索系统可以根据文件的内容进行搜索,文字其实可以添加pdf,doc等格式的文件,这里举了txt简单的例子。更多细节咨询与合作可以私信。