Whoosh搜索引擎

whoosh 是一个纯python实现的全文搜索引擎,它小巧轻便,安装简单,设计上参考了 Lucene ,性能上虽有欠缺,但贵在方便,无需复杂安装,对于构建小型网站的搜索引擎来说,是一个不错的选择。

1. 快速入门

whoosh 可以使用pip进行安装

pip install whoosh

现在通过官网的例子,快速体验

from whoosh.index import create_in

from whoosh.fields import *

# 构建索引

schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT)

ix = create_in("indexdir", schema)

writer = ix.writer()

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.commit()

# 搜索

from whoosh.qparser import QueryParser

with ix.searcher() as searcher:

query = QueryParser("content", ix.schema).parse("first")

results = searcher.search(query)

print(results[0])

程序最终输出结果为

官网上的例子,我没有做任何修改,只是添加了两行注释。整个程序分为两部分,第一部分是构建索引的过程,第二部分是搜索的过程。

2. 构建索引

2.1 倒排索引

搜索引擎的关键技术是建立倒排索引,倒排索引记录了哪些文档中包含了某个单词,比如 “酷python” 这个词出现在了你正在看的这篇文章中,假设这篇文章的编号是111, 那么索引中就会记录一条 酷python:111的记录。当你搜索 酷python 这个词的时候,搜索引擎从倒排索引中找到 酷python所对应的文档,如果有多个,搜索引擎则计算文档与搜索词的相关性,并根据相关性进行排序返回给你结果。

2.2 分词

我们在搜索时,所搜索的关键词可能是一个句子,文档里那么多内容,但索引只记录词与文档编号之间的映射关系,因此,不论是构建索引还是根据关键词进行搜索,都得进行分词。对于英语文档,分词是一件简单的事情,因为英语的句子是由若干个单次组成的。而中文的分词则相对复杂,因为我们的词是由单个汉字组成的,而词与词之间是没有空格这种明显的分界的,具体哪几个汉字组成一个词,要看所处的语境,比如 “ 军任命了一名中将 ”, 这里中将就是一个词,但在句子“ 产量三年中将增长两倍 ”, 中将 就不再是一个词。

但你大可不必担心,因为现在的中文分词技术已经非常成熟了,开源库jieba可以满足你绝大部分需求。

2.3 索引模式

现在要为100篇文章构建索引,一篇文章的信息可能包括 文章标题,内容,作者,在构建索引的时候,你需要定义索引模式,就如同定义一张mysql里的表,你需要指出需要存储哪些字段,以及这些字段的类型

from whoosh.fields import TEXT, SchemaClass

from jieba.analyse import ChineseAnalyzer

analyzer = ChineseAnalyzer()

class ArticleSchema(SchemaClass):

title = TEXT(stored=True, analyzer=analyzer)

content = TEXT(stored=True, analyzer=analyzer)

author = TEXT(stored=True, analyzer=analyzer)

与官网中的例子不同,我通过继承SchemaClass 来实现一个新的类,以此定义索引模式。而且我设置了analyzer 为ChineseAnalyzer, 这样whoosh就可以支持中文索引了,analyzer会对文档中的中文进行分词。

2.4 添加文档

schema = ArticleSchema()

ix = create_in("indexdir", schema, indexname='article_index')

writer = ix.writer()

writer.add_document(title="登鹳雀楼", author="王之涣",content="白日依山尽,黄河入海流,欲穷千里目,更上一层楼")

writer.add_document(title="登高", author="杜甫", content="风急天高猿啸哀,渚清沙白鸟飞回")

writer.add_document(title="胡乱写的", author="黄河恋", content="展示效果")

writer.commit()

create_in 会创建一个名为indexdir 的文件夹,添加文档时,一定要根据你所定义的索引模式进行添加,这样就创建好了索引,添加文档的过程,就如同向mysql的表里写入数据。

3. 搜索

搜索的过程,需要使用open_dir函数打开索引文件,创建Searcher 对象

from whoosh.qparser import QueryParser

from whoosh.index import open_dir

ix = open_dir("indexdir", indexname='article_index')

with ix.searcher() as searcher:

query = QueryParser("content", ix.schema).parse("黄河")

results = searcher.search(query)

print(results[0])

程序输出结果

3.1 高亮显示

我们在百度搜索引擎搜索关键词所得到的结果,那些与关键词匹配的部分会被高亮显示,这样方便用户查看内容,这个功能,whoosh同样支持

with ix.searcher() as searcher:

query = QueryParser("content", ix.schema).parse("黄河")

results = searcher.search(query)

data = results[0]

text = data.highlights("content")

print(text)

程序输出结果为

白日依山尽,黄河入海流,欲穷千里目

在html文件中,你可以自己来定义match 和 term0 的样式。

3.2 多个字段同时搜索

对多个字段同时搜索,需要使用MultifieldParser

from whoosh.qparser import QueryParser, MultifieldParser

from whoosh.index import open_dir

ix = open_dir("indexdir", indexname='article_index')

with ix.searcher() as searcher:

query = MultifieldParser(["content", 'author'], ix.schema).parse("黄河")

results = searcher.search(query)

for data in results:

print(data)

content中有黄河,或者author有黄河的文档,都可以被搜索出来,程序输出结果

3.3 多个关键词同时搜索

如果你所搜索的内容并不仅仅是一个关键词,而是多个,或者你搜索的是一个句子,搜索引擎会把你的句子进行分词,得到若干个词,这些词作为条件进行搜索,只有被搜索的字段同时满足这些关键词时,才能得到搜索结果,比如下面的搜索

query = MultifieldParser(["content", 'author'], ix.schema).parse("黄河 杜甫")

