Django中使用Whoosh进行全文检索的方法


Posted in Python onMarch 31, 2019

Whoosh 是纯Python实现的全文搜索引擎,通过Whoosh可以很方便的给文档加上全文索引功能。

什么是全文检索

简单讲分为两块,一块是分词,一块是搜索。比如下面一段话:

上次舞蹈演出直接在上海路的弄堂里

比如我们现在想检索上次的演出,通常我们会直接搜索关键词: 上次演出 ,但是使用传统的SQL like 查询并不能命中上面的这段话,因为在 上次 和 演出 中间还有 舞蹈 。然而全文搜索却将上文切成一个个Token,类似:

上次/舞蹈/演出/直接/在/上海路/的/弄堂/里

切分成Token后做反向索引(inverted indexing),这样我们就可以通过关键字很快查询到了结果了。

解决分词问题

分词是个很有技术难度的活,比如上面的语句中一个难点就是到底是 上海路 还是 上海 呢?Python有个中文分词库: 结巴分词 ,我们可以通过结巴分词来完成索引中分词工作,结巴分词提供了Whoosh的组件可以直接集成,代码示例

遇到的问题

如果是在一些VPS上测试的时候非常慢的话可能是内存不足,比如512MB做一个博客索引非常慢,尝试升级到1GB后可以正常使用了。

代码

import logging
import os
import shutil
from django.conf import settings

from whoosh.fields import Schema, ID, TEXT, NUMERIC
from whoosh.index import create_in, open_dir
from whoosh.qparser import MultifieldParser
from jieba.analyse import ChineseAnalyzer

from .models import Article

log = logging.getLogger(__name__)

index_dir = os.path.join(settings.BASE_DIR, "whoosh_index")

indexer = open_dir(index_dir)


def articles_search(keyword):

  mp = MultifieldParser(
    ['content', 'title'], schema=indexer.schema, fieldboosts={'title': 5.0})
  query = mp.parse(keyword)

  with indexer.searcher() as searcher:
    results = searcher.search(query, limit=15)

    articles = []
    for hit in results:
      log.debug(hit)
      articles.append({
        'id': hit['id'],
        'slug': hit['slug'],
      })

  return articles


def rebuild():
  if os.path.exists(index_dir):
    shutil.rmtree(index_dir)
  os.makedirs(index_dir)

  analyzer = ChineseAnalyzer()
  schema = Schema(
    id=ID(stored=True, unique=True),
    slug=TEXT(stored=True),
    title=TEXT(),
    content=TEXT(analyzer=analyzer))
  indexer = create_in(index_dir, schema)

  __index_all_articles()


def __index_all_articles():
  writer = indexer.writer()
  published_articles = Article.objects.exclude(is_draft=True)
  for article in published_articles:
    writer.add_document(
      id=str(article.id),
      slug=article.slug,
      title=article.title,
      content=article.content,
    )
  writer.commit()


def article_update_index(article):
  '''
  updating an article to indexer, adding if not.
  '''
  writer = indexer.writer()
  writer.update_document(
    id=str(article.id),
    slug=article.slug,
    title=article.title,
    content=article.content,
  )

  writer.commit()


def article_delete_index(article):
  writer = indexer.writer()
  writer.delete_by_term('id', str(article.id))

  writer.commit()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现apahce网站日志分析示例
Apr 02 Python
python模块简介之有序字典(OrderedDict)
Dec 01 Python
Python函数式编程
Jul 20 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
在Python dataframe中出生日期转化为年龄的实现方法
Oct 20 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
Dec 12 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
Python用字典构建多级菜单功能
Jul 11 Python
python实现监控阿里云账户余额功能
Dec 16 Python
使用Tensorboard工具查看Loss损失率
Feb 15 Python
Numpy中ndim、shape、dtype、astype的用法详解
Jun 14 Python
Python 实现一个计时器
Jul 28 Python
Python实现的爬取小说爬虫功能示例
Mar 30 #Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 #Python
Python函数装饰器常见使用方法实例详解
Mar 30 #Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 #Python
Python函数的参数常见分类与用法实例详解
Mar 30 #Python
Python实现定时执行任务的三种方式简单示例
Mar 30 #Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 #Python
You might like
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
php 时间计算问题小结
2009/01/04 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
js图片放大镜效果实现方法详解
2020/10/28 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
python实现点对点聊天程序
2018/07/28 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
广告设计专业自荐信范文
2013/11/14 职场文书
监督检查工作方案
2014/05/28 职场文书
法人委托书范本
2014/09/15 职场文书
社区服务活动报告
2015/02/05 职场文书
个人工作年终总结
2015/03/09 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS
python turtle绘图命令及案例
2021/11/23 Python