资讯专栏INFORMATION COLUMN

Python轻量级搜索工具Whoosh怎么使用?具体代码如下

89542767 / 288人阅读


  在Python当中,有一个轻量级的搜索工具,在日常使用的时候,用途还是比较广的,这个工具就是Whoosh。那么,这个工具需要怎么进行使用呢?具体的代码内容有哪些呢?下面就给大家进行详细的解答。


  Whoosh简介


  Whoosh由Matt Chaput创建,它一开始是一个为Houdini 3D动画软件包的在线文档提供简单、快速的搜索服务工具,随着时代的发展,它慢慢的演变成了一个成熟的搜索工具,为了满足更多人的需求,将它逐渐变成了一个开源的工具。


  Whoosh纯由Python编写而成,使用起来比较简单灵活,另外现在同时支持Python第二代,第三代,那么它的优点有哪些呢:


  1、Whoosh纯由Python代码写成的,安装速度比较的快,安装简单,只需要Python环境即可,不需要编译器;


  2、默认使用Okapi BM25F排序算法,也支持其他排序算法;


  3、相比于其他搜索引擎,Whoosh会创建更小的index文件;


  4、Whoosh中的index文件编码必须是unicode;


  5、Whoosh可以储存任意的Python对象。


  Whoosh的官方介绍网站为:https://whoosh.readthedocs.io/en/latest/intro.html。相比于ElasticSearch或者Solr等成熟的搜索引擎工具,Whoosh显得更轻便,操作更简单,可以考虑在小型的搜索项目中使用。


  Index&query


  对于熟悉ES的人来说,搜索的两个重要的方面为mapping和query,也就是索引的构建以及查询,背后是复杂的索引储存、query解析以及排序算法等。如果你有ES方面的经验,那么,对于Whoosh是十分容易上手的。


  按照笔者的理解以及Whoosh的官方文档,Whoosh的入门使用主要是index以及query。搜索引擎的强大功能之一在于它能够提供全文检索,这依赖于排序算法,比如BM25,也依赖于我们怎样储存字段。因此,index作为名词时,是指字段的索引,index作为动词时,是指建立字段的索引。而query会将我们需要查询的语句,通过排序算法,给出合理的搜索结果。


  关于Whoosh的使用,在官文文档中已经给出了详细的说明,笔者在这里只给出一个简单的例子,来说明Whoosh如何能方便地提升我们的搜索体验。


      实例代码


数据

本项目的示例数据为poem.csv,下图为该数据集的前十行:

0.jpg


字段

根据数据集的特征,我们创建四个字段(fields):title,dynasty,poet,content。创建的代码如下:

    #-*-coding:utf-8-*-

  import os

  from whoosh.index import create_in

  from whoosh.fields import*

  from jieba.analyse import ChineseAnalyzer

  import json

  #创建schema,stored为True表示能够被检索

  schema=Schema(title=TEXT(stored=True,analyzer=ChineseAnalyzer()),

  dynasty=ID(stored=True),

  poet=ID(stored=True),

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

  )

  其中,ID只能为一个单元值,不能分割为若干个词,常用于文件路径、URL、日期、分类;


  TEXT文件的文本内容,建立文本的索引并存储,支持词汇搜索;Analyzer选择结巴中文分词器。

创建索引文件

