码迷,mamicode.com
首页 > 其他好文 > 详细

课程全文检索接口

时间:2020-10-18 09:21:28      阅读:18      评论:0      收藏:0      [点我收藏+]

标签:tps   stat   app   com   查询   templates   style   try   elastic   

1.基本介绍
前后端不分离:https://www.cnblogs.com/xiaonq/p/12363589.html

 

1.1 安装

pip install drf-haystack   # django的开源搜索框架

pip install whoosh         # 搜索引擎

pip install jieba          # 中文分词Jieba,由于Whoosh自带的是英文分词,对中文的分词支持 不是太好

 

1.2 什么是haystack?

  1.2.1 haystack是django的开源搜索框架,该框架支持 Solr,Elasticsearch,Whoosh, Xapian 搜索引 擎,不用更改代码,直接切换引擎,减少代码量。

  1.2.2 搜索引擎使用Whoosh,这是一个由纯Python实现的全文搜索引擎,没有二进制文件等,比较小 巧,配置比较简单,当然性能自然略低。

  1.2.3 中文分词Jieba,由于Whoosh自带的是英文分词,对中文的分词支持不是太好,故用jieba替换 whoosh的分词组件。 

 

2.配置使用

2.1 syl/settings.py 全文检索配置 

技术图片
‘‘‘1.注册app ‘‘‘
INSTALLED_APPS = [    
        haystack,   # haystack要放在应用的上面 
]

‘‘‘2.模板路径 ‘‘‘
TEMPLATES = [    
    {       
             DIRS: [os.path.join(BASE_DIR,templates)],
    }, 
]

‘‘‘3.全文检索配置‘‘‘
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 15
# 搜索出多条数据时需要分页
HAYSTACK_CONNECTIONS = {
    default: {
        # ‘ENGINE‘: ‘haystack.backends.whoosh_backend.WhooshEngine‘,
        ENGINE: course.whoosh_cn_backend.MyWhooshEngine,
        PATH: os.path.join(BASE_DIR, whoosh_index),  # 指定倒排索引 存放位置
  },
}



HAYSTACK_SIGNAL_PROCESSOR = haystack.signals.RealtimeSignalProcessor
syl/settings.py

 

2.2 在子应用下创建索引文件

#apps/course/search_indexes.py

# 文件名必须是 search_indexes.py 

技术图片
# 修改此处,类名为模型类的名称+Index,比如模型类为GoodsInfo,则这里类名为GoodsInfoIndex(其 实可以随便写) 

# from haystack import indexes
# from .models import Course
#
#
# class CourseIndex(indexes.SearchIndex, indexes.Indexable):
#     text = indexes.CharField(document=True, use_template=True)
#
#     def get_model(self):
#         return Course
#
#     def index_queryset(self, using=None):
#         return self.get_model().objects.all()

    


s
search_indexes.py

 

 

2.3 指定索引模板文件

templates/search/indexes/course/course_text.txt

# 创建文件路径命名必须这个规范:templates/search/indexes/应用名称/模型类名称 _text.txt

{{object.id}}

{{object.title}}

{{object.desc}}

 

2.4 修改为jieba分词中的中文分析器

技术图片
#
# from haystack.backends.whoosh_backend import WhooshEngine, WhooshSearchBackend
# from whoosh.fields import TEXT
# from jieba.analyse import ChineseAnalyzer
#
#
# class MyWhooshSearchBackend(WhooshSearchBackend):
#     def build_schema(self, fields):
#         (content_field_name, schema) = super().build_schema(fields)
#         schema._fields[‘text‘] = TEXT(stored=True,
#                                         analyzer = ChineseAnalyzer(),
#                                         field_boost = fields.get(‘text‘).boost,
#                                         sortable = True)
#         return (content_field_name, schema)
#
#
#
# class MyWhooshEngine(WhooshEngine):
#     backend = MyWhooshSearchBackend
apps/course/whoosh_cn_backend.py

 

2.5 课程全文检索接口视图函数

技术图片
# from syl import settings
# from django.core.paginator import InvalidPage, Paginator
# from haystack.forms import ModelSearchForm
# from django.http import JsonResponse
#
#
# RESULTS_PER_PAGE = getattr(settings, ‘HAYSTACK_SEARCH_RESULTS_PER_PAGE‘, 15)
#
#
# def course_index_search(request):
#
#     query = request.GET.get(‘q‘, None)
#     page = int(request.GET.get(‘page‘, 1))   # 第几页
#     page_size = int(request.GET.get(‘page_size‘, RESULTS_PER_PAGE)) #每页多少条
#     if query:
#         form = ModelSearchForm(request.GET, load_all=True) # 将查询条件传递给查询对 象
#         if form.is_valid():
#             results = form.search()  # 查询出来的最终数据
#         else:
#             results = []
#     else:
#         return JsonResponse({"code": 404, "msg": ‘No file found!‘, "data": []})
#
#
#     paginator = Paginator(results, page_size)
#     try:
#         page = paginator.page(page)  # 从分好的页中拿第几页
#     except InvalidPage: # 如果分页出错
#         return JsonResponse({"code": 404, "msg": ‘No file found!‘, "data": []})
#     jsondata = []
#     for result in page.object_list:   # 分页后的课程查询结果
#
#         data = {
#             ‘id‘: result.object.id,
#             ‘title‘: result.object.title,
#             ‘desc‘: result.object.desc,
#             ‘img‘: request.scheme + ‘://‘ ++request.META[‘HTTP_HOST‘]+result.object.img.url,
#              # ‘follower‘: result.object.follower,
#             ‘learner‘: result.object.learner,
#             ‘status‘: result.object.status,
#             ‘course_type‘: result.object.course_type.id
#         }
#         jsondata.append(data)
#     result = {
#         "code": 200,
#         "msg": ‘Search successfully!‘,
#         "data": {"count": page.paginator.count, "results": jsondata} }
#     return JsonResponse(result)
course/views.py

 

2.6 syl/urls.py添加路由

urlpatterns = [  

  path(‘search/‘, course_index_search),

]

 

2.7 命令构建倒排索引

python manage.py rebuild_index

 

3.测试课程全文检索

  测试接口

http://192.168.56.100:8888/search/?q=入门&page=1&page_size=1

课程全文检索接口

标签:tps   stat   app   com   查询   templates   style   try   elastic   

原文地址:https://www.cnblogs.com/xiaoxiamiaichiyu/p/13828671.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!