这个搜索条件不会得到任何结果,原因在于搜索条件等价于

((content:黄河 OR author:黄河) AND (content:杜甫 OR author:杜甫))

被搜索的字段中,比如同时包含黄河与杜甫。如果你希望这些关键词之间是或的关系,那么需要你自己来构建搜索条件

from whoosh.qparser import QueryParser, MultifieldParser

from whoosh.index import open_dir

from whoosh.query import compound, Term

ix = open_dir("indexdir", indexname='article_index')

with ix.searcher() as searcher:

author_query = [Term('author', '黄河'), Term('author', '杜甫')]

content_query = [Term('content', '黄河'), Term('content', '杜甫')]

query = compound.Or([compound.Or(author_query), compound.Or(content_query)])

print(query)

results = searcher.search(query)

for data in results:

print(data)

三个文档都会被搜索到, 如果你搜索的是一个句子,那么你可以使用analyzer 对整个句子进行分词,然后构造搜索条件,我所说的analyzer就是 analyzer = ChineseAnalyzer() 语句创建的对象。

3.4 分页搜索

如果搜索结果太多,那么你需要分页查询

results = searcher.search_page(query, 1) # 搜索第1页,默认每页10个结果

print(results.total) # 搜索到的文档总量,帮助你进行分页

你获取的是第一页的搜索结果,但results.total 会告诉你搜索结果一共有多少条,这样,你就知道该搜索多少页的数据了。

whoosh mysql_Whoosh搜索引擎相关推荐

  1. scrapy+jieba+whoosh实现搜索引擎

    开始 学校小学期开了一门信息检索的课,结果碰到了大作业是实现垂直领域的搜索引擎,其中我们是要用网页展示的(当然了也可以用命令行,只是扣一点分). 自己在csdn和github上收集了很多资料,但是好多 ...

  2. whoosh mysql_Whoosh例子

    Whoosh的分词是基于正则表达式的,所以只需要写出合适的正则表达式就可以正确分词. 当然,因为Whoosh是纯python的,你要重新实现分词模块或是使用第三方分词模块都是很容易的. 下面是一些例子 ...

  3. Python pandas数据计数函数value_counts

    value_counts介绍 value_counts是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中个数,类似Excel里面的count函数 其是pandas下面的顶层函数, ...

  4. 网易云音乐搜索引擎 python+whoosh---(1)背景和环境介绍

    最近做<互联网信息搜索与挖掘>的课程作业,作业要求是做一个网易云音乐搜索引擎. 基本要求是: 1,[自由搜索]输入歌曲名称可以返回一系列排序后的歌曲,搜索歌手会根据热门度或其他条件返回一系 ...

  5. django+django-haystack+Whoosh(后期切换引擎为Elasticsearch+ik)+Jieba+mysql

    1.前提准备 环境介绍 haystack是django的开源搜索框架,该框架支持Solr, Elasticsearch, Whoosh, *Xapian*搜索引擎,不用更改代码,直接切换引擎,减少代码 ...

  6. django+whoosh

    前几天要用Django-haystack来实现搜索功能,网上一搜中文资源少之又少,虽说有官方文档,但相信对于我们这些英语差的同学来说要看懂真的是一件难事.特别是关于高级部分,特地找了个英语专业的来翻译 ...

  7. haystack全文检索框架

    Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...

  8. python美多商城项目百度网盘_美多商城项目(七)

    正文共: 7620字 4图 预计阅读时间: 20分钟 每日分享 If you can change your mind, you can change your life. 如果你愿意改变你的想法,你 ...

  9. Haystack全文搜索

    Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...

最新文章

  1. 【Qt】错误GL/gl.h: No such file or directory的解决方法(以及cannot find -lGL解决方法)
  2. 人民币升值与美元贬值
  3. 数组、结构体和共用体的长度计算?
  4. JAVA Swing 组件演示***
  5. 现代数字影视 电影使用标准
  6. nlp cs224n 学习笔记1 Introduction and Word Vectors
  7. 使用ArcGIS Engine来实现地图的点击查询并闪烁
  8. wamp的卸载、安装与配置apache配置伪静态
  9. confirm修改按钮文字_条码设计软件如何调整条形码与条码文字之间的距离
  10. windows下用XShell远程ubuntu时连接失败
  11. solidity合约详解
  12. Servlet的学习之web路径问题
  13. Nginx实用教程(二):配置文件入门
  14. 《推荐系统学习(二)》PCA降维方法的数学推导
  15. Spark取出(Key,Value)型数据中Value值为前n条数据
  16. mybatis报错:Could not find resource mapper/UserMapper.xml
  17. 千万别和女程序员做同事!
  18. mac android 录屏软件,mac录屏怎么录内置声音?详细的解决方案
  19. centos彻底删除文件夹、文件命令
  20. 使用Flexible.js实现手机端网页内容适配(rem适配法)

热门文章

  1. java两个return_java怎么return两个值
  2. cocoapods插件安装目录
  3. 爱丽丝的发丝──《爱丽丝惊魂记:疯狂再临》制作点滴
  4. 国内第一家出版社诉百度侵权已立案
  5. 【JS与JQ】原生JS(clientTop/clientLeft,offsetTop/offsetLeft,scrollTop/scrollLeft)
  6. mht文件的3dus-ascii编码转换
  7. html中报表视图插件,报表控件ActiveReports中全新的WebViewer组件
  8. Cursor设置中文版
  9. Windows 10 Enterprise 2015 LTSB 2019_基于Linux的Windows非常有意义
  10. [英语阅读]韩电视台曝光奥运开幕式遭谴责