首页 > 其他分享 >django中关于全文检索的实现(搜索)

django中关于全文检索的实现(搜索)

时间:2024-06-22 15:00:35浏览次数:23  
标签:object py django 全文检索 搜索 urls import haystack

全文检索

全文检索不同于特定字段的模糊查询,使用全文检索的效率高,并且能够对中文进行分词处理

haystack:django的一个包,可以方便地对model 里面的内容进行索引,搜索,设计为whoosh,solr, Xapian,Elasticsearc四种全文检索引擎后端,属于全文检索的框架

whoosh:是纯python编写的全文搜索引擎,虽然性能上比不上sphinx,xapian,Elasticseara等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型站点,whoosh已经足够使用。

jieba: 一款免费的中文分词包,如果觉得不好用可以使用一些收费产品

操作

1,在django 开发虚拟环境中依次安装包(终端中执行)

pip install django-haystack
pip install whoosh
pip install jieba

2,创建项目test2,并将项目指定1中虚拟环境(终端中执行)

django-admin startproject test2

3, 创建应用searchtest(终端中执行)

python manage.py startapp searchtest

4, 注册应用(在setttings.py中进行设置)

INSTALLED_APPS = [
    ……,
    'searchtest'
]

5,创建模型类(models.py中创建)

from django.db import models


class HeroInfo(models.Models):
    name = models.CharField(max_length=20)
    content = models.charField(max_length=50)

6 , 生成迁移文件并且执行迁移(终端中执行)

python manage.py makemigrations
python manage.py migrate

7, 数据库中填入响应数据

8, 配置项目文件

需要在项目根目录建立templates文件夹

'DIRS': [os.path.join(BASE_DIR,'templates')],

9,编写模板文件

需要在templates文件夹中新建searchtest文件夹

在searchtest文件夹中新建index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>搜索页</title>
</head>
<body>

#此处 action方法不能更改
<form method='get' action="/search/" target="_blank">
<input type="text" name="q">
<input type="submit" value="查询">
</body>
</html>

10,创建视图函数(在view.py文件中)

def index(requset):
    return render(request, 'searchtest/index.html')

11, 配置应用url (在应用url.py文件中)

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views,index),
]

12, 配置项目url (在项目urls.py文件中)

from django.contrib import admin

from django.urls import path 

from django.conf.urls import url, include


urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^', include('searchtest.urls'))
]

13, 运行项目 (在终端中)

python manage.py runserver

http://127.0.0.1:8000/ 浏览器中查看搜索表单

如果在页面能看到表单 就完成了一个项目的基本配置,下面就可以添加全文搜索功能了

14, 创建索引类

在应用目录下建立search_indexes.py文件

from haystack import indexes
from .models import HeroInfo


class HeroInfoIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        return HeroInfo

    def index_queryset(self, using=None):
        return self.get_model().objects.all()

说明:

        1、如果想针对某个应用(如searchtest应用)作全文检索,则必须在应用的目录下面建立search_indexes.py文件,文件名不能修改。

                否则报错: No fields were found in anysearch_indexes

        2、Goodsinfolndex: 索引类,继承SearchIndex 和 Indexable

        3、类名必须 为需要检索的ModelName+Index,这里需要检索HeroInfo,所以创建HeroinfoIndex

        4、索引类的作用: 一本书的目录,可以为读者提供更快速的导航与查找。类似的我们需要为指定的数据添加一个索引(目录),来实现在大数据的搜索

        5、document=True, 这代表django haystack和搜索引擎将使用此字段的内容作为索引进行检索(primary field)。 每个索引类中必须有且只有一个字段document=True 。 一般约定此字段名为text, 这是SearchIndex类里一贯的命名,以防后台混乱,莫改。use_template=True,这样就允许我们使用数据模板去建立搜索引擎索引文件

15, 设置数据模板

在目录“templates/search/indexes/应用名称/"下创建: 模型类名称_text.txt 文件

heroinfo_text.txt 这里列出了要对哪些列的内容进行检索

{{ object.name }}
{{ object.content }}

 这个数据模板的作用是对HeroInfo.name、 HeroInfo.content

这两个字段建立索引,当检索的时候会对这两个字段做全文检索匹配,然后将匹配的结果排序后作为搜索结果返回

16,创建搜索结果页面

在目录‘templates/search/’下建立  search.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>搜索结果</title>
    </head>
    <body>
    {% if query %}
        <h3>搜索结果如下:</h3>
        {% for result in page.object_list %}
            <a href="/{{ result.object.id }}/">{{ result.object.name }}{{ result.object.content }}</a><br/>
        {% empty %}
            <p>啥也没找到</p>
        {% endfor %}
    {% endif %}
    </body>
</html>

说明: 

        变量query:搜索的字符串

        变量page:haystack对搜索结果做了分页, 传为模板的变量

        page有object_list属性,它是一个list,里面包含一页所要展示的model 对象集合

对其循环显示,即{% for result in page.object_list %}

result.object.id, result,object.hname:从result的object属性中获取数据

