在Django中使用搜索引擎:Elasticsearch,Solr等等

2023-04-11 00:00:00 django 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进行全文检索,其他搜索引擎的使用方式类似。

相关文章