Django-全文检索

全文检索的介绍
  • 全文检索
    • 全文检索的概念
      • 全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
      • 这个过程类似于通过字典中的检索字表查字的过程。全文检索的方法主要分为按字检索和按词检索两种。按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。
      • 对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。英文等西方文字由于按照空白切分词,因此实现上与按字处理类似。中文等东方文字则需要切分字词,以达到按词索引的目的,当前全文检索技术难点是中文全文检索技术。
        • 注意:
          • 全文检索技术和数据库模糊查询是不同的。模糊查询最差情况下可能会进行全表扫描,如果数据量比较大,那么效率很低。
    • 全文检索的一般过程
      • 全⽂文检索⼤大体分两个过程,索引创建(Indexing)和搜索索引(Search)。
        • 分词处理:将需要检录索引的内容,进行分词处理,提取一些特定语义的词语
        • 索引创建:将分词器分词的结果进行数据提取,创建索引的过程。
        • 搜索索引:就是得到⽤用户的查询请求,搜索创建的索引,然后返回结果的过程。
    • 应用到的工具
      • 分词器:将数据按照一定的规则进行分词处理,交给所有引擎进行索引的创建
      • 搜索引擎:对分词器递交的关键字进行索引的创建,在搜索关键字信息的时候根据索引搜索关键字
      • 框架:更简单的操作分词器和搜索引擎;
  • django的全文检索
    • haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎;
    • whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用;
    • jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品。
  • haystasck的原理
全文检索相关配置
  • 配置环境
    • 安装需要的软件包
        • 框架、搜索引擎、分词器
    • 安装haystack框架应用
    • 在setting中配置搜索引擎
        • 指定索引文件的创建位置后,要在对应的位置创建索引目录
    • 在上一步指定的目录下创建索引文件目录
    • 在项目同名目录下配置全文检索应用的url
  • 配置索引
    • 在想要创建索引的模型类对应的应用目录下创建search_indexes.py文件
      • text 字段的两个约束
        • document:  true表示会把查询数据放在text文本里面
        • use_template: True  表示在模板中会指定查询的索引内容
      • get_model函数:
        • 表示会根据哪个模型类进行索引的建立和查询
      • index_queryset函数:
        • 表示根据模型类的哪些对象来进行创建索引和进行查询
    • 在templates目录下创建"search/indexes/应用名/"目录,并创建创建索引的  模型类名_text,txt
    • 在目录中创建已经创建文件,指定根据模型类的哪些字段建立索引,例如"goodsinfo_text.txt"文件;
  • 分词器相关配置
    • 配置haystaic的默认分词器(找到虚拟环境目录下的haystack/backends/目录) 
      • 复制whoosh_backend.py文件,改为如下名称
        • whoosh_cn_backend.py
      • 在文件内修改两处
        • 引入中文分词器类
          • from jieba.analyse import ChineseAnalyzer
        • 更改词语分析类:
          • 查找
            analyzer=StemmingAnalyzer()
            改为
            analyzer=ChineseAnalyzer()
      • 备注:
        • 因为我们使用了jieba中文分词器,所以要将原haystack框架默认使用的分词器替换成我们的中文分词器
  • 建立索引
    • 初始化索引
      • python manage.py rebuild_index
    • 索引生成后目录结构如下图:
使用全文检索
  • 创建输入框
    • 配置应用的view函数
    • 配置应用url
    • 在templates的应用目录下创建query.html文件
      • 我们要表单提交给,haystack视图接收的表单数据:
        • q :       表示搜索关键字,传递到模板中的数据为query
        • page:    表示请求第几页的page对象
        • url:      请求haystack应用的url为/search/?q=' '&page= n
          • 表示请求q关键字,返回第n页的页面对象,不写page表示请求第一页
        • form表单的 action属l必须写search,在前面已经配置好了
  • haystack视图渲染模板(将数据进行处理渲染到模板)
    • 自定义搜索结果模板:在templates/search/目录下创建search.html
      • 搜索结果进行分页,视图向模板中传递的上下文如下:
        • query:搜索关键字
        • page:当前页的page对象
        • paginator:分页paginator对象
      • 注意:
        • 在search.html的模板中获取模型类实例对象
          • 遍历page对象   : 获取page对象的每一个singgle
          • singgle.object : 获取实例对象
        • 配置每页显示的对象数量
          • 配置haystack包下的setting文件
结果

刘小恺(Kyle) wechat
如有疑问可联系博主