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日

相关文章

  • echarts动态获取Django数据的实现示例

    下面我会详细讲解“echarts动态获取Django数据的实现示例”的完整攻略。 1. 准备工作 第一步,需要安装ECharts和Django,可以使用以下命令: pip install django pip install echarts 第二步,创建一个Django项目: django-admin startproject myproject cd my…

    人工智能概论 2023年5月25日
    00
  • Docker consul的容器服务更新与发现的问题小结

    Docker Consul的容器服务更新与发现的问题小结 什么是Docker Consul Docker Consul是Docker容器中使用的服务发现工具。它可以自动发现部署在Docker容器中的服务,让它们可以相互通信,并随时通知变化。让容器与容器之间的通信变得更加便捷。Consul支持多种服务发现方式,包括DNS,HTTP API等。 服务更新的问题 …

    人工智能概览 2023年5月25日
    00
  • Android四大组件之broadcast广播详解

    Android四大组件之broadcast广播详解 在Android应用中,Broadcast广播是一种非常重要的组件。它可以在应用内部或应用之间传递消息,帮助我们处理系统级别的事件,比如网络状态变化、电池电量变化、时间时钟等,同时也可以自定义消息传递,使我们的应用更加灵活。 一、Broadcast广播的概念及其种类 Broadcast广播时一种异步的消息收…

    人工智能概览 2023年5月25日
    00
  • vue2.0+koa2+mongodb实现注册登录

    下面是“vue2.0+koa2+mongodb实现注册登录”的完整攻略。 一、前言 本文将详细介绍如何使用 Vue2.0 + Koa2 + Mongodb 实现注册登录功能,并提供两个示例(前端和后端)来帮助您更好地理解实现过程。 二、技术选型 我们选择使用以下技术进行实现: 1. 前端 Vue2.0 + Vue-router + Vuex + axios …

    人工智能概论 2023年5月24日
    00
  • Python 数据库操作 SQLAlchemy的示例代码

    下面是使用Python操作数据库的SQLAlchemy库的示例代码攻略。 安装SQLAlchemy库 首先需要安装SQLAlchemy库。可以使用pip包管理工具进行安装,命令如下: pip install sqlalchemy 连接数据库 连接数据库需要根据具体数据库类型进行不同的配置。下面是连接MySQL数据库的示例代码: from sqlalchemy…

    人工智能概论 2023年5月25日
    00
  • Android开发手机无线调试的方法

    下面是“Android开发手机无线调试的方法”的完整攻略: 准备工作 确保你的Android手机和电脑处于同一个Wi-Fi网络中。 下载并安装Android-SDK(包含Android-Debug-Bridge)和adb。 步骤一:使用USB连接将设备连接到计算机 在第一次连接手机的时候,需要USB线连接电脑。 执行以下命令: $ adb devices 如…

    人工智能概览 2023年5月25日
    00
  • C++命名空间实例详解

    C++命名空间实例详解 什么是命名空间 在C++中,命名空间是为了避免不同代码库之间的命名冲突而提出的概念,类似于文件夹的概念,可以将许多具有相似性质的函数、变量、类等放在同一个命名空间下,通过命名空间限定符来访问。 命名空间的使用 在C++中,命名空间可以通过namespace关键字定义,可以通过using关键字来使用命名空间中的内容。 命名空间定义 命名…

    人工智能概览 2023年5月25日
    00
  • python实现五子棋游戏(pygame版)

    Python实现五子棋游戏(Pygame版)攻略 简介 本攻略介绍如何使用Python和Pygame库来实现五子棋游戏。五子棋游戏是一种以黑白两色棋子在棋盘上交替放置,并试图在横、竖、对角线上连成一条线的场景。游戏开发过程需要包括界面设计、事件处理、胜负判断等多个方面的知识。 准备工作 安装Python和Pygame库:可以在官网上下载相应的安装包,并按照提…

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