基于python + django + whoosh + jieba 分词器实现站内检索功能

 更新时间:2021年08月25日 15:37:50   作者:一肚子顶死你  
这篇文章主要介绍了基于python + django + whoosh + jieba 分词器实现站内检索功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

基于 python django

源码

前期准备

安装库:

pip install django-haystack
pip install whoosh
pip install jieba

如果pip 安装超时,可配置pip国内源下载,如下:

pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com   <安装的库>
pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com  django

如果安装 django-haystack 失败,先安装 setuptools_scm .在安装 django-haystack.

pip install setuptools_scm

项目

 创建项目demo:

# django-admin startproject <项目名>
	django-admin startproject find

切入demo 终端操作,创建app:

# python manage.py startapp <APP名>
	python manage.py startapp searchshop

在 settings.py 文件 中的 INSTALLED_APPS 配置 注入 刚才创建APP( 路径: find/find/settings.py):

INSTALLED_APPS = [
	...
	'searchshop',
	...
]

在创建的APP中添加模型

models.py 文件添加如下(路径: find/searchshop/models.py):

class Shopp(models.Model):
    shop_name = models.TextField(max_length=200)
    shop_price = models.IntegerField(default=0)
    shop_dsc = models.CharField(max_length=200)

在app 中admin.py文件注册模型:

admin.py 文件添加如下(路径: find/searchshop/admin.py):

from .models import Shopp
admin.site.register(Shopp)

执行命令,让模型生效(修改模型时,都要执行一次,这样模型才同步!!!):

python manage.py makemigrations 
python manage.py migrate

创建后台管理帐号

访问后台可操作模型数据:

 python manage.py createsuperuser

运行:

python manage.py runserver

访问: http:127.0.0.1:8080/admin 登录刚才设置帐号,密码即可进入:

在这里插入图片描述

搭建站内搜索

配置 haystack

在 settings.py 文件 中的 INSTALLED_APPS 配置最底部 注入 haystack( 路径: find/find/settings.py):

INSTALLED_APPS = [
	...
	'haystack'
]

在app内,添加 search_indexes.py (目录:find/searchshop/search_indexes.py):

from haystack import indexes
from .models import Shopp # 之前创建的模型

# 修改此处,类名为模型类的名称+Index,比如模型类为GoodsInfo,则这里类名为GoodsInfoIndex(其实可以随便写)
class ArticlePostIndex(indexes.SearchIndex, indexes.Indexable):
    # text为索引字段
    # document = True,这代表haystack和搜索引擎将使用此字段的内容作为索引进行检索
    # use_template=True 指定根据表中的那些字段建立索引文件的说明放在一个文件中
    text = indexes.CharField(document=True, use_template=True)

    # 对那张表进行查询
    def get_model(self):  # 重载get_model方法,必须要有!
        # 返回这个model
        return Shopp

    # 建立索引的数据
    def index_queryset(self, using=None):
        # 这个方法返回什么内容,最终就会对那些方法建立索引,这里是对所有字段建立索引
        return self.get_model().objects.all()

生成检索索引

python manage.py rebuild_index

项目目录多出whoosh_index文件夹.

修改分词器

从 pyrhon 安装路径 ( \Lib\site-packages\haystack\backends\whoosh_backend.py) 复制一份到app中改名为 whoosh_cn_backend (find/searchshop/whoosh_cn_backend.py)
在顶部引用:

from jieba.analyse import ChineseAnalyzer

找到 (查找 StemmingAnalyzer ) 位置:

 schema_fields[field_class.index_fieldname] = TEXT(
                    stored=True,
                    analyzer=StemmingAnalyzer(),
                    field_boost=field_class.boost,
                    sortable=True,
                )

替换:

schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=ChineseAnalyzer(),
                    field_boost=field_class.boost)

在 INSTALLED_APPS(路径: find/find/settings.py) 配置后面 后面添加:

HAYSTACK_CONNECTIONS = {
    'default': {
        # 指定whoosh引擎 (之前创建的whoosh_cn_backend)
        'ENGINE': 'searchshop.whoosh_cn_backend.WhooshEngine',
        # 'ENGINE': 'jsapp.whoosh_cn_backend.WhooshEngine',      # whoosh_cn_backend是haystack的whoosh_backend.py改名的文件为了使用jieba分词
        # 索引文件路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}
 # 添加此项,当数据库改变时,会自动更新索引,非常方便
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

添加 templates

在APP中创建 templates文件夹.

添加内容检索内容

在templates文件夹下创建文件夹 search -> indexes -> searchshop( search + APP名);
路径( 目录: find/searchshop\templates\search\indexes\searchshop) 添加Shopp_text.txt(APP名_text.txt): (需要检索的字段名)

{{object.shop_name}}
{{object.shop_dsc}}
{{object.shop_price}}

添加页面模板

在templates文件夹下创建文件夹(searchshop) 下创建index.html:

{% load highlight %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>商品列表</title>
    <style>
        span.highlighted {
            color: red;
        }
    </style>
</head>
<body>
    <div class="search">
        <form method="get" action="{% url 'shop:search' %}">
            <input type="text" name="q" placeholder="a搜索商品">
            <input type="submit" value="搜索">
        </form>
    </div>
    {% if shop_list and query %}
    <ul>
        {% for question in shop_list %}
        <li>
            {% highlight question.object.shop_name with query %}
            价格: {% highlight question.object.shop_price with query %}
            <span class="post-author"> <a> {% highlight question.object.shop_dsc with query %} </a></span>
        </li>
        {% endfor %}
    </ul>
    {% else %}
    <p>No polls are available.</p>
    {% endif %}
</body>
</html>

load highlight : 加载高亮.
query : 检索词
shop_list : 检索结果

视图层

目录: find/searchshop/views.py

from django.shortcuts import render
from django.http import HttpResponse
#Create your views here.
from .models import Shopp
from haystack.forms import  ModelSearchForm
from haystack.query import EmptySearchQuerySet
def index(request):
   shop_list = Shopp.objects.all()
   context = {
       'query': '',
       'shop_list': shop_list
   }
   return render(request, 'searchshop/index.html', context)

def search(request,  load_all=True, form_class=ModelSearchForm, searchqueryset=None):
   if request.GET.get('q'):
       form = form_class(request.GET, searchqueryset=searchqueryset, load_all=load_all)

       if form.is_valid():
           query = form.cleaned_data['q']
           results = form.search()
           context = {
               'query': query,
               'shop_list': results
           }
           return render(request, 'searchshop/index.html', context)
           # results = form.search()
       return HttpResponse(request.GET.get('q'))
   return HttpResponse('查询')

配置路由

在 find/searchshop 创建 urls.py

from . import views
app_name = 'shop'   # 重点是这一行
urlpatterns = [
   path('', views.index, name='index'),
   path('search', views.search, name='search'),
   #  path(r'search/$', views.search, name='search')
]

修改 urls.py(目录: find/find/urls.py)

from django.urls import path, include

urlpatterns = [
   path('shop', include('searchshop.urls')),
   path('admin/', admin.site.urls),
]

运行:

python manage.py runserver

测试

http://127.0.0.1:8000/shop

在这里插入图片描述
在这里插入图片描述

分词器

所以'红米'查询不到…

在这里插入图片描述

到此这篇关于基于python + django + whoosh + jieba 分词器实现站内检索的文章就介绍到这了,更多相关python django 分词器实现站内检索内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 学好python基本数据类型

    学好python基本数据类型

    这篇文章主要介绍了学好python基本数据类型,学习python基本数据类型我们需要了解基本数据类型有数字int、布尔值bool、字符串str、列表list、元组tuple、字典dict等,其中包括他们的基本用法和其常用的方法,下面来看看文章的具体介绍吧
    2021-12-12
  • Python实现根据Excel生成Model和数据导入脚本

    Python实现根据Excel生成Model和数据导入脚本

    最近遇到一个需求,有几十个Excel,每个的字段都不一样,然后都差不多是第一行是表头,后面几千上万的数据,需要把这些Excel中的数据全都加入某个已经上线的Django项目。所以我造了个自动生成 Model和导入脚本的轮子,希望对大家有所帮助
    2022-11-11
  • python实现两个dict合并与计算操作示例

    python实现两个dict合并与计算操作示例

    这篇文章主要介绍了python实现两个dict合并与计算操作,结合具体实例形式分析了Python使用collections.Counter进行字典dict合并与遍历输出相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • Python生成指定数量的优惠码实操内容

    Python生成指定数量的优惠码实操内容

    在本篇文章里小编给大家整理了关于Python生成指定数量的优惠码的实例内容以及相关代码,有需要的朋友们学习下。
    2019-06-06
  • 详解Windows下源码编译PaddlePaddle

    详解Windows下源码编译PaddlePaddle

    这篇文章主要为大家介绍了Windows下从源码编译PaddlePaddle解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Python下调用Linux的Shell命令的方法

    Python下调用Linux的Shell命令的方法

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,这篇文章主要介绍了Python下调用Linux的Shell命令的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 教你使用python搭建一个QQ机器人实现叫起床服务

    教你使用python搭建一个QQ机器人实现叫起床服务

    这篇文章主要介绍了教你使用python搭建一个QQ机器人实现叫起床服务,作为一个程序猿如果没有女朋友叫你起床,那么就自己制作一个,如果有那么也可以帮你叫女朋友起床
    2021-08-08
  • python基础教程之python消息摘要算法使用示例

    python基础教程之python消息摘要算法使用示例

    这篇文章主要介绍了python中的消息摘要算法使用示例,需要的朋友可以参考下
    2014-02-02
  • Python如何在for循环中同时使用两个变量与两个控制条件

    Python如何在for循环中同时使用两个变量与两个控制条件

    Python是一种广泛使用的编程语言,其提供了许多强大的方法来处理代码,Python for循环是其中一种非常有用的方法,下面这篇文章主要给大家介绍了关于Python如何在for循环中同时使用两个变量与两个控制条件的相关资料,需要的朋友可以参考下
    2024-03-03
  • python内存管理机制原理详解

    python内存管理机制原理详解

    这篇文章主要介绍了python内存管理机制原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论