接着,我们需要创建索引文件。我们利用程序先解析poem.csv文件,并将它转化为index,写入到indexdir目录下。Python代码如下:

  #解析poem.csv文件

  with open('poem.csv','r',encoding='utf-8')as f:

  texts=[_.strip().split(',')for _ in f.readlines()if len(_.strip().split(','))==4]

  #存储schema信息至indexdir目录

  indexdir='indexdir/'

  if not os.path.exists(indexdir):

  os.mkdir(indexdir)

  ix=create_in(indexdir,schema)

  #按照schema定义信息,增加需要建立索引的文档

  writer=ix.writer()

  for i in range(1,len(texts)):

  title,dynasty,poet,content=texts<i>

  writer.add_document(title=title,dynasty=dynasty,poet=poet,content=content)

  writer.commit()

 index创建成功后,我们就利用进行查询。

   比如我们想要查询content中含有明月的诗句,可以输入以下代码:

 #创建一个检索器

  searcher=ix.searcher()

  #检索content中出现'明月'的文档

  results=searcher.find("content","明月")

  print('一共发现%d份文档。'%len(results))

  for i in range(min(10,len(results))):

  print(json.dumps(results<i>.fields(),ensure_ascii=False))

  输出结果如下:

  一共发现44份文档。

  前10份文档如下:

  {"content":"床前明月光,疑是地上霜。举头望明月,低头思故乡。","dynasty":"唐代","poet":"李白","title":"静夜思"}

  {"content":"边草,边草,边草尽来兵老。山南山北雪晴,千里万里月明。明月,明月,胡笳一声愁绝。","dynasty":"唐代","poet":"戴叔伦","title":"调笑令·边草"}

  {"content":"独坐幽篁里,弹琴复长啸。深林人不知,明月来相照。","dynasty":"唐代","poet":"王维","title":"竹里馆"}

  {"content":"汉江明月照归人,万里秋风一叶身。休把客衣轻浣濯,此中犹有帝京尘。","dynasty":"明代","poet":"边贡","title":"重赠吴国宾"}

  {"content":"秦时明月汉时关,万里长征人未还。但使龙城飞将在,不教胡马度阴山。","dynasty":"唐代","poet":"王昌龄","title":"出塞二首·其一"}

  {"content":"京口瓜洲一水间,钟山只隔数重山。春风又绿江南岸,明月何时照我还?","dynasty":"宋代","poet":"王安石","title":"泊船瓜洲"}

  {"content":"四顾山光接水光,凭栏十里芰荷香。清风明月无人管,并作南楼一味凉。","dynasty":"宋代","poet":"黄庭坚","title":"鄂州南楼书事"}

  {"content":"青山隐隐水迢迢,秋尽江南草未凋。二十四桥明月夜,玉人何处教吹箫?","dynasty":"唐代","poet":"杜牧","title":"寄扬州韩绰判官"}

  {"content":"露气寒光集,微阳下楚丘。猿啼洞庭树,人在木兰舟。广泽生明月,苍山夹乱流。云中君不见,竟夕自悲秋。","dynasty":"唐代","poet":"马戴","title":"楚江怀古三首·其一"}

  {"content":"海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,还寝梦佳期。","dynasty":"唐代","poet":"张九龄","title":"望月怀远/望月怀古"}

   综上所述,关于Python使用工具,Whoosh介绍就给大家介绍到这里了,希望可以为各位读者带来帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/127588.html

相关文章

  • Django添加全文搜索功能入门篇

    摘要:转载说明来源添加全文搜索功能入门一使用的工具是的开源搜索框架,该框架支持搜索引擎,不用更改代码,直接切换引擎,减少代码量。修改如下添加修改为如下第二步在中修改引擎,如下第三步重建索引,在进行搜索中文试试吧。 感觉网络上关于Django全文搜索的中文文章太少,并且讲的也不是很到位,就是简单介绍了怎么配置,并没有说这样配置有什么用,所以依然很迷茫。所以希望我这篇文章能够帮助到后来人。 转...

    lookSomeone 评论0 收藏0
  • 使用haystack实现django全文检索搜索引擎功能

    摘要:搜索引擎使用,是一个纯实现的全文搜索引擎,小巧简单。中文搜索需要进行中文分词,使用。高亮部分的源码位于和文件中,可复制进行修改,实现自定义高亮功能。 前言 django是python语言的一个web框架,功能强大。配合一些插件可为web网站很方便地添加搜索功能。 搜索引擎使用whoosh,是一个纯python实现的全文搜索引擎,小巧简单。 中文搜索需要进行中文分词,使用jieba。 直...

    wh469012917 评论0 收藏0
  • 基于whoosh实现的flask全文搜索插件

    摘要:貌似很少全文搜索的插件有一个但试了几次都用不了所以参考自己写了一个插件基于纯编写使用上很简单创建更新删除索引如果要对已存在的数据创建索引全部创建更新删除如果只想要为指定的表创建索引自定义比如使用的中文分词项目地址演示 flask 貌似很少全文搜索的插件,有一个 Flask-WhooshAlchemy , 但试了几次都用不了,所以参考 Flask-WhooshAlchemy 自己写了一个...

    Jason_Geng 评论0 收藏0
  • Django ElasticSearch Ionic 打造 GIS 移动应用 —— 架构设计

    摘要:采用了的软件设计模式,即模型,视图和控制器。并于年月在许可证下发布。这套框架是以比利时的吉普赛爵士吉他手来命名的。在中被普遍使用,甚至包括配置文件和数据模型。提供了一个免费且开源的移动优化,和组件库,来构建高交互性应用。基于构建和优化。 搜索引擎是个好东西,GIS也是个好东西。当前还有Django和Ionic。最后效果图 showImg(http://www.phodal.com/s...

    tianyu 评论0 收藏0
  • Django ElasticSearch Ionic 打造 GIS 移动应用 —— 架构设计

    摘要:采用了的软件设计模式,即模型,视图和控制器。并于年月在许可证下发布。这套框架是以比利时的吉普赛爵士吉他手来命名的。在中被普遍使用,甚至包括配置文件和数据模型。提供了一个免费且开源的移动优化,和组件库,来构建高交互性应用。基于构建和优化。 搜索引擎是个好东西,GIS也是个好东西。当前还有Django和Ionic。最后效果图 showImg(http://www.phodal.com/s...

    weapon 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<