有了Django,实现站内搜索引擎并不难~

优采云 发布时间: 2022-06-06 12:59

  有了Django,实现站内搜索引擎并不难~

  使用Haystack模块可以很方便地实现站内全局搜索引擎。下面请跟随小编一起来看看怎么实现吧!

  案例效果预览

  

  案例准备

  本系统的软件开发及运行环境具体如下:

  业务流程

  在使用Haystack配置站内全局搜索引擎前,需要先了解实现该业务的主要流程,根据该需求设计出如图1所示的业务流程图。

  

  图1 业务流程

  实现过程

  HayStack是Django的一个开源框架,提供了非常方便的搜索功能,它支持Solr、Elasticsearch、Whoosh、Xapian多种搜索引擎。本案例将使用Whoosh搜索引擎,但是Whoosh的分词组件不支持中文搜索,所以需要使用中文分词Jieba来替换Whoosh的分词组件实现中文全文搜索的功能。

  1.准备环境

  由于本文新建文件较多,请依照下图2自行新建文件,不可随意更改文件名称。

  

  图2 search模块文件*敏*感*词*

  search模块下的urls.py文件为匹配路由,search_indexes.py文件来定义索引类,whoosh_cn_backend.py来将Jieba分词组件添加到搜索引擎中使其支持中文搜索,serach.html为前端模板文件,product_text.txt为搜索引擎索引模板文件。

  创建完成后,执行以下命令,通过pip安装Whoosh搜索引擎和Jieba分词

  01 pip install Django-haystack

  02 pip install whoosh

  03 pip install jieba

  2.注册模块

  接下来在项目的settings.py文件中注册模块和引入HayStack,具体代码如下:

  04 INSTALLED_APPS = [

  05 'django.contrib.admin',

  06 'django.contrib.auth',

  07 'django.contrib.contenttypes',

  08 'django.contrib.sessions',

  09 'django.contrib.messages',

  10 'django.contrib.staticfiles',

  11 'haystack',

  12 'apps.search', #全局搜索模块

  13 ]

  14 #配置HayStack

  15 HAYSTACK_CONNECTIONS = {

  16 'default': {

  17 #设置搜索引擎,文件是apps下的serach的whoosh_cn_backend.py

  18 #如果search模块未在apps下请自行替换或者去掉apps

  19 'ENGINE':'apps.search.whoosh_cn_backend.WhooshEngine',

  20 'PATH': os.path.join(BASE_DIR,'whoosh_index'),

  21 'INCLUDE_SPELLING':True,

  22 },

  23 }

  24 #设置每页显示的数据量

  25 HAYSTACK_SEARCH_RESULTS_PER_PAGE = 2

  26 #当数据库改变时,自动更新索引

  27 HAYSTACK_SIGNAL_PROCESSOR ='haystack.signals.RealtimeSignalProcessor'

  3.配置搜索引擎

  在Python的安装目录下打开Lib\site-packages\haystack\backends\shoosh_backend.py文件,将全文复制到新建的whoosh_cn_backend.py文件中,修改如下内容:

  01 #顶部添加 引入jieba分词器模块

  02fromjieba.analyseimportChineseAnalyzer

  03 #在166行左右找到如下代码

  04 schema_fields[field_class.index_fieldname] =TEXT(stored=True,analyzer=StemmingAnalyzer(),field_boost=field_class.boost,sortable=True)

  05 #将其修改为如下格式

  06 schema_fields[field_class.index_fieldname] = TEXT(stored=True,analyzer=ChineseAnalyzer(),field_boost=field_class.boost,sortable=True)

  修改完成后,在search模块下models.py文件中创建新的数据模型作为搜索引擎的搜索对象,具体代码如下:

  01fromdjango.dbimportmodels

  02classPoetry(models.Model):

  03 id = models.AutoField('序号',primary_key=True)

  04 name = models.CharField('名称',max_length=50)

  05 author = models.CharField('作者',max_length=20)

  06 detail = models.CharField('内容',max_length=300)

  07 #设置返回值

  08 def__str__(self):

  09 returnself.name

  接下来创建搜索引擎的索引,在数据量非常大的时候,我们就需要为指定的数据添加一个索引,来使搜索引擎快速找到符合条件的数据,所以在search_indexes.py中定义该模型的索引类,注意该文件名称不可改变,具体代码如下:

  01 #本文件名称不允许修改,否则将无法创建索引

  02fromhaystackimportindexes

  03fromapps.search.modelsimportPoetry

  04 #类名必须为模型名+Index,比如模型Poetry,则索引类为PoetryIndex

  05 #其对应的索引模板路径应为/项目的应用模块名称/templates/search/indexes/项目的应用模块名称/模型(小写)_text.txt

  06classPoetryIndex(indexes.SearchIndex, indexes.Indexable):

  07 # doucument=True代表搜索引擎将使用此字段的内容作为索引进行检索

  08 # use_template=True代表使用索引模板建立索引文件

  09 text = indexes.CharField(document=True,use_template=True)

  10 #将索引类与模型Poetry进行绑定

  11 defget_model(self):

  12 returnPoetry

  13 #设置索引的查询范围

  14 defindex_queryset(self, using=None):

  15 returnself.get_model().objects.all()

  添加完成后,在索引模板poetry_text.txt文件中设置索引的检索字段,添加如下具体代码:

  16 # templates/search/indexes/search/poetry_text.txt

  17 {{ object.name }}

  18 {{ object.author }}

  19 {{ object.detail }}

  现在已经定义了索引类,和索引模板,接下来根据这两者,通过命令python manage.py rebuild_index 创建索引文件,创建成功后会在项目文件夹下可以看到whoosh_index文件夹,该文件夹中包含索引文件。

  后面还有业务逻辑和渲染模板等内容。如果想要获得更详细的步骤和代码的话,可以参考《Python Web开发手册:基础·实战·强化》这本书。

  

  ---点击上图,即可进入详情页面---

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线