Django对接elasticsearch实现全文检索的示例代码

实现全文检索的过程中,我们常用搜索引擎,比如 Elasticsearch。而 Django 可以很容易地集成 Elasticsearch 来提供全文检索服务,本攻略将通过示例代码来讲解 Django 对接 Elasticsearch 实现全文检索的步骤。

Step 1:准备工作

在 Django 项目中集成 Elasticsearch 首先需要安装 Elasticsearch。在这里,我们假设 Elasticsearch 已经在本地运行并且需要对一个名为 MyIndex 的索引进行全文检索。同时,需要安装 elasticsearch-py 库,它是 Elasticsearch Python 客户端。

安装 elasticsearch-py 库可以通过 pip 命令来完成:

$ pip install elasticsearch

安装完 elasticsearch-py 库之后,在 Django 的 settings.py 文件中进行如下配置:

ELASTICSEARCH_DSL={
    'default': {
        'hosts': 'localhost:9200'
    },
}

以上配置指定了 Elasticsearch 的地址和端口号,默认为本地地址 127.0.0.1 和端口号 9200。

Step 2:定义索引

在 Django 的 models.py 文件中,我们定义了一个模型类 Blog,代表博客文章:

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateField(auto_now_add=True)

可以看出,这个模型包含了标题、内容和创建时间等字段,并作为全文检索的基础。

接下来,我们创建一个文档类型 BlogIndex,用来指定我们所定义的模型和 Elasticsearch 索引的对应关系。

from elasticsearch_dsl import Document, Text, Date
from elasticsearch_dsl.connections import connections

from .models import Blog

connections.create_connection()

class BlogIndex(Document):
    title = Text()
    content = Text()
    created_at = Date()

    class Index:
        name = 'myindex'

    def save(self, **kwargs):
        self.created_at = datetime.now()
        return super(BlogIndex, self).save(**kwargs)

    def update(self, **kwargs):
        self.created_at = datetime.now()
        return super(BlogIndex, self).update(**kwargs)

    def delete(self, **kwargs):
        return super(BlogIndex, self).delete(**kwargs)

    def to_object(self, **kwargs):
        obj = super().to_object(**kwargs)
        obj['id'] = self.meta.id
        obj['created_at'] = self.created_at
        return obj

    def __init__(self, **kwargs):
        self.created_at = datetime.now()
        super(BlogIndex, self).__init__(**kwargs)

    class Django:
        model = Blog

BlogIndex 继承了 Elasticsearch DSL 中的 Document 类,其中包含了标题、内容和创建时间三个字段,并指定了 Elasticsearch 索引的名称为 'myindex';

其中,save()、update()、delete() 方法是为了使 Elasticsearch 的索引与 Django 的模型进行同步;

to_object() 方法是为了将 Elasticsearch 索引查询结果中的 meta.id 和 created_at 数据反应到模型对象中;

Django 属性是 Elasticsearch DSL 提供的专用模块,Django 的 model 属性用于指定该 Document 映射哪个 Django 模型。

Step 3:编写搜索视图函数

from django.shortcuts import render
from django.views.generic import View
from elasticsearch_dsl import Search
from .documents import BlogIndex

class SearchView(View):
    def get(self, request, *args, **kwargs):
        query = request.GET.get('query')
        s = Search().index('myindex').query("multi_match", fields=['title', 'content'], query=query)
        response = s.execute()
        context = {
            'results': [],
            'total_hits': response.hits.total.value
        }
        for hit in response.hits:
            obj = BlogIndex(meta={'id': hit.meta.id})
            obj = obj.to_object(include_meta=True)
            context['results'].append(obj)

        return render(request, 'blog/search.html', context=context)

在这个搜索视图函数中,我们首先从查询参数中获取搜索关键字,然后构建一个 Elasticsearch 的 Search 对象,并使用 multi_match 查询来对所有的 fields 通过关键字进行检索;

然后执行 Elasticsearch 的查询,返回一个 response 对象,我们将查询结果封装在 context 当中,并传递到模板展示。需要注意的是,由于我们在 BlogIndex 中定义了 to_object() 方法,所以可以轻松地将搜索结果中的 meta.id 和 created_at 数据反应到模型对象当中。

接下来,我们编写一个模板来展示搜索结果,例如模板 search.html:

{% extends 'base.html' %}

