Django配置haystack、Woosh或ElasticSearch、jieba

不多說直接上代碼

項目名: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







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章