1、搜索功能分析html
思考:若是咱們要作一個經過關鍵詞搜索文章的功能,須要搜索哪些字段,以及使用什麼技術方案?python
搜索字段:mysql
1,字段linux
2,內容sql
3,做者docker
技術方案:django
1,mysql的模糊查詢%like%架構
1,優勢:實現起來簡單app
2,缺點:數據量比較大的狀況下,查詢效率極低框架
2,全文檢索引擎
1,優勢:專業的全文檢索引擎,效率高
2,缺點:實現起來比較複雜
選擇使用全文檢索引擎,自行實現django框架和全文檢索引擎的代碼比較麻煩,選用django的
第三方包djangohaystack。它支持多鍾全文檢索引擎,本項目選擇最流行的全文檢索引擎之一
elasticsearch
2、elasticsearch介紹
elasticsearch原理:http://developer.51cto.com/art/201904/594615.htm
3、docker介紹
1.docker介紹與安裝
~介紹
1,什麼是docker?
~簡化建立,部署,運行應用程序的一個工具
~打包應用程序所需的庫和依賴環境
~精簡的虛擬機
2.爲何使用docher?
流行、方便、強大
3.docker vs 虛擬機
體積更小、運行更快、集成擴展更好
4.docker架構
~架構
~客戶端
~守護進程
~倉庫
~docker對象
~鏡像 精簡linux
~容器
~服務
~docker Hub
安裝
官方安裝文檔:https://www.docker.com/
lsb_release -a #查看系統信息
5、新聞搜索功能實現
1,業務流程分析
判斷是否傳遞查詢參數q
若是沒有傳遞q,則直接返回熱門新聞數據
若是沒有傳遞,則返回查詢結果
2,接口設計
1.接口說明:
類目 說明
請求方法 GET
url定義 /news/search/
參數格式 查詢參數
2.參數說明:
參數名 類型 是否必須 描述
q 字符串 否 查詢的關鍵字
page 整數 否 頁碼
3.返回結果:
搜索頁面html
1.建立haystack數據模型
news/search_indexes 文件代碼
from haystack import indexes
from .models import News
class NewsIndex(indexes.SearchIndex, indexes.Indexable):
"""
這個模型的做用相似於django的模型,它告訴haystack哪些數據會被
放到查詢返回的模型對象中,以及經過哪些字段進行索引和查詢
"""
text = indexes.CharField(document=True, use_template=True)
id = indexes.CharField(model_attr='id')
title = indexes.CharField(model_attr='title')
digest = indexes.CharField(model_attr='digest')
content = indexes.CharField(model_attr='content')
image_url = indexes.CharField(model_attr='image_url')
def get_model(self):
"""
返回創建索引的模型
:return:
"""
return News
def index_queryset(self, using=None):
"""
返回要創建索引的數據查詢集
:param using:
:return:
"""
return self.get_model().objects.filter(is_delete=False)
2,建立索引數據模版
templates/search/indexes/news/news_text.txt 文件
{{ object.title }}
{{ object.digest }}
{{ object.content }}
{{ object.author.username }}
3,建立索引
虛擬機進入項目根目錄
運行命令:python manage.py -h
python manage.py rebuild_index
代碼:
news/templatetags/news_template_filters.py
from django import template
register = template.Library()
@register.filter()
def page_bar(page):
page_list = []
if page.number != 1:
page_list.append(1)
if page.number - 3 > 1:
page_list.append('...')
if page.number - 2 > 1:
page_list.append(page.number - 2)
if page.number - 1 > 1:
page_list.append(page.number -1)
page_list.append(page.number)
if page.paginator.num_pages > page.number + 1:
page_list.append(page.number + 1)
if page.paginator.num_pages > page.number + 2:
page_list.append(page.number + 2)
if page.paginator.num_pages > page.number + 3:
page_list.append('...')
if page.paginator.num_pages != page.number:
page_list.append(page.paginator.num_pages)
return page_list
apps/news/views.py 代碼
class NewsSearchView(SearchView): """ 新聞搜索視圖 url: /news/search/ """ # 配置搜索模板文件 template_name = 'news/search.html' def get(self, request, *args, **kwargs): # 1. 獲取查詢參數 query = request.GET.get('q') if not query: # 2. 若是沒有查詢數 # 返回熱門新聞 hot_news = HotNews.objects.select_related('news__tag').only('news__title', 'news__image_url', 'news_id', 'news__tag__name').filter(is_delete=False).order_by('priority', '-news__clicks') # 分頁 paginator = Paginator(hot_news, settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE) try: page = paginator.get_page(int(request.GET.get('page'))) except Exception as e: page = paginator.get_page(1) return render(request, self.template_name, context={ 'page': page, 'query': query }) else: # 3. 若是有怎麼辦 return super().get(request, *args, **kwargs) def get_context_data(self, *args, **kwargs): """ 在context中添加變量page :param args: :param kwargs: :return: """ context = super().get_context_data(*args, **kwargs) if context['page_obj']: context['page'] = context['page_obj'] return context