全文检索的介绍
- 全文检索
- 全文检索的概念
- 全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
- 这个过程类似于通过字典中的检索字表查字的过程。全文检索的方法主要分为按字检索和按词检索两种。按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。
- 对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。英文等西方文字由于按照空白切分词,因此实现上与按字处理类似。中文等东方文字则需要切分字词,以达到按词索引的目的,当前全文检索技术难点是中文全文检索技术。
- 注意:
- 全文检索技术和数据库模糊查询是不同的。模糊查询最差情况下可能会进行全表扫描,如果数据量比较大,那么效率很低。
- 全文检索的一般过程
- 全⽂文检索⼤大体分两个过程,索引创建(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文件
结果