zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    【JavsScript】父子页面之间跨域通信的方法
    【JavaScript】【译】编写高性能JavaScript
    【JavaScript】你知道吗?Web的26项基本概念和技术
    【299】◀▶ IDL
    Python
    Cadence 信号完整性(一)-- 仿真步骤3
    「S-A-L-T-A」项目失败总结!
    java如何遍历hashMap
    Python
    VM网络无法连接--提示ethernet0无法连接到虚拟网络
  • 原文地址:https://www.cnblogs.com/klw1/p/11421632.html
Copyright © 2011-2022 走看看