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

目录
  • 前言
  • 第一步:首先安装相关的依赖包
  • 第二步:在django项目配置文件settings.py中注册应用
  • 第三步:在django项目配置文件settings.py中指定搜索的后端
  • 第四步:创建索引类
  • 第五步:在templates目录中创建text字段使用的模板文件
  • 第六步:手动更新索引
  • 第七步:创建haystack序列化器
  • 第八步:创建视图类
  • 第九步:添加路由
  • 第十步:结果

前言

说到搜索,第一时间想到的是mysql数据库的like语句

但是,假如你的数据库有几千万条数据,name字段没有索引,可能查询需要十几分钟,用户可能会等你?那为什么不给name字段增加索引?数据表不仅仅是用来查询,也会经常修改数据,新增删除数据等。建立索引后,做增删改操作时也会大大占用数据库资源。所以应该怎么解决呢?

Elasticsearch!

一个强大的基于Lucene的全文搜索服务器!维基百科、Stack Overflow、Github都在用。

如果想详细了解其原理的话,可以参考:https://www.elastic.co/guide/index.html

第一步:首先安装相关的依赖包

pip install drf-haystack
pip install elasticsearch
pip install djangorestframework

第二步:在django项目配置文件settings.py中注册应用

INSTALLED_APPS =
[
'app.apps.AppConfig',
'haystack',
'rest_framework'
]

第三步:在django项目配置文件settings.py中指定搜索的后端

HAYSTACK_CONNECTIONS = {
'default':    {
            'ENGINE':'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
            'URL': 'http://127.0.0.1:9200/', # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
            'INDEX_NAME': 'test', # 指定elasticsearch建立的索引库的名称
            },
            }
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 指定搜索结果每页的条数
# HAYSTACK_SEARCH_RESULTS_PER_PAGE = 1

第四步:创建索引类

在此之前要先创建model类,并插入数据

from django.db import models
class Es(models.Model):
    name=models.CharField(max_length=32)
    desc=models.CharField(max_length=32)

在需要进行索引的应用的目录下创建文件search_indexes.py, 在该文件内创建该索引类
我在app应用下创建:search_indexes.py

# 索引模型类的名称必须是 模型类名称 + Index
from haystack import indexes
from .models import Es
class EsIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    def get_model(self):
    """返回建立索引的模型类"""
        return Es
    def index_queryset(self, using=None):
    """返回要建立索引的数据查询集"""
        return self.get_model().objects.all()

第五步:在templates目录中创建text字段使用的模板文件

创建文件templates/search/indexes/app/es_text.txt文件中定义

{{ object.name }}
{{ object.desc }}

第六步:手动更新索引

python manage.py rebuild_index   #数据库有多少条数据,全部会被同步到es中

第七步:创建haystack序列化器

from drf_haystack.serializers
import HaystackSerializer
from rest_framework.serializers
import ModelSerializer from app
import models
from app.search_indexes import EsIndex
class EsSerializer(ModelSerializer):
    class Meta:
        model=models.Es
        fields='__all__'
class EsIndexSerializer(HaystackSerializer):
     object = EsSerializer(read_only=True) # 只读,不可以进行反序列化
     class Meta:
        index_classes = [EsIndex]# 索引类的名称
        fields = ('text', 'object')# text 由索引类进行返回, object 由序列化类进行返回,第一个参数必须是text

第八步:创建视图类

from drf_haystack.viewsets
import HaystackViewSet
from app.models import Book
from app.serializers import EsIndexSerializer
class EsSearchView(HaystackViewSet):
    index_models = [Es]
    serializer_class = EsIndexSerializer

第九步:添加路由

from django.conf.urls
import url from django.contrib
import admin
from rest_framework import routers
from app.views import EsSearchView
    router = routers.DefaultRouter()
    router.register("book/search", EsSearchView, base_name="book-search")
    urlpatterns = [ url(r'^admin/', admin.site.urls), ]
    urlpatterns += router.urls

第十步:结果

http://127.0.0.1:8000/?text=测试

到此这篇关于Django对接elasticsearch实现全文检索的示例代码的文章就介绍到这了,更多相关Django elasticsearch实现全文检索内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Django Haystack 全文检索与关键词高亮的实现

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到HelloGitHub-Team 仓库 博客提供 RSS 订阅应该是标配,这样读者就可以通过一些聚合阅读工具订阅你的博客,时时查看是否有文章更新,而不必每次都跳转到博客上来查看.现在我们就来为博客添加 RSS 订阅功能. 在此之前我们使用了 Django 内置的一些方法实现了一个简单的搜索功能.但这个搜索功能实在过于简单,没有多大的实用性.对于一个搜索引擎来说,至少应该能够根据用户的搜索关键词对搜索结果进行排序以及高亮关键

  • django haystack实现全文检索的示例代码

    全文检索里的组件简介 1. 什么是haystack? 1. haystack是django的开源搜索框架,该框架支持Solr,Elasticsearch,Whoosh, *Xapian*搜索引擎,不用更改代码,直接切换引擎,减少代码量. 2. 搜索引擎使用Whoosh,这是一个由纯Python实现的全文搜索引擎, 没有二进制文件等,比较小巧,配置比较简单,当然性能自然略低. 3. 中文分词Jieba,由于Whoosh自带的是英文分词,对中文的分词支持不是太好,故用jieba替换whoosh的分词

  • python django使用haystack:全文检索的框架(实例讲解)

    haystack:全文检索的框架 whoosh:纯Python编写的全文搜索引擎 jieba:一款免费的中文分词包 首先安装这三个包 pip install django-haystack pip install whoosh pip install jieba 1.修改settings.py文件,安装应用haystack, 2.在settings.py文件中配置搜索引擎 HAYSTACK_CONNECTIONS = { 'default': { # 使用whoosh引擎 'ENGINE': '

  • 解决Django Haystack全文检索为空的问题

    Django Haystack全文检索为空, 问题:表单中的name被改了 注意:name一定是q,否则检索不到结果 <form method='get' action="/search/" target="_blank"> <input type="text" name="q"> <input type="submit" value="查询"> &l

  • Django实现全文检索的方法(支持中文)

    PS: 我的检索是在文章模块下 forum/article 第一步:先安装需要的包: pip install django-haystack pip install whoosh pip install jieba 第二步: 配置需要的文件 settings.py 添加haystack应用模块 INSTALLED_APPS = ( ... 'haystack', ... ) 在settings.py 末尾添加 HAYSTACK_CONNECTIONS = { 'default': { 'ENGI

  • Python中使用haystack实现django全文检索搜索引擎功能

    前言 django是python语言的一个web框架,功能强大.配合一些插件可为web网站很方便地添加搜索功能. 搜索引擎使用whoosh,是一个纯python实现的全文搜索引擎,小巧简单. 中文搜索需要进行中文分词,使用jieba. 直接在django项目中使用whoosh需要关注一些基础细节问题,而通过haystack这一搜索框架,可以方便地在django中直接添加搜索功能,无需关注索引建立.搜索解析等细节问题. haystack支持多种搜索引擎,不仅仅是whoosh,使用solr.elas

  • Django中使用Whoosh进行全文检索的方法

    Whoosh 是纯Python实现的全文搜索引擎,通过Whoosh可以很方便的给文档加上全文索引功能. 什么是全文检索 简单讲分为两块,一块是分词,一块是搜索.比如下面一段话: 上次舞蹈演出直接在上海路的弄堂里 比如我们现在想检索上次的演出,通常我们会直接搜索关键词: 上次演出 ,但是使用传统的SQL like 查询并不能命中上面的这段话,因为在 上次 和 演出 中间还有 舞蹈 .然而全文搜索却将上文切成一个个Token,类似: 上次/舞蹈/演出/直接/在/上海路/的/弄堂/里 切分成Token

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

    目录 前言 第一步:首先安装相关的依赖包 第二步:在django项目配置文件settings.py中注册应用 第三步:在django项目配置文件settings.py中指定搜索的后端 第四步:创建索引类 第五步:在templates目录中创建text字段使用的模板文件 第六步:手动更新索引 第七步:创建haystack序列化器 第八步:创建视图类 第九步:添加路由 第十步:结果 前言 说到搜索,第一时间想到的是mysql数据库的like语句 但是,假如你的数据库有几千万条数据,name字段没有索

  • django filters实现数据过滤的示例代码

    常用 当前循环. 作用 default 数据为空时设置默认值 length 取变量长度 filesizeformat 文件大小转成可读 slice 从指定位置到指定位切片 date datetime取到的时间,转成指定格式 safe 防止XSS攻击.加上safe才能传标签 truncatechars 取摘显示一段剩下的- 例子 {#格式 值|函数#} {# 如果没有值,那么使用默认值#} <p>{{ bucunzai|default:'空的哦' }}</p> {# 取出变量长度#}

  • django+vue实现注册登录的示例代码

    注册 前台利用vue中的axios进行传值,将获取到的账号密码以form表单的形式发送给后台. form表单的作用就是采集数据,也就是在前台页面中获取用户输入的值.numberValidateForm:前台定义的表单 $axios使用时需要在main.js中全局注册,.then代表成功后进行的操作,.catch代表失败后进行的操作 submitForm(formName) { let data = new FormData() data.append('username',this.number

  • Python+Django实现简单HelloWord网页的示例代码

    目录 安装Django 创建Django项目 默认文件 创建APP 实现简单HelloWord网页 启动django项目 安装Django 使用anaconda在python环境中安装django包 pip install django 创建Django项目 使用django-admin在命令行创建 django-admin startproject myproject 专业版PyCharm创建django项目 默认文件 在创建完项目后,会生成和项目同名的目录,以及一个manage.py文件 1

  • springboot集成ES实现磁盘文件全文检索的示例代码

    最近有个朋友咨询如何实现对海量磁盘资料进行目录.文件名及文件正文进行搜索,要求实现简单高效.维护方便.成本低廉.我想了想利用ES来实现文档的索引及搜索是适当的选择,于是就着手写了一些代码来实现,下面就将设计思路及实现方法作以介绍. 整体架构 考虑到磁盘文件分布到不同的设备上,所以采用磁盘扫瞄代理的模式构建系统,即把扫描服务以代理的方式部署到目标磁盘所在的服务器上,作为定时任务执行,索引统一建立到ES中,当然ES采用分布式高可用部署方法,搜索服务和扫描代理部署到一起来简化架构并实现分布式能力. 磁

  • django的登录注册系统的示例代码

    摘要 django框架本身自带有登录注册,也可以自己写登录注册,下面将介绍这这2种方式实登录注册 一.自己写登录注册登出 1.注册regist 注册采用的是form表单,提交到数据库,在登录的时候,查询数据看,看用户有没有注册,如果用户没有注册,则返回注册页面注册 (1)models.py文件里创建相关的字段: 用户名字/用户密码/cookies携带的ticket from django.db import models # Create your models here. class User

  • Django中使用第三方登录的示例代码

    OAuth2.0是什么 OAuth的英文全称是Open Authorization,它是一种开放授权协议.OAuth目前共有2个版本,2007年12月的1.0版(之后有一个修正版1.0a)和2010年4月的2.0版,1.0版本存在严重安全漏洞,而2.0版解决了该问题. OAuth简单说就是一种授权的协议,只要授权方和被授权方遵守这个协议去写代码提供服务,那双方就是实现了OAuth模式. OAuth2.0实现第三方登录的流程 例如你想登录豆瓣去看看电影评论,但你丫的从来没注册过豆瓣账号,又不想新注

  • Django+Vue实现WebSocket连接的示例代码

    近期有一需求:前端页面点击执行任务,实时显示后端执行情况,思考一波:发现 WebSocket 最适合做这件事. 效果 测试 ping www.baidu.com 效果 点击连接建立ws连接 后端实现 所需软件包 后端主要借助Django Channels 实现socket连接,官网文档链接 这里想实现每个连接进来加入组进行广播,所以还需要引入 channels-redis . pip channels==2.2.0 channels-redis==2.4.0 引入 settings.py INS

  • Django使用Jinja2模板引擎的示例代码

    Jinja2模板引擎 安装Jinja2 :pip install jinja2,在应用目录下添加jinja2_env.py设定环境变量. from django.contrib.staticfiles.storage import staticfiles_storage from django.urls import reverse from jinja2 import Environment def environment(**options): env = Environment(**opt

随机推荐