{% block content %}
  {% if query %}
    <h1>搜索结果:{{ total_hits }}</h1>

    {% for result in results %}
      <div>
        <h2><a href="#">{{ result.title }}</a></h2>
        <p>{{ result.content }}</p>
        <span>发布时间:{{ result.created_at }}</span>
      </div>
    {% empty %}
      <p>没有搜索到相关结果,请尝试其他关键字。</p>
    {% endfor %}
  {% else %}
    <p>请输入查询关键字。</p>
  {% endif %}
{% endblock %}

至此,我们已经完成了 Django 对接 Elasticsearch 实现全文检索的示例代码编写。可以通过请求 http://127.0.0.1:8000/search/?query=xxx 来对 MyIndex 索引进行全文检索,其中 xxx 为关键字。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django对接elasticsearch实现全文检索的示例代码 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • pytorch 如何实现HWC转CHW

    PyTorch 是一个广泛使用的深度学习框架,实现了大量的深度学习算法和模型,作为一个深度学习从业者,经常需要对图像处理进行相关处理,如将图像从 HWC(height、width、channel)格式转化为 CHW(channel、height、width)格式。下面将提供两种方法实现 HWC 转 CHW。 方法一: 使用 permute() 函数 PyTo…

    人工智能概论 2023年5月25日
    00
  • Python3数字求和的实例

    Python3数字求和的实例是一个非常简单的程序,但它很好地展示了Python语言的一些关键特性。下面我来详细讲解这个程序的实现方法: 程序的实现方法 我们将使用Python解释器来运行这个程序,主要有以下两个步骤: 打开Python解释器:许多操作系统都已经默认安装了Python解释器,输入python3并按下回车键即可打开它。 编写Python代码:使用…

    人工智能概论 2023年5月25日
    00
  • 一次nginx 504 Gateway Time-out错误排查、解决记录

    一次NGINX 504 Gateway Time-out错误排查和解决可能涉及到多个原因和步骤,下面我将详细介绍一下完整的攻略。 1. 什么是504 Gateway Time-out错误 当我们访问一个Web站点的时候,我们的浏览器会向Web服务器发送请求。Web服务器通常与一个应用服务器连接,如PHP-FPM、Django等,以处理请求和生成响应。在一些情…

    人工智能概览 2023年5月25日
    00
  • Java实例讲解文件上传与跨域问题

    下面就详细讲解一下“Java实例讲解文件上传与跨域问题”的完整攻略。 1.文件上传 1.1 上传方式 文件上传一般采用POST方式,将文件的二进制数据通过HTTP协议上行到服务端。上传过程中需要注意的是设置表单的enctype属性为multipart/form-data,这样可以支持上传文件类型的表单。 1.2 服务端实现 服务端往往需要采用特定的框架或库来…

    人工智能概览 2023年5月25日
    00
  • Python Opencv中获取卷积核的实现代码

    获取卷积核可以通过在Python Opencv中使用getStructuringElement函数来实现。该函数用于获取不同形状和大小的结构元素或卷积核。 具体实现如下: 1. 获取矩形卷积核 如下为实现获取3*3矩形卷积核的代码示例: import cv2 kernel_rect = cv2.getStructuringElement(cv2.MORPH_…

    人工智能概论 2023年5月24日
    00
  • 详解Django 中是否使用时区的区别

    要详细讲解Django中是否使用时区的区别,需要先了解时区的概念和Django中时区的应用。 时区是指地球上范围内某一区域内居民所需遵循的时间制度,通常以本初子午线拟定,可以分为东(+)西(-)各12个时区,总共24个时区。不同的时区根据经度的不同,会有一个固定的UTC(协调世界时间)偏移量。 在Django中,时区是由Python自带的pytz模块来实现的…

    人工智能概览 2023年5月25日
    00
  • Django中外键使用总结

    那么我会针对“Django中外键使用总结”进行一个完整的攻略。 什么是外键? 在数据库中,一个表可能会有外键(foreign key),外键通常被用作表之间的关联。外键就是用来关联两张表的字段,关联关系的建立可以在数据库层面来实现,也可以在业务逻辑层面实现。 Django中的外键 在Django中,外键是一个非常重要的概念,它用于建立模型类之间的关联。在Dj…

    人工智能概论 2023年5月25日
    00
  • Java单例模式下的MongoDB数据库操作工具类

    那我先简单介绍一下Java单例模式和MongoDB数据库操作。Java单例模式是一种设计模式,它可以确保一个类在整个应用程序中只有一个实例,并且提供了全局访问该实例的方式。而MongoDB是一种非关系型数据库,具有高性能、可伸缩的特点,支持大数据存储和处理。下面我将详细讲解如何在Java单例模式下编写MongoDB数据库操作工具类。 步骤一:创建单例模式类 …

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部