有了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开发手册:基础·实战·强化》这本书。
---点击上图,即可进入详情页面---