【Django】haystack+whoosh+jieba实现中文全文搜索

Published April 20, 2020, 3:23 a.m. by admin

安装各个插件

pip install whoosh django-haystack jieba

加载haystack插件

修改settings.py文件

sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))

INSTALLED_APPS = [
#...
    'haystack',
]

在settings.py配置Whoosh

import os
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
    },
}
# 每页显示搜索结果数目为10
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10
# 自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

创建索引

在我的个人应用Zblog中,新建search_indexes.py

from haystack import indexes
from .models import Post


class IdeaIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        # 这里修改成你自己的数据库模型
        return Post

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

在URL配置中添加SearchView,并配置模板

urlpatterns = [
#...
    url(r'^search/', include('haystack.urls')),
]

在templates目录下。

mkdir -p search/indexes/zblog/
vim zblog_text.txt

在zblog_text.txt文件中,添如下内容:

{{ object.title }}
{{ object.content }}

所以需要在Zblog/templates/search/下添加search.html文件,内容为

{% extends 'base.html' %}

{% block content %}
    <h2>Search</h2>

    <form method="get" action=".">
        <table>
            {{ form.as_table }}
            <tr>
                <td> </td>
                <td>
                    <input type="submit" value="Search">
                </td>
            </tr>
        </table>

        {% if query %}
            <h3>Results</h3>

            {% for result in page.object_list %}
                <p>
                    <a href="{{ result.object.get_absolute_url }}">{{ result.object.title }}</a>
                </p>
            {% empty %}
                <p>No results found.</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 %}« Previous{% if page.has_previous %}</a>{% endif %}
                    |
                    {% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}Next »{% if page.has_next %}</a>{% endif %}
                </div>
            {% endif %}
        {% else %}
            {# Show some example queries to run, maybe query syntax, something else? #}
        {% endif %}
    </form>
{% endblock %}

重建索引文件

python manage.py rebuild_index

解决中文问题

拷贝

cp /home/zsd/venv/ZDjango/lib/python3.6/site-packages/haystack/backends/whoosh_backend.py /home/zsd/ZDjango/Zsite/Zblog/

mv whoosh_backend.py whoosh_cn_backend.py

whoosh_cn_backend.py,修改:

schema_fields[field_class.index_fieldname] =
    TEXT(stored=True, analyzer=ChineseAnalyzer(),
            field_boost=field_class.boost)

settings.py修改引擎

import os
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'Zblog.whoosh_cn_backend.WhooshEngine',
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'
    },
}

重新更新索引:

python manage.py rebuild_index

最后合并到bootstrap导航栏中

修改Zblog/templates/Zblog/base.html

      <form class="navbar-form navbar-left" method="get" action="/search">
        <div class="form-group">
          <input type="text" class="form-control" placeholder="Search" name='q'>
        </div>
        <button type="submit" class="btn btn-default" value="Search">提交</button>
      </form>

这里的form表单,会提交我们刚刚创建的search服务中。效果如下:

同类文章

【Django】Django 数据导入和导出

【Django】创建Zstockweb

【Django】Site matching query does not exist

【Django】Django入门

0 次评论

没有任何评论

添加一条评论