python 全文检索引擎详解


Posted in Python onApril 25, 2017

python 全文检索引擎详解

最近一直在探索着如何用Python实现像百度那样的关键词检索功能。说起关键词检索,我们会不由自主地联想到正则表达式。正则表达式是所有检索的基础,python中有个re类,是专门用于正则匹配。然而,光光是正则表达式是不能很好实现检索功能的。

python有一个whoosh包,是专门用于全文搜索引擎。

whoosh在国内使用的比较少,而它的性能还没有sphinx/coreseek成熟,不过不同于前者,这是一个纯python库,对python的爱好者更为方便使用。具体的代码如下

安装

输入命令行 pip install whoosh

需要导入的包有:

fromwhoosh.index import create_in

fromwhoosh.fields import *

fromwhoosh.analysis import RegexAnalyzer

fromwhoosh.analysis import Tokenizer,Token

中文分词解析器

class ChineseTokenizer(Tokenizer):
  """
  中文分词解析器
  """
  def __call__(self, value, positions=False, chars=False,
         keeporiginal=True, removestops=True, start_pos=0, start_char=0,
         mode='', **kwargs):
    assert isinstance(value, text_type), "%r is not unicode "% value
    t = Token(positions, chars, removestops=removestops, mode=mode, **kwargs)
    list_seg = jieba.cut_for_search(value)
    for w in list_seg:
      t.original = t.text = w
      t.boost = 0.5
      if positions:
        t.pos = start_pos + value.find(w)
      if chars:
        t.startchar = start_char + value.find(w)
        t.endchar = start_char + value.find(w) + len(w)
      yield t


def chinese_analyzer():
  return ChineseTokenizer()

构建索引的函数

@staticmethod
  def create_index(document_dir):
    analyzer = chinese_analyzer()
    schema = Schema(titel=TEXT(stored=True, analyzer=analyzer), path=ID(stored=True),
            content=TEXT(stored=True, analyzer=analyzer))
    ix = create_in("./", schema)
    writer = ix.writer()
    for parents, dirnames, filenames in os.walk(document_dir):
      for filename in filenames:
        title = filename.replace(".txt", "").decode('utf8')
        print title
        content = open(document_dir + '/' + filename, 'r').read().decode('utf-8')
        path = u"/b"
        writer.add_document(titel=title, path=path, content=content)
    writer.commit()

检索函数

@staticmethod
  def search(search_str):
    title_list = []
    print 'here'
    ix = open_dir("./")
    searcher = ix.searcher()
    print search_str,type(search_str)
    results = searcher.find("content", search_str)
    for hit in results:
      print hit['titel']
      print hit.score
      print hit.highlights("content", top=10)
      title_list.append(hit['titel'])
    print 'tt',title_list
    return title_list

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python实现的金山快盘的签到程序
Jan 17 Python
Python实现根据指定端口探测服务器/模块部署的方法
Aug 25 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
Python采用Django开发自己的博客系统
Sep 29 Python
使用django-crontab实现定时任务的示例
Feb 26 Python
python3实现表白神器
Apr 09 Python
python实现飞机大战小游戏
Nov 08 Python
wxPython+Matplotlib绘制折线图表
Nov 19 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
django在开发中取消外键约束的实现
May 20 Python
Python爬虫爬取微信朋友圈
Aug 06 Python
Elasticsearch 数据类型及管理
Apr 19 Python
window下eclipse安装python插件教程
Apr 24 #Python
Python处理PDF及生成多层PDF实例代码
Apr 24 #Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 #Python
python爬虫实战之爬取京东商城实例教程
Apr 24 #Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 #Python
Python面向对象特殊成员
Apr 24 #Python
Python解惑之整数比较详解
Apr 24 #Python
You might like
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
php单链表实现代码分享
2016/07/04 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
JavaScript中对象property的读取和写入方法介绍
2014/12/30 Javascript
JavaScript实现同时调用多个函数的方法
2015/11/09 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
vue封装swiper代码实例解析
2019/10/08 Javascript
python版飞机大战代码分享
2018/11/20 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
写求职信有什么意义
2014/02/17 职场文书
护士自我鉴定总结
2014/03/24 职场文书
企业安全生产责任书
2014/04/14 职场文书
感恩节活动策划方案
2014/05/16 职场文书
2014年教学工作总结
2014/11/13 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
通知的写法
2015/04/23 职场文书
医院保洁员管理制度
2015/08/05 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL
python四种出行路线规划的实现
2021/06/23 Python
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
Python语言内置数据类型
2022/02/24 Python