侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Django实现全文检索的方法(支持中文)

框架(架构)  /  管理员 发布于 7年前   282

PS: 我的检索是在文章模块下 forum/article

第一步:先安装需要的包:

pip install django-haystackpip install whooshpip install jieba

第二步: 配置需要的文件 settings.py

添加haystack应用模块

INSTALLED_APPS = (   ...  'haystack',   ...)

在settings.py 末尾添加

HAYSTACK_CONNECTIONS = {  'default': {    'ENGINE': 'article.whoosh_cn_backend.WhooshEngine',    'PATH': os.path.join(BASE_DIR, 'whoosh_index'),  },}HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'  # 索引自动更新

第三步: 配置url路径

在 forum/forum/urls.py中包含search路径

url(r'^search/', include('haystack.urls')),

第四步:建立模型

forum/article/models.py

class Article(models.Model):  '''  文章数据模型  '''  id = models.AutoField(primary_key=True,verbose_name='文章编号')  title = models.CharField(max_length=50,verbose_name='文章标题')  content = MDTextField()  publish_time = models.DateTimeField(auto_now_add=True,verbose_name='发表时间')  last_update_time = models.DateTimeField(auto_now=True,verbose_name='最后一次修改时间')  status = models.IntegerField(u'状态', default=1)   read_count = models.IntegerField(default=0,verbose_name='阅读次数')  comment_count = models.IntegerField(default=0,verbose_name='评论次数')  #关联用户  user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='用户')  subject = models.ForeignKey(Subject, null=True, blank=True, on_delete=models.CASCADE,    verbose_name='属于哪一个专题')

第五步:设置为那个class建立索引

如果你想针对某个app例如mainapp做全文检索,则必须在mainapp的目录下面建立search_indexes.py文件,文件名不能修改
例:forum/article/search_indexes.py模块

from article.models import Articlefrom haystack import indexesclass ArticleIndex(indexes.SearchIndex, indexes.Indexable):  text = indexes.CharField(document=True, use_template=True)  def get_model(self):    return Article  def index_queryset(self, using=None):    return self.get_model().objects.filter(status=1)

每个索引里面必须有且只能有一个字段为document=True

第六步: 确定我们需要的属性:

新建yourapp/templates/search/indexes/yourapp/article_text.txt来指明需要属性

例: article/templates/search/indexes/yourapp/article_text.txt

{{ object.title }} # 文章标题{{ object.user.username }} # 文章作者{{ object.content }} # 文章内容

第七步: 把搜索引擎放入项目下

例: forum/article/whoosh_cn_backend.py

将文件whoosh_backend.py(例: 我的python路径E:\python\Lib\site-packages\haystack\backends\whoosh_backend.py
)放到article下,并重命名为whoosh_cn_backend.py,例如blog/whoosh_cn_backend.py。修改如下:

导入 

from jieba.analyse import ChineseAnalyzer

找到

复制代码 代码如下: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, sortable=True)

成功引入jieba分词

第八步: 前端页面配置

templates/base.html (搜索页面)

 <form class="navbar-form navbar-left" action="/search/" method="get">        <div class="form-group">          <input type="text" class="form-control" name="q" placeholder="请输入搜索的内容" value=""/>        </div>        <input type="submit" value="搜索">      </form>

结果展示页面(forum/article/templates/search/search.html)

{% extends 'base.html' %}{% block title %}搜索结果{% endblock %}{% block content %}<div class="container" id="content">  <div class="search-body">  <form method="get" action="">    <table>      <tr>        <td>          <label for="id_q"></label>        </td>        <td>          <input class="form-control" id="id_q" name="q" type="search" value="{{ query }}" />        </td>        <td> </td>        <td>          <button class="btn btn-defaul" type="submit"><span class="glyphicon glyphicon-search">搜索</span></button>        </td>      </tr>    </table></form>    {% if query %}      <h3>搜索结果</h3>      <table class="table">      <tr>         {% for result in page.object_list %}           <td>        <p>          <a href="https:/article/{% url 'article:article_detail' article_id=result.object.id %}" rel="external nofollow" >{{ result.object.title }}</a>        </p> 作者: <a href="https:/article/{% url 'user:user_index' result.object.user.id %}" rel="external nofollow" >{{ result.object.user.username }}</a>        <p>{{ result.object.content | safe | truncatechars_html:40 }}</p>      </td>      </tr>      {% empty %}        <p>没有得到想要的结果哦.</p>      {% endfor %}      </table>      {% if page.has_previous or page.has_next %}        <div>          {% if page.has_previous %}<a href="https:/article/?q={{ query }}&page={{ page.previous_page_number }}" rel="external nofollow" >{% endif %}« 上一页{% if page.has_previous %}</a>{% endif %}          |          {% if page.has_next %}<a href="https:/article/?q={{ query }}&page={{ page.next_page_number }}" rel="external nofollow" >{% endif %}下一页 »{% if page.has_next %}</a>{% endif %}        </div>      {% endif %}    {% else %}      {# Show some example queries to run, maybe query syntax, something else? #}    {% endif %}  </div></div>{% endblock %}

第九步: 建立索引

python manage.py rebuild_index

建立成功会自行生成一个forum/whoosh_index的文件夹

第十步: 运行程序

python manage.py runserver

PS: 模板样式可以自行调整

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    django 修改server端口号的方法
    下一条:
    django自带的server 让外网主机访问方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Filament v3.1版本发布(0个评论)
    • docker + gitea搭建一个git服务器流程步骤(0个评论)
    • websocket的三种架构方式使用优缺点浅析(0个评论)
    • ubuntu20.4系统中宿主机安装nginx服务,docker容器中安装php8.2实现运行laravel10框架网站(0个评论)
    • phpstudy_pro(小皮面板)中安装最新php8.2.9版本流程步骤(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2018-05
    • 2020-02
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-11
    • 2021-03
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-08
    • 2023-08
    • 2023-10
    • 2023-12
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客