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日

相关文章

  • 利用Go语言初步搭建一个web应用的教程

    以下是利用Go语言初步搭建一个web应用的攻略: 第一步:安装Go语言 首先,我们需要安装Go语言才能进行后续的操作。你可以到Go官网(https://golang.google.cn/)下载对应操作系统的安装文件。安装完成后,你需要设置GOPATH环境变量指向你的工作目录,以便管理依赖包和代码。 第二步:选择框架 Go语言拥有许多优秀的Web框架,如Gin…

    人工智能概论 2023年5月25日
    00
  • Python跑循环时内存泄露的解决方法

    当Python程序执行循环操作时,会产生一些垃圾对象,如果不及时释放,就会导致内存泄露,最终程序会崩溃。下面是解决Python内存泄露的一些方法: 使用生成器和迭代器 生成器和迭代器都是Python语言的高级特性,能够在占用内存的同时实现循环操作。使用生成器可以避免将所有的结果同时存入内存中,而是在需要的时候逐个产生结果。使用迭代器的方式可以避免将所有的数据…

    人工智能概论 2023年5月24日
    00
  • Python Django切换MySQL数据库实例详解

    下面是关于Python Django切换MySQL数据库实例的完整攻略: 1. 安装MySQL数据库 如果还没有安装MySQL数据库,请先按照官方指南进行安装:MySQL官方文档 2. 安装Python Django框架 如果还没有安装Python Django框架,请先按照官方指南进行安装:Django官方文档 3. 创建Django项目和应用 创建Dja…

    人工智能概论 2023年5月25日
    00
  • Python入门教程(四十一)Python的NumPy数组索引

    以下是关于“Python入门教程(四十一)Python的NumPy数组索引”的完整攻略: Python的NumPy数组索引 在Python的NumPy中,我们可以使用多种方法对数组进行索引。以下是常用的几种方式。 基本索引 基本索引是指使用“[ ]”进行索引,可以使用整数或布尔数组作为索引值。 整数索引 我们通常使用整数索引从数组中获取单个元素,同样可以使用…

    人工智能概览 2023年5月25日
    00
  • nginx配置SSL证书实现https服务的方法

    下面是关于Nginx配置SSL证书实现HTTPS服务的方法的完整攻略: 1. 生成SSL证书 首先需要生成SSL证书,可以通过以下命令生成: sudo apt-get update sudo apt-get install openssl sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -ke…

    人工智能概览 2023年5月25日
    00
  • Nginx在Windows下的安装与使用过程详解

    Nginx在Windows下的安装与使用过程详解 安装步骤 第一步:下载Nginx安装包 从Nginx官网下载Windows下的最新版安装包(zip格式),并解压到目标文件夹中。 第二步:创建配置文件 在Nginx目录下,创建conf目录,并在其中创建nginx.conf文件。 第三步:编辑配置文件 在nginx.conf文件中填写Nginx的基础配置,包括…

    人工智能概览 2023年5月25日
    00
  • 基于opencv+java实现简单图形识别程序

    基于OpenCV和Java实现简单图形识别程序的攻略分为以下几个步骤: 安装OpenCV 下载并安装OpenCV,在官网的下载页面(https://opencv.org/releases/)中选择适合自己操作系统的版本进行下载。 解压下载好的压缩包到本地。 将OpenCV添加到系统PATH环境变量中,在Windows操作系统中可在“环境变量”中设置。 配置J…

    人工智能概览 2023年5月25日
    00
  • 苹果iOS 15正式发布:全新通知界面、天气、照片、钱包大改进

    苹果iOS 15正式发布:全新通知界面、天气、照片、钱包大改进 苹果iOS 15于2021年9月20日正式发布,为苹果设备用户带来了许多全新的功能和改进。以下是iOS 15的详细攻略。 1. 全新通知界面 iOS 15的通知管理得到了全面优化和改进,包括重要联系人和应用通知的高亮显示、通知摘要、通知分类等等。此外,用户可以根据需求进行通知屏蔽或者设定静音时间…

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