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

扫描二维码关注公众号,回复: 3135725 查看本文章
# 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







猜你喜欢

转载自blog.csdn.net/liuhe2296044/article/details/79250771