【DailyFresh】课程记录3--商品搜索相关(1)

搜索时如果是原生SQL语句:

模糊查询:select * from df_goods_sku where name like ‘%草莓%’ or desc like ‘%草莓%’

开发时不用like,它的查效率很低

百度:维护着关键字对应的信息

搜索引擎:

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

对某些字段内容进行关键词分析,将其分解成对应的关键词,并建立关键词对应的索引数据

好吃

草莓:sku_id1 sku_id2 sku_id5

字典

全文检索框架:

可以帮助用户使用搜索引擎

配合全文检索框架使用whoosh引擎,帮助用户搜索数据

P67 商品搜索-全文检索框架和引擎的安装和配置

全文检索框架:haystack

搜索引擎:whoosh

pip3 install django-haystack

pip3 install whoosh

在settings.py中的INSTALLED_APPS:注册全文检索框架haystack

配置haystack和whoosh:

# 全文检索框架的配置

HAYSTACK_CONNECTIONS = {

‘default’: {

使用whoosh引擎

‘ENGINE’: ‘haystack.backends.whoosh_backend.WhooshEngine’,

索引文件路径

‘PATH’: os.path.join(BASE_DIR, ‘whoosh_index’),

}

}

# 当添加、修改、删除数据时,自动生成索引

HAYSTACK_SIGNAL_PROCESSOR = ‘haystack.signals.RealtimeSignalProcessor’

配置实际上在django-haystack包中

cd xxxx/venv/lib/python3.x/site-packages/

cd haystack/

cd backends/

其中的ChineseAnalyzer.py和whoosh_cn_backend.py原始安装完是没有的

原始配置应该是:

haystack.backends.whoosh_backend.WhooshEngine

P68 商品搜索-生成索引文件

最终是要根据GoodsSKU类对应表中的数据生成索引数据

1. 新建一个GoodsSKU类对应的索引类,在apps.goods下方,即模型类所在的应用新建文件search_indexes.py

2. 在文件search_indexes.py中定义索引类

# 定义索引类

from haystack import indexs

# 导入你的模型类

from goods.models import GoodsSKU

# 指定对于某个类的某些数据建立索引

# 索引类名格式: 模型类名+Index

class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):

索引字段

document=True说明text为索引字段

建立GoodsSKU类对应的表中的数据的索引信息 use_template指定根据表中的哪些字段建立索引文件,把说明放在一个文件中

text = indexes.CharField(document=True, use_template=True)

def get_model(self):

返回你的模型类

return GoodsSKU

建立索引的数据

该方法最终返回哪些内容,就会对哪些内容建立索引

self.get_model()返回的是GoodsSKU,self.get_model().objects.all()则表示查询该表中的所有数据,因此对该表中的所有数据建立索引

def index_queryset(self, using=None)

return self.get_model().objects.all()

总结三点

1.导入模型类

2.索引类名格式:模型类名+Index

3.get_model中返回你的模型类

use_template指定根据表中的哪些字段建立索引文件,把说明放在一个文件中

文件格式:

在templates中创建search/indexes/你的模型类所在app/模型类名小写_text.txt

templates/search/indexes/goods/goodssku_text.txt

# 在该文件中指定根据表中的哪些字段建立索引数据

{{ object.模型类的属性 }}

{{  }}

{{ object.name }} # 根据商品的名称建立索引

{{ object.desc }} # 根据商品的简介建立索引

# 根据商品的详情建立索引

{{ object.goods.detail }} # 根据商品的详情建立索引

接下来生成索引数据:

进入自己的项目,通过manage.py生成索引数据

python3 manage.py rebuild_index

P69 商品搜索-全文检索的使用

有了索引文件之后可以借助全文检索引擎帮助我们搜索数据

找到base.html中的搜索部分,将其放入一个表单中,其中的method="get"和name="q"固定,其余不固定

此时点击之后会访问该地址/search,该地址对应的处理, 我们的目的是借助搜索引擎,因此我们需要去配置该地址,将其匹配完之后对应的处理应该交给搜索引擎去做

配置地址:

path(‘search/’, include(‘haystack.urls’)) # 全文检索框架

我们点击搜索之后访问/search地址,最终匹配之后的处理过程就不用管了,此时请求已经交给haystack。

全文检索结果:

搜索出结果后,haystack会把搜索出的结果传递给template/search目录下的search.html,传递的上下文包括:

query: 搜索关键字

page: 当前页的page对象—》遍历page对象,获取到的是SearchResult类的实例对象,对象的属性object才是模型类的对象。

paginator:分页paginator对象

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

在templates/search目录下创建一个search.html

query: 搜索关键字

page: 当前页的page对象—在搜索完之后,它在传递数据时会对搜索的结果进行分页,然后会把当前页的page对象传过来,这里的page对象和之前的page对象是一样的,所以可以遍历page对象获取里面的数据。

遍历page对象,获取到的是SearchResult类的实例对象,在这个对象中包含了商品的数据,如何获取到实例对象中包含的数据?该实例对象中有个属性为object,这个object就是模型类所包含的对象

对象的属性object才是模型类的对象。

search_test.html

搜索的关键字:{{ query }}

当前页的Page对象:{{ page }}

    {% for item in page %}

    • {{ item.object }}
    • # SearchResult对象
    • {{ item.object }}
    • # GoodsSKU 对象,通过遍历出的item.object可以获取到搜索到的商品的信息

      {% endfor %}

      获取到item中的商品信息

      接下来要获取页码page的列表,此时paginator对象已经传给模板

      paginator.page_range<—分页之后页码的列表

      搜索页:/search?q=搜索关键字&page=第多少页的内容,不加页码默认显示第一页

      上一页:依旧需要搜索,访问搜索地址,搜索谁,跟在?后面,访问第几页的内容,页码也需要传过来-----》/search?q={{ query }}&page={{ page.previous_page_number }}

      下一页:/search?q={{ query }}&page={{ page.next_page_number }}

      当前页:/search?q={{ query }}&page={{ pindex }}

      P70 商品搜索-更改分词方式

      默认whoosh引擎在进行关键词分析的时候,使用的是默认的引擎,有些汉字分析的并不准确,这里会更改掉whoosh引擎中词语分析的类,使用中文分词包jieba分词

      pip3 install jieba

      import jieba

      str = ‘很不错的草莓’

      # cut_all=True 只要能分析出来的词语都给分析出来

      res = jieba.cut(str, cut_all=True)

      res是个生成器,直接遍历获取到分词之后的结果

      for val in res:

      print(val)

      如何更改whoosh的默认词语分析类?

      1.找到/haystack/backends/目录

      2.创建一个ChineseAnalyzer.py文件

      import jieba

      from whoosh.analysis import Tokenizer, Token

      # __call__有call说明是可调用的

      class ChineseTokenizer(Tokenizer):

      def __call__(self, value, positions=False, chars=False, keeporiginal=False, removestops=True, start_pos=0, start_char=0, mode=‘’, **kwargs):
      自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

      深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

      因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

      由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

      如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

      img

      面试准备+复习分享:

      为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦

      秋招|美团java一面二面HR面面经,分享攒攒人品

      《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
      会持续更新!**

      如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

      img

      面试准备+复习分享:

      为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦

      [外链图片转存中…(img-zNfJGOde-1713522817003)]

      《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值