【Django 天天生鲜项目04】搜索(搜索引擎、分词包的使用)、购物车

关键:全文检索框架搜索引擎分词包、Ajax请求的使用...

仅作为个人笔记!

目录

1.搜索

1.1. haystack框架和whoosh引擎安装

1.2.索引文件的生成

1.3.全文检索的使用

1.4.更改分词方式 

2.购物车

2.3.购物车前端Ajax请求


 

1.搜索

在首页、详情页和列表页中,都有搜索框,如何实现搜索呢?

关键:全文检索框架搜索引擎、分词包的使用、

 

全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理。

 

搜索引擎:可以对表中的某些字段进行关键词分析,建立关键词对应的索引数据;

全文检索框架:帮助用户使用搜索引擎;

本处使用 haystack框架 和 whoosh引擎 。

 

1.1. haystack框架和whoosh引擎安装

  • haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎,点击查看官方网站
  • whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用,点击查看whoosh文档
  • jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品。

 

(1)在虚拟环境中依次安装需要的包

pip install django-haystack
pip install whoosh
pip install jieba

(2)在settings.py文件中注册应用haystack,并做配置

# 注册
INSTALLED_APPS = (
    ...
    'haystack',
)

...
# 全文检索框架配置
HAYSTACK_CONNECTIONS = {
    'default': {
        # 使用whoosh引擎(配置路径)
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        # 'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',  # 配置好jieba中文分词包后用这个
        # 设置索引文件生成的路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}

# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 指定搜索结果每页显示的条数
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 2

 

1.2.索引文件的生成

要搜索商品表中的数据,就需要搜索引擎根据表的某些字段来建立关键词对应的索引数据。然后才能让搜索引擎来搜索对应的数据。

根据模型类(如:GoodsSKU)的表的数据生成索引的数据。

  • 根据模型类新建索引类

    在goods应用目录下新建一个search_indexes.py文件(文件名固定),在其中定义一个商品索引类。
    from haystack import indexes
    # 导入你的模型类
    from goods.models import GoodsSKU
    
    
    # 指定对于某个类的某些数据建立索引
    # 建议的索引类名格式:模型类名+Index
    class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
        # 索引字段 use_template=True:指定根据表中的哪些字段建立索引文件,这个'指定说明'放在一个文件中
        text = indexes.CharField(document=True, use_template=True)
    
        def get_model(self):
            # 返回你的模型类
            return GoodsSKU
    
        # 建立索引的数据
        def index_queryset(self, using=None):
            return self.get_model().objects.all()

     

  • 在文件中,指定根据表中的哪些字段建立索引文件 

    templates下面新建目录 search/indexes/模型类所在的应用名 (如:search/indexes/goods),在此目录下面新建一个文件 模型类名小写_text.txt(如:goodssku_text.txt)并编辑内容如下:
    # 指定根据表中的哪些字段建立索引数据
    {
        { object.name }} # 根据商品的名称建立索引
    {
        { object.desc }} # 根据商品的简介建立索引
    {
        { object.goods.detail }} # 根据商品的详情建立索引

     

  • 使用命令生成索引文件。

    在虚拟环境中,cd到项目的路径,执行
    python manage.py rebuild_index

    就会按照配置,生成目录whoosh_index,并在目录下生成索引数据。

 

1.3.全文检索的使用

(1)搜索框的前端,点击进行提交时,会通过 haystack 搜索数据。

            <form method="get" action="/search">
                <input type="text" class="input_text fl" name="q" placeholder="搜索商品">
                <input type="submit" class="input_btn fr" name="" value="搜索">
            </form>

(2)action提交后的处理应该让搜索引擎来完成,会通过 haystack 搜索数据,故在项目的url中配置。注意提交的地址应该和配置的url一致。

urlpatterns = [
   ... 
    path('search', include('haystack.urls')),  # 全文检索框架
]

(3)全文检索结果。

搜索出结果后,haystack会把搜索出的结果传递给templates/search目录下的search.html(没有这个文件可以先自己建),传递的上下文包括:

  • query:搜索关键字
  • page:当前页的page对象 –>遍历page对象,获取到的是SearchResult类的实例对象,对象的属性object才是模型类的对象。
  • paginator:分页paginator对象

通过HAYSTACK_SEARCH_RESULTS_PER_PAGE 可以控制每页显示数量。

以下可以快速的查看搜索结果:

......
<body>
搜索的关键字:{
  { query }}<br/>
当前页的Page对象:{
  { page }}<br/>
<ul>
    {% for item in page %}
        <li>{
  { item.object }}</li>
    {% endfor %}
</ul>
分页paginator对象:{
  { paginator }}<br/>
</body>
...

浏览器显示结果
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值