首先需要安装django-haystack和Whoosh这两个包。
pip install django-haystack
pip install Whoosh
在settings.py中添加以下配置:
# settings.py
INSTALLED_APPS = [
# ...
'haystack',
]
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
},
}
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
其中,'PATH'指定索引文件的存储目录。 这里我们将索引文件存储在项目根目录下的whoosh_index目录中。
接下来,定义搜索的模型和模板。
例如,我们有一个blog应用,它有一个Article模型,其中包含一个'title'和一个'content'字段。
我们需要在该模型上创建一个SearchIndex。
from haystack import indexes
from blog.models import Article
class ArticleIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='title')
content = indexes.CharField(model_attr='content')
def get_model(self):
return Article
def index_queryset(self, using=None):
return self.get_model().objects.all()
在这个索引里,我们定义了三个字段:text、title和content。
- text: haystack使用该字段的内容创建搜索文档。 参数document=True指定该字段应该被包含在搜索文本中。
- title:将title字段索引。
- content:将content字段索引。
接下来是模板文件。
<!-- templates/search/indexes/blog/article_text.txt -->
{{ object.title }}
{{ object.content }}
现在,我们已经定义了我们的索引。我们需要运行如下命令创建索引文件:
python manage.py rebuild_index
我们可以在views.py中定义搜索视图。假设我们的搜索页面在'blog/views.py'中。
from django.shortcuts import render
from django.http import HttpResponse
from haystack.query import SearchQuerySet
def search(request):
query = request.GET.get('q')
if query:
results = SearchQuerySet().filter(content=query)
else:
results = []
return render(request, 'search.html', {'results': results, 'query': query})
这里我们使用了Haystack提供的SearchQuerySet API来执行搜索操作。 我们在视图中接收到的查询字符串可以通过request.GET.get('q')获取。
接下来,我们在templates文件夹下创建一个名为search.html的模板文件,显示搜索结果。
<!-- templates/search.html -->
{% if query %}
<h2>Search Results for "{{ query }}"</h2>
{% for result in results %}
<h3><a href="{{ result.object.get_absolute_url }}">{{ result.object.title }}</a></h3>
<p>{{ result.object.content|safe }}</p>
{% empty %}
<p>No results found.</p>
{% endfor %}
{% endif %}
在这个模板中,我们检查查询参数是否存在。如果存在,我们循环搜索结果并显示标题和内容。 如果查询参数不存在,我们显示“无结果”的消息。
现在我们可以启动Django服务器并在浏览器中搜索了。
以下是两个搜索示例:
- 搜索文章标题包含“Django”的文章:
http://localhost:8000/search/?q=Django
- 搜索文章内容中包含“Django”的文章:
http://localhost:8000/search/?q=Django&search_in=content
在第2个示例中,我们使用搜索参数“search_in”指定要在哪里搜索。在本例中,我们搜索了“content”字段,而不是默认的“text”字段。
这就是Django Haystack实现全文检索的一个简单示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django haystack实现全文检索的示例代码 - Python技术站