まず、検索機能解析
質問:私たちは検索するために必要なフィールドの記事、そしてどのような技術ソリューションを通じてキーワード検索機能をすれば?
検索フィールド:
1、フィールド
2、コンテンツ
3本の著者
技術的な解決策:
1、mysqlの%のようなあいまいクエリ%
1.利点:実装が簡単
2、短所:大量のデータの場合、非効率的なクエリ
2、フルテキスト検索エンジン
1、の利点:プロのフルテキスト検索エンジン、高効率
2.短所:実装がより複雑に
フルテキスト検索エンジン、およびフルテキスト検索エンジンのDjangoのコード多くの問題を達成するために、自己フレーム、選択ジャンゴを選択します。
サードパーティ製のパッケージがdjangohaystack。これは、最も人気のあるフルテキスト検索エンジンのいずれかをプロジェクトを選択し、マルチ忠Quanwen検索エンジンをサポートしています
elasticsearch
二、elasticsearch導入
elasticsearch原則ます。http://developer.51cto.com/art/201904/594615.htm
三、ドッカ紹介
はじめと1.docker
- はじめに
1.ドッキングウィンドウとは何ですか?
- 作成、展開、アプリケーションを実行するためのツールを簡素化
- パッケージ化されたアプリケーションは、ライブラリを必要とし、環境に依存します
〜の合理化仮想マシン
2.なぜdocher?
、人気の便利で強力な
仮想マシン対3.docker
小さく、より速く実行、よりよい統合された拡張
4.dockerアーキテクチャ
〜アーキテクチャ
- クライアント
〜デーモン
〜倉庫
〜ドッカーオブジェクト
〜ミラーは、Linuxを合理化します
~容器
- サービス
〜ドッカハブ
インストール
公式インストールマニュアル:https://www.docker.com/
lsb_release -a#ビューシステム情報
第五に、ニュースの検索機能の実現
1、ビジネスプロセスの分析
クエリパラメータqパスかどうかを判断します
あなたは、Qを渡さない場合は、直接、人気のニュースデータをバックアップ
渡されない場合は、クエリの結果が返されます
2、インターフェースデザイン
1.インターフェイス説明:
カテゴリ説明
リクエストメソッドをGET
URL定義された/ニュース/検索/
パラメータ形式のクエリパラメータ
2.パラメータ説明:
あなたは、パラメータが入力するかどうかを記述しなければなりません
いいえキーワードクエリ文字列Qません
ページ整数ないページ
3.戻り結果:
検索ページのHTML
1.データモデルの干し草の山を作成します。
ニュース/ search_indexesファイルコード
インデックスから干し草の山のインポート
.modelsインポートニュースから
クラスNewsIndex(indexes.SearchIndex、indexes.Indexable):
「」 "
このモデルは、ジャンゴのロールモデルに似ている、それはデータがされて干し草の山伝え
クエリによって返されたモデルオブジェクトに配置し、だけでなく、フィールドのインデックスとクエリを通じて
"" "
テキスト= indexes.CharField(ドキュメント=真、use_template =真)
ID = indexes.CharField(model_attr = 'ID')
タイトル= indexes.CharField(model_attr = 'タイトル')
ダイジェストindexes.CharField =(model_attr = 'ダイジェスト')
コンテンツ= indexes.CharField(model_attr = 'コンテンツ')
IMAGE_URL = indexes.CharField(model_attr = 'IMAGE_URL')
DEFのget_model(セルフ):
"" "
モデルのインデックスを返します
:戻ります:
「」」
ニュースを返します
index_queryset DEF(セルフ、使用して=なし):
"" "
データクエリセットのインデックスを返します
:使用してPARAMを:
:リターン:
" ""
。(self.get_model を返す)objects.filter(is_delete = Falseの)
2は、インデックスを作成しますデータステンシル
テンプレート/検索/インデックス/ニュース/ news_text.txt ファイル
{{object.title}}
、{{object.digest}}
、{{object.content}}
、{{}} object.author.username
3.インデックスを作成します。
プロジェクトのルートディレクトリに仮想マシン
python manage.py -h:コマンドを実行します。
python manage.py rebuild_index
コード:
ニュース/ templatetags / news_template_filters.py
ジャンゴインポートテンプレートから
レジスタ= template.Library()
@ register.filter()
デフpage_bar(ページ):
page_list = []
の場合page.number = 1:!
page_list.append(1)
の場合page.number - 3> 1:
page_list.append( '...')
であればpage.number - 2> 1:
page_list.append(page.number - 2)
の場合page.number - 1> 1:
page_list.append(page.number -1)
page_list。 (page.number)を追加
する場合page.paginator.num_pages> page.number + 1:
page_list.append(page.number + 1)
であればpage.paginator.num_pages> page.number + 2:
page_list.append(page.number + 2)
もしpage.paginator.num_pages> page.number + 3:
page_list.append( '...')
!:page.paginator.num_pages = page.number場合
page_list.append(page.paginator.num_pages)
リターンpage_listの
アプリケーション/ニュース/views.py代码
NewsSearchViewクラス(SearchView):
"" "
ニュース検索ビューの
URL:/ニュース/検索/
" ""
#検索テンプレートコンフィギュレーションファイルの
テンプレート名= 'ニュース/ search.htmlの'
DEF GET(セルフ、要求、* argsを、** kwargsから) :
#1。は、クエリパラメータを取得する
クエリ= request.GET.get( 'Q'):
照会されていない場合
、無照会番号が存在しない場合は#2を
#人気のReturnキーを押します
hot_news = HotNews.objects.select_related( 'news__tag'。 '()のみnews__title '' news__image_url '' news_id '' news__tag__name ')。(is_delete = False)が.order_by(フィルタリング' '')-news__clicks優先順位を
#タブ
ページネータ=ページネータ(hot_news、設定。HAYSTACK_SEARCH_RESULTS_PER_PAGE)
してみてください:
ページ= paginator.get_page(INT(request.GET.get( 'ページ')))
:Eとして例外を除いて
(1)ページ= paginator.get_page
= {レンダリング返す(リクエスト、self.template_name、コンテキスト
'ページ':ページ、
'問合せは、':クエリが
})
他:
#3如果有怎么は办
)(スーパー返す(要求、* argsを、** kwargsからの取得)。
デフget_context_data(自己、* argsを、** kwargsから
):""」
在コンテキスト中添加变量ページ
:PARAM引数:
:PARAM kwargsから:
:リターン
:""」
。コンテキスト=スーパー()get_context_data(* argsを、** kwargsから)
もしコンテキスト[ 'page_obj']:
コンテキスト[ 'ページ'] =コンテキスト[ 'page_obj']
リターン・コンテキスト