django-haystack进行全文索引
-
django-haystack可以对信息进行快速的索引,同时灵活/强大,足以处理更高级的用例
-
安装相关的包
pip install django-haystack pip install whoosh pip install jieba
-
INSTALLED_APPS = [ 'haystack', 'polls', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
-
在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'
-
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')),#添加该代码 ]
-
编写一个简单的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
-
在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 参数,指定模板文件;
-
把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)
-
在templates/search/indexes/app/创建一个models_text.txt的文件
{{ object.title }}#数据库Note的字段 {{ object.user.get_full_name }}#数据库Note的字段 {{ object.body }}#数据库Note的字段 模板的内容就是我们索引所在的表字段,haystack 在这三个字段上建立索引
-
在templates/search/创建一个search.html
#不懂的就复制 {% block content %} <h2>Search</h2> <form method="get" action="."> <table> {{ form.as_table }} <tr> <td> </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 }}&page={{ page.previous_page_number }}">{% endif %}« Previous{% if page.has_previous %}</a>{% endif %} | {% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}Next »{% if page.has_next %}</a>{% endif %} </div> {% endif %} {% else %} {# Show some example queries to run, maybe query syntax, something else? #} {% endif %} </form> {% endblock %}
-
开始创建索引
python manage.py rebuild_index
-
执行11步会自动创建whoosh_index文件
-
运行项目python mnaage.py runserver
样式自己修改