zoukankan      html  css  js  c++  java
  • 课程全文检索接口

    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

  • 相关阅读:
    [Compose] 12. Two rules about Funtors
    [Compose] 11. Use Task for Asynchronous Actions
    [React Native] Animate Styles of a React Native View with Animated.timing
    [Compose] 10. Capture Side Effects in a Task
    [Angular Router] Lazy loading Module with Auxiliary router
    注重实效的程序员——途径篇
    UVa 674: Coin Change
    apache POI 导出excel相关方法
    Java调用R(二)_JRI
    drp用户管理完成后,asp.net与java的一个简单比较
  • 原文地址:https://www.cnblogs.com/xiaoxiamiaichiyu/p/13828671.html
Copyright © 2011-2022 走看看