需求:在搜索框输入关键字后,提供相关的搜索结果。
- 模糊查询关键字实现
- 关键字的效率极低
- 查询需要在多个字段中进行,使用关键字也不方便
- 在指定的任意字段中进行检索查询
- 需要配合搜索引擎来实现
- 搜索引擎进行全文检索时,会对数据库中的数据进行一遍预处理,单独建立起一份索引结构数据。
- 索引结构数据类似新华字典的索引检索页,里面包含了关键词与词条的对应关系,并记录词条的位置。
- 搜索引擎进行全文检索时,将关键字在索引数据中进行快速对比查找,进而找到数据的真实存储位置
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
实现全文检索的搜索引擎,首选的是
- 用Java实现的,开源的搜索引擎
- 可以快速地储存、搜索和分析海量数据。维基百科、StackOverflow、Github 等都采用它。
- Elasticsearch 的底层是开源库 Lucene。但是,没法直接使用 Lucene,必须自己写代码去调用它的接口。
- 将elasticsearch镜像配置压缩包(跟镜像里面elasticsearch配置文件一样)解压的目录拷贝到home目录
- 修改 文件:更改ip为本机真实的ip地址
sudo docker run -dti --name=elasticsearch --network=host -v /home/elasticsearch-2.4.6/config:/usr/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
的底层是开源库 ,但没法直接使用,必须自己写代码去调用它的接口
思考:如何对接服务端?
- Haystack 是在 Django 中对接搜索引擎的框架,搭建了用户和搜索引擎之间的沟通桥梁。
- Haystack 可以在不修改代码的情况下使用不同的搜索后端(比如 Elasticsearch、Whoosh、Solr等等)。
在配置文件中配置 Haystack 为搜索引擎后端
说明: 配置项保证了在 Django 运行起来后,有新的数据产生时,Haystack 仍然可以让 Elasticsearch 实时生成新数据的索引
通过创建索引类,来指明让搜索引擎对哪些字段建立索引,也就是可以通过哪些字段的关键字来检索数据。
本项目中对 SKU 信息进行全文检索,所以在goods 应用中新建 search_indexes.py 文件,用于存放索引类。
索引类 说明:
- 在 建立的字段,都可以借助 Haystack 由 Elasticsearch 搜索引擎查询。
- 其中 字段我们声明为 ,表名该字段是主要进行关键字查询的字段。
- 字段的索引值可以由多个数据库模型类字段组成,具体由哪些模型类字段组成,我们用 表示后续通过模板来指明。
- 在 目录中创建字段使用的模板文件
- 具体在 文件中定义
{{ object.name }}
{{ object.caption }}
模板文件说明:当将关键词通过参数名传递时,此模板指明 SKU的、、作为的索引值来进行关键字索引查询。
在命令行中添加如下命令, 来手动生成索引表:
python manage.py rebuild_index
设置每页返回数据条数
前序步骤与上述类似
……
通过创建索引类,来指明让搜索引擎对哪些字段建立索引,也就是可以通过哪些字段的关键字来检索数据。
本项目中对 模型类中的信息进行全文检索,所以在 子应用 应用中新建 search_indexes.py 文件,用于存放索引类。
templates/search/indexes/Headlines/article_text.txt 文件中定义
{{ object.id }}
{{ object.title }}
{{ object.channel }}
{{ object.labels }}
{{ object.content }}
模板文件说明:当将关键词通过text参数名传递时此模板指明 Article 的id、title、channel、labels和content作为text字段的索引值来进行关键字索引查询。