在Django中使用搜索引擎:Elasticsearch,Solr等等
可以使用第三方库django-haystack来实现在Django中使用搜索引擎,支持的搜索引擎包括Elasticsearch、Solr、Whoosh等。
首先需要安装django-haystack库以及相应的搜索引擎库,比如安装Elasticsearch库可以使用以下命令:
pip install elasticsearch
然后在settings.py中添加以下配置:
INSTALLED_APPS = ( # ... 'haystack', ) HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch5_backend.Elasticsearch5SearchEngine', 'URL': 'http://127.0.0.1:9200/', 'INDEX_NAME': 'myproject', }, }
以上配置指定了使用Elasticsearch5作为搜索引擎,连接到本机的9200端口,索引的名称为myproject。
然后在models.py中定义需要搜索的模型,并配置相关的字段:
from django.db import models from django.utils.encoding import python_2_unicode_compatible from haystack import indexes @python_2_unicode_compatible class MyModel(models.Model): title = models.CharField(max_length=200) content = models.TextField() def __str__(self): return self.title class Meta: verbose_name = 'my model' verbose_name_plural = 'my models' class MyModelIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) title = indexes.CharField(model_attr='title') def get_model(self): return MyModel def index_queryset(self, using=None): return self.get_model().objects.all()
以上代码定义了一个名为MyModel的模型,并为该模型定义了一个MyModelIndex的索引类,指定了需要搜索的字段为title和content。需要在templates/search/indexes/myapp/mymodel_text.txt文件中定义搜索结果页面中需要展示的内容:
{{ object.title }} {{ object.content }}
然后在views.py中定义搜索视图:
from django.shortcuts import render_to_response from haystack.query import SearchQuerySet def search(request): query = request.GET.get('q', '') sqs = SearchQuerySet().filter(content=query) return render_to_response('search/search.html', {'query': query, 'results': sqs})
以上代码接收GET请求中的q参数作为关键词进行搜索,并将搜索结果传递给search.html模板展示搜索结果。
在urls.py中定义搜索视图的路由:
from django.conf.urls import url from myapp.views import search urlpatterns = [ url(r'^search/', search, name='search'), ]
最后在search.html模板中展示搜索结果:
{% if results %} <ul> {% for result in results %} <li><a href="{{ result.object.get_absolute_url }}">{{ result.object.title }}</a></li> {% endfor %} </ul> {% else %} <p>No results found.</p> {% endif %}
以上代码使用for循环将搜索结果进行展示。
以上代码演示了如何在Django中使用Elasticsearch进行全文检索,其他搜索引擎的使用方式类似。
相关文章