标签: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‘
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
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
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)
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