新聞搜索

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
相關文章
相關標籤/搜索