不多說直接上代碼
項目名:first app名稱:info
目錄結構:
項目setting.py:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'haystack',#在你自定義的app的上面
'info',
)
#並添加Woosh全文搜索引擎
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
# 自動生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
項目的urls.py:
url(r'^info/', include('info.urls')),
models:
from django.db import models
# Create your models here.
class Info(models.Model):
_id=models.CharField(max_length=20)
_score=models.CharField(max_length=11)
number=models.CharField(max_length=40)
singer=models.CharField(max_length=20)
size=models.CharField(max_length=40)
song=models.CharField(max_length=40)
tag=models.CharField(max_length=20)
timelen=models.CharField(max_length=20)
search_indexes.py
# coding=utf-8
from haystack import indexes
from models import Info # 引入你項目下的model(也就是你要將其作爲檢索關鍵詞的models)
class InfoIndex(indexes.SearchIndex, indexes.Indexable):# 類名必須爲需要檢索的Model_name+Index,這裏需要檢索Note,所以創建NoteIndex
text = indexes.CharField(document=True, use_template=True)#這句話不要改,都要用這句話,和字段無關
def get_model(self):
return Info
def index_queryset(self, using=None):
return self.get_model().objects.all() # 可對數據進行檢索限制
search_views.py:
#-*- coding: utf-8 -*-
from haystack.views import SearchView
from .models import *
class MySeachView(SearchView):
def extra_context(self): # 重載extra_context來添加額外的context內容
context = super(MySeachView, self).extra_context()
side_list = Info.objects.filter()
context['side_list'] = side_list
return context
urls.py:
# -*- coding: utf-8 -*-
from django.conf.urls import url, include
#
# from info import search_views
from info.views import MySeachView
from .import views
urlpatterns=[
url(r'^list/$',views.list),
url(r'^search/', MySeachView()),
# url(r'^search/', include('haystack.urls')),#因爲需要自定義搜索結果頁面,所以不交給haystack處理
]
views.py:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from haystack.views import SearchView
from .models import *
class MySeachView(SearchView):
def extra_context(self): # 重載extra_context來添加額外的context內容
context = super(MySeachView, self).extra_context()
side_list = Info.objects.filter()
# side_list = Info.objects.filter(number='32768')
context['side_list'] = side_list
return context
search.html:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form method='get' action="/info/search/" target="_blank">
<input type="text" name="q">
<input type="submit" value="查詢">
</form>
{% if query %}
<h3>搜索結果如下:</h3>
{% for result in page.object_list %}
{{ result.object.singer }} — 《{{ result.object.song }}》<br/>
{% empty %}
<p>啥也沒找到</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 %}« 上一頁{% if page.has_previous %}</a>{% endif %}
|
{% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}下一頁 »{% if page.has_next %}</a>{% endif %}
</div>
{% endif %}
{% endif %}
</body>
</html>
info_text.txt
{{ object.singer }}
{{ object.song }}
數據庫表sql:
DROP TABLE IF EXISTS `info_info`;
CREATE TABLE `info_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`_id` varchar(20) NOT NULL,
`_score` varchar(11) NOT NULL,
`number` varchar(40) NOT NULL,
`singer` varchar(20) NOT NULL,
`size` varchar(40) NOT NULL,
`song` varchar(40) NOT NULL,
`tag` varchar(20) NOT NULL,
`timelen` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
/*Data for the table `info_info` */
insert into `info_info`(`id`,`_id`,`_score`,`number`,`singer`,`size`,`song`,`tag`,`timelen`) values (1,'1','98','201','汪峯 庾澄慶','38','我愛你中國','中國好聲音-第三季','344'),(2,'2','92','202','那英 周杰倫','41','愛我你就抱抱我','中國好聲音-第三季','401'),(3,'3','88','203','楊坤 汪峯','48','我在中國吃着炸雞','中國好聲音-第二季','502'),(4,'4','60','204','庾澄慶 劉歡','34','情非得已','中國好聲音-第二季','342'),(5,'5','88','205','楊坤 汪峯','45','愛情是一顆幸福的子彈','中國好聲音-第四季','428'),(6,'6','34','206','劉歡 那英','35','征服','中國好聲音-第三季','332');
至此代碼全部結束,根據參考網站,直接配置jieba分詞即可,然後直接訪問/info/search/ 搜索即可。
參考文章:
http://blog.csdn.net/ac_hell/article/details/52875927
http://blog.csdn.net/zhaogeno1/article/details/78965298