django-haystack+jieba全文索引(前后端不分离版)

本文介绍了如何使用django-haystack结合jieba实现全文索引。通过安装相关包,配置settings.py,编写models.py,复制并修改whoosh_backend.py,创建搜索模板文件,最后创建索引并运行项目,实现快速全文检索功能。
摘要由CSDN通过智能技术生成

django-haystack进行全文索引

  1. django-haystack可以对信息进行快速的索引,同时灵活/强大,足以处理更高级的用例

  2. 安装相关的包

    pip install django-haystack
    pip install whoosh
    pip install jieba
    
  3. 把haystack添加到setting.py

    INSTALLED_APPS = [
        'haystack',
        'polls',
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
  4. 在setting.py配置hastack

    #配置haystack
    HAYSTACK_CONNECTIONS = {
        'default': {
        # 这里配置搜索引擎 路劲为:项目应用名+whoosh_cn_backend+WhooshEngine
            'ENGINE': 'polls.whoosh_cn_backen.WhooshEngine',
            #后面rebuild_index,生成的索引文件目录
            'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
            'INCLUDE_SPELLING': True,
        },
    }
    
    #设置分页显示的数据量
    HAYSTACK_SEARCH_RESULTS_PER_PAGE = 4
    #当数据库改变是,自动更新索引
    HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
    
  5. 总urls.py

    from django.contrib import admin
    from django.urls import path,include
    from django.conf.urls import url
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('',include('polls.urls')),
        url(r'^search/', include('haystack.urls')),#添加该代码
    ]
    
  6. 编写一个简单的models.py用于测试

    from django.db import models
    from django.contrib.auth.models import User
    
    
    class Note(models.Model):
        user = models.ForeignKey(User,on_delete='CASCADE')
        pub_date = models.DateTimeField(auto_now_add=True)
        title = models.CharField(max_length=200)
        body = models.TextField()
    
        def __unicode__(self):
            return self.title
    
  7. 在app下面创建SearchIndexes.py

    from haystack import indexes
    from polls.models import Note
    
    #class名字:model+Index
    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        # ,template_name='search/indexes/search/song_text.txt'
        text = indexes.CharField(document=True, use_template=True)
    
        def get_model(self):
            # song可以改成实际的model
            return Note
    
        def index_queryset(self, using=None):
            return self.get_model().objects.all()
            
    这主要是一个关联操作,定义我们的数据表的model的索引类
    text 这个字段是必须的,document=True只能有一个,use_template =true 表示使用模板,这个模板的路径必须按照如下格式: templates/search/indexes/appname/model_text.txt ,如果不按照这个路径的话,就使用template_name 参数,指定模板文件;
    
    
  8. 把python\Lib\site-packages\haystack\backends\whoosh_backend.py 文件复制到项目app下面并更改以下内容,并且修改名字为:whoosh_cn_backend.py

    这个文件可以从我们的haystack的backhend目录下复制,唯一需要修改的就是加入对中文的分词,因为这个默认是不支持中文的,找到下面这句话,按照如下修改下:
    
    from jieba.analyse import  ChineseAnalyzer
    #schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=StemmingAnalyzer(), field_boost=field_class.boost, sortable=True)
    #修改为jieba分词
    schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=ChineseAnalyzer(),
                                                                      field_boost=field_class.boost, sortable=True)
    
    
  9. 在templates/search/indexes/app/创建一个models_text.txt的文件

    {{ object.title }}#数据库Note的字段
    {{ object.user.get_full_name }}#数据库Note的字段
    {{ object.body }}#数据库Note的字段
    
    模板的内容就是我们索引所在的表字段,haystack 在这三个字段上建立索引
    
  10. 在templates/search/创建一个search.html

    #不懂的就复制
    {% block content %}
        <h2>Search</h2>
    
        <form method="get" action=".">
            <table>
                {{ form.as_table }}
                <tr>
                    <td>&nbsp;</td>
                    <td>
                        <input type="submit" value="Search">
                    </td>
                </tr>
            </table>
    
            {% if query %}
                <h3>Results</h3>
    
                {% for result in page.object_list %}
                    <p>
                        <a href="{{ result.object.get_absolute_url }}">{{ result.object.title }}</a>
                    </p>
                {% empty %}
                    <p>No results found.</p>
                {% endfor %}
    
                {% if page.has_previous or page.has_next %}
                    <div>
                        {% if page.has_previous %}<a href="?q={{ query }}&amp;page={{ page.previous_page_number }}">{% endif %}&laquo; Previous{% if page.has_previous %}</a>{% endif %}
                        |
                        {% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}">{% endif %}Next &raquo;{% if page.has_next %}</a>{% endif %}
                    </div>
                {% endif %}
            {% else %}
                {# Show some example queries to run, maybe query syntax, something else? #}
            {% endif %}
        </form>
    {% endblock %}
    
  11. 开始创建索引

    python manage.py rebuild_index
    
  12. 执行11步会自动创建whoosh_index文件

    在这里插入图片描述

  13. 运行项目python mnaage.py runserver

在这里插入图片描述
样式自己修改

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值