day-91项目上线与Haystack

项目上线参考day-90

Haystack

什么是Haystack:

  Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),
  该框架支持**Solr**,**Elasticsearch**,**Whoosh**, ***Xapian*搜索引擎它是一个可插拔的后端(很像Django的数据库) 

    whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用
    jieba:一款免费的中文分词包

1.安装

  pip install django-haystack
  pip install whoosh
  pip install jieba

2.配置(settings.py



INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',

    # 添加
    'haystack',

 
]

import os
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
    },
}

3.为模型表创建索引

a.在应用(app)目录下面建立`search_indexes.py`文件,文件名不能修改 ,里面内容如下

    from haystack import indexes
    from app01.models import Article                                             #导入模型表

    class ArticleIndex(indexes.SearchIndex, indexes.Indexable):                  #类名必须为需要检索的 模型类名+Index(如:ArticleIndex)
      
        text = indexes.CharField(document=True, use_template=True)               #创建一个text字段 


        def get_model(self):
            return Article

        def index_queryset(self, using=None):
            return self.get_model().objects.all()



b.创建目录“templates/search/indexes/应用名称/,然后创建“模型类名称+_text.txt”文件,里面填写需要索引的字段
    {{ object.title }}
    {{ object.desc }}
    {{ object.content }}

4.路由相关设置

a.添加路由(显示搜索结果路由)

    (r'^search/', include('haystack.urls')),


b.创建搜索模板(在search文件夹下创建一个search.html)

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <style>
            span.highlighted {                                                   #搜索关键字颜色
                color: red;
            }
        </style>
    </head>
    <body>
    {% load highlight %}
    {% if query %}
        <h3>搜索结果如下:</h3>
        {% for result in page.object_list %}
    {#        <a href="/{{ result.object.id }}/">{{ result.object.title }}</a><br/>#}                                  #显示搜索到的模型表的字段内容
            <a href="/{{ result.object.id }}/">{%   highlight result.object.title with query max_length 2%}</a><br/>  #max_length 2%:显示多少内容
            <p>{{ result.object.content|safe }}</p>                                                               
            <p>{% highlight result.content with query %}</p>                                      #显示搜索关键字颜色
        {% empty %}
            <p>啥也没找到</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; 上一页
                {% if page.has_previous %}</a>{% endif %}
                |
                {% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}">{% endif %}下一页 &raquo;
                {% if page.has_next %}</a>{% endif %}
            </div>
        {% endif %}
    {% endif %}
    </body>
    </html>
 

c.重建索引

    运行./manage.py rebuild_index,把模型表中的数据同步到whoosh(搜索引擎,相当于数据库)

5.使用jieba分词(修改haystack源代码)

在haystack的安装文件夹下,路径如“D:python3Libsite-packageshaystackackends”        
a.建立ChineseAnalyzer.py文件,内容如下
import jieba from whoosh.analysis import Tokenizer, Token class ChineseTokenizer(Tokenizer): def __call__(self, value, positions=False, chars=False, keeporiginal=False, removestops=True, start_pos=0, start_char=0, mode='', **kwargs): t = Token(positions, chars, removestops=removestops, mode=mode, **kwargs) seglist = jieba.cut(value, cut_all=True) for w in seglist: t.original = t.text = w t.boost = 1.0 if positions: t.pos = start_pos + value.find(w) if chars: t.startchar = start_char + value.find(w) t.endchar = start_char + value.find(w) + len(w) yield t def ChineseAnalyzer(): return ChineseTokenizer() b.复制whoosh_backend.py文件,改名为whoosh_cn_backend.py 注意:复制出来的文件名,末尾会有一个空格,记得要删除这个空格 c.在复制的文件中导入:from .ChineseAnalyzer import ChineseAnalyzer 查找:analyzer=StemmingAnalyzer() 改为:analyzer=ChineseAnalyzer()

6.在自己的HTML中创建搜索栏

<form method='get' action="/search/" target="_blank">            
    <input type="text" name="q">
    <input type="submit" value="查询">
</form>
原文地址:https://www.cnblogs.com/klw1/p/11421632.html