一、开发环境:Python3.7.2
IDE:Pycharm2018.3
系统:Windows10
二、环境变量
Python PyPI:whoosh(全文搜索)、jieba(中文分词)
1)安装whoosh:
pip install whoosh
2)安装jieba:
pip install jieba
三、源程序及注释
"""
===========================================================
"""
def search_document():
from whoosh.qparser import QueryParser
from whoosh.index import create_in
from whoosh.index import open_dir
from whoosh.fields import TEXT, ID, Schema
from jieba.analyse import ChineseAnalyzer
analyser = ChineseAnalyzer() # 导入中文分词工具
"""
使用whoosh首先要建立schema对象,第一次创建索引时,必须定义索引的模式。该模式列出了索引中的字段。
字段是索引中每个文档的一条信息,例如其标题或文本内容。
下面使用到的schema索引对象。
whoosh.fields.ID:这种类型只是将字段的整个值索引(并可选地存储)为一个单元(也就是说,它不会将其分解为单个单词)。
这对于文件路径,URL,日期,类别等字段很有用。
whoosh.fields.STORED:此字段与文档一起存储,但未编入索引。此字段类型未编入索引且无法搜索。
这对于要在搜索结果中向用户显示的文档信息很有用。
whoosh.fields.TEXT:此类型用于正文。它索引(并可选地存储)文本并存储术语位置以允许短语搜索。
"""
schema = Schema(title=TEXT(stored=True, analyzer=analyser), path=ID(stored=True),
content=TEXT(analyzer=analyser)) # 创建索引结构
ix = create_in("test", schema=schema, indexname='test') # test为索引创建的地址,indexname为索引名称
writer = ix.writer()
"""
此处建立了一个索引,其根目录为test,test有两个子目录a、b
a中包含c目录和名为name1的txt文件,c目录下包含名为name2的txt文件
b中包含了name.txt文件
其余为索引生成文件
"""
# 读取文件内容
name = open("test/b/name.txt", "r+", encoding="utf-8").read()
name1 = open("test/a/name1.txt", "r+", encoding="utf-8").read()
name2 = open("test/a/c/name2.txt", "r+", encoding="utf-8").read()
# 将文件信息添加到索引中,共添加了5条信息
writer.add_document(title=u"First document", path=u"/a",
content=u"This is the first document we've added!")
writer.add_document(title=u"Second document", path=u"/b",
content=u"The second one is even more interesting!") # 此处为添加的内容
writer.add_document(title=u"Third document", path=u"/b",
content=name)
writer.add_document(title=u"Fourth document", path=u"/a",
content=name1)
writer.add_document(title=u"Fifth document", path=u"/a/c",
content=name2)
print("建立完成一个索引")
writer.commit()
"""--------------------以上为建立索引的过程----------------------"""
new_list = [] # 存储检索结果
index = open_dir("test", indexname='test') # 读取建立好的索引
# 查询语句结构
with index.searcher() as searcher:
parser = QueryParser("content", index.schema) # 生成查询字段的对象
find = input("请输入检索内容:") # find表示要查询的内容
myquery = parser.parse(find) # 在content字段查询
results = searcher.search(myquery, limit=None) # limit为搜索结果的限制,默认为10
print("检索结果:")
for result1 in results:
print(dict(result1)) # 打印查询结果
new_list.append(dict(result1))
if not new_list:
print("没有此内容!")
关于Whoosh的使用可参考:https://pypi.org/project/Whoosh/,程序源码中使用的文件可由自己任意创建。
四、样例结果
检索关键字:天气
path:文档所在路径(这里的路径为相对路径)