17,修改搜索引擎为中文分词

复制Lib\site-packages\haystack\backends\whoosh_backend.py文件,粘贴到应用目

录下(这里是booktest)改名为whoosh_cn_backend.py

from jieba.analyse import ChineseAnalyzer
查找
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()

18, 修改setting.py文件

添加应用

INSTALLED_APPS = (
...
'haystack',
)

添加搜索引擎

HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'booktest.whoosh_cn_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}

分页设置

HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10
设置对搜索结果的分页,每10项结果为一页。

#索引生成设置

HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
这里设置实时更新索引

19,在项目的urls.py中添加url 

urlpatterns = [
...
url(r'^search/', include('haystack.urls')),
]

路径:Lib\site-packages\haystack\urls.py,查看haystack.urls的内容为:

from django.conf.urls import url
from haystack.views import SearchView
urlpatterns = [
ur l(r'^$', SearchView(), name='haystack_search'),
]

结论:

搜索的视图函数和URL模式 django haystack 都已经帮我们写好了,只需要项目的 urls.py 中包含它就可以了

SearchView()视图函数默认使用的html模板路径为templates/search/search.html

20, 生成索引

初始化索引数据(在终端中)

python manage.py rebuild_index

标签:object,py,django,全文检索,搜索,urls,import,haystack
From: https://blog.csdn.net/li2437948121/article/details/139881901

相关文章

  • [AI资讯·0622] Claude3.5超越GPT-4o,360推出AI搜索,OpenAI收购Rockset,华为发布大模型
    AI资讯「网红」周鸿祎,要为AI带货突发!OpenAI收购数据公司盘古5.0重磅发布!华为云大模型年度杀招来了,人形机器人现场整活GPT-4o一夜被赶超!Anthropic推出Claude3.5,网友3分钟克隆马里奥游戏中国人自己的操作系统!余承东掏出纯血鸿蒙,华为AI大招硬刚苹果Claude3.5突然发布!GPT-4o......
  • 新闻管理与推荐系统Python+Django+协同过滤推荐算法+管理系统
    一、介绍新闻管理与推荐系统。本系统使用Python作为主要开发语言开发的一个新闻管理与推荐的网站平台。网站前端界面采用HTML、CSS、BootStrap等技术搭建界面。后端采用Django框架处理用户的逻辑请求,并将用户的相关行为数据保存在数据库中。通过Ajax技术实现前后端的数据通信。......
  • 基于Django的智慧校园考试的设计与实现
    一、项目背景1.1项目研究背景在信息技术日益发展的今天,传统的教育模式正面临着重大的挑战与改革。尤其是在全球新冠疫情的影响下,线上教学模式成为常态,这促使学校、教育机构急需一套高效、可靠且用户友好的在线考试系统来适应这一变化。基于这样的背景,我们提出了开发“智慧校......
  • django中的信号机制
    django中的信号机制1.1什么是信号机制#什么是信号机制Django框架包含了一个信号机制,它允许若干个发送者(sender)通知一组接收者(receiver)某些特定操作或事件(events)已经发生了,接收者收到指令信号(signals)后再去执行特定的操作。1.2信号的工作机制Django中的信号工作机......
  • C/C++ stack实现深度优先搜索DFS算法详解及源码
    深度优先搜索(DepthFirstSearch,DFS)是一种图遍历算法,它从一个节点开始,通过访问其相邻节点的方式,依次深入到图中的更深层次。Stack(栈)是一种先进后出(LastInFirstOut,LIFO)的数据结构,它非常适合实现DFS算法。首先,我们来解释一下Stack实现DFS算法的原理。DFS算法的核心思想是......
  • Django REST framework安全实践:轻松实现认证、权限与限流功能
    系列文章目录Django入门全攻略:从零搭建你的第一个Web项目DjangoORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作DjangoORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解DjangoORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践跨域问题与Django解......
  • 硬件开发笔记(二十一):外部搜索不到的元器件封装可尝试使用AD21软件的“ManufacturerPart
    前言  这是一个AD的一个强大的新功能,能招到元器件的原理图、3D模型还有价格厂家,但是不一定都有,有了也不一定有其3D模型。ManufacturerPartSearch在设计工具中选择即用型元件  直接搜索,搜索到需要使用的元器件。在AltiumDesigner中,直接选中设备元件。无需使用第......
  • python web框架哪家强?Flask、Django、FastAPI对比
    前言当你掌握了python的基础知识,并且会用和HTML和CSS编写简单的静态网页。现在你只需再掌握一个pythonweb框架的知识,就可以开始编写一个动态的网站了。目前市面比较流程的pythonweb框架有三个flask、Django、FastAPI。接下来我们对比一下。他们三个各自有什么特点。Flas......
  • Day57 代码随想录打卡|二叉树篇---修建二叉搜索树
    题目(leecodeT669):给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树 不应该 改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在 唯一的答......
  • 6.21-二叉搜索树的最近公共祖先
    235.二叉搜索树的最近公共祖先题意描述:给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”......