日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Diango博客--21.实现简单的全文搜索

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Diango博客--21.实现简单的全文搜索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1. 概述
  • 2. 模板:將關鍵詞提交給服務器
  • 3. 視圖:查找含有搜索關鍵詞的文章
  • 4. 視圖:綁定 URL

1. 概述

搜索是一個復雜的功能,但對于一些簡單的搜索任務,我們可以使用 Django Model 層提供的一些內置方法來完成,比如Post.objects.filter()方法。現在我們來為我們的博客提供一個簡單的搜索功能。

博客文章通常包含標題和正文兩個部分。當用戶輸入某個關鍵詞進行搜索后,我們希望為用戶顯示標題和正文中含有被搜索關鍵詞的全部文章。整個搜索的過程如下:

1) 用戶在搜素框中輸入搜索關鍵詞,假設為 “django”,然后用戶點擊了搜索按鈕提交其輸入的結果到服務器。
2) 服務器接收到用戶輸入的搜索關鍵詞 “django” 后去數據庫查找文章標題和正文中含有該關鍵詞的全部文章。
3) 服務器將查詢結果返回給用戶。

整個過程就是這樣,下面來看看 Django 如何用實現這些過程。

2. 模板:將關鍵詞提交給服務器

在博客上為用戶提供一個搜索表單,HTML 表單代碼大概像這樣:

文件位置:templates/base.html

<form role="search" method="get" id="searchform" action="{% url 'blog:search' %}"><input type="search" name="q" placeholder="搜索" required><button type="submit"><span class="ion-ios-search-strong"></span></button> </form>

特別注意這里 中的 name 屬性,當用戶在這個 input 中輸入搜索內容并提交表單后,鍵入的數據會以鍵值對的形式提交服務器,這個鍵的名字就是通過 name 屬性指定的。這樣服務器就可以根據 name 的值來取得用戶輸入的內容。

用戶輸入了搜索關鍵詞并點擊了搜索按鈕后,數據就被發送給了 Django 后臺服務器。表單的 action 屬性的值為 {% url ‘blog:search’ %}(雖然我們還沒有寫這個視圖函數),表明用戶提交的結果將被發送給 blog 應用下 search 視圖函數對應的 URL。

3. 視圖:查找含有搜索關鍵詞的文章

搜索的功能將由 search 視圖函數提供,代碼寫在 blog/views.py 里:

文件位置:blog/views.py

from django.contrib import messagesdef search(request):q = request.GET.get('q')if not q:error_msg = "請輸入搜索關鍵詞"messages.add_message(request, messages.ERROR, error_msg, extra_tags='danger')return redirect('blog:index')post_list = Post.objects.filter(Q(title__icontains=q) | Q(body__icontains=q))return render(request, 'blog/index.html', {'post_list': post_list})

首先我們使用 request.GET.get(‘q’) 獲取到用戶提交的搜索關鍵詞。用戶通過表單 get 方法提交的數據 Django 為我們保存在 request.GET 里,這是一個類似于 Python 字典的對象,所以我們使用 get 方法從字典里取出鍵 q 對應的值,即用戶的搜索關鍵詞。這里字典的鍵之所以叫 q 是因為我們的表單中搜索框 input 的 name 屬性的值是 q,如果修改了 name 屬性的值,那么這個鍵的名稱也要相應修改。

接下來我們做了一個小小的校驗,如果用戶沒有輸入搜索關鍵詞而提交了表單,我們就無需執行查詢,我們給用戶發一條錯誤提醒消息,這里使用了 django messages 應用,這在 交流的橋梁:評論功能 中講過。然后將用戶重定向到首頁。這里的 redirect 函數也在那篇教程中講過。

如果用戶輸入了搜索關鍵詞,我們就通過 filter 方法從數據庫里過濾出符合條件的所有文章。這里的過濾條件是 title__icontains=q,即 title 中包含(contains)關鍵字 q,前綴 i 表示不區分大小寫。這里 icontains 是查詢表達式(Field lookups),我們在之前也使用過其他類似的查詢表達式,其用法是在模型需要篩選的屬性后面跟上兩個下劃線。Django 內置了很多查詢表達式,建議過一遍 Django 官方留個印象,了解每個表達式的作用,以后碰到相關的需求就可以快速定位到文檔查詢其用途 Field lookups。

此外我們這里從 from django.db.models 中引入了一個新的東西:Q 對象。Q 對象用于包裝查詢表達式,其作用是為了提供復雜的查詢邏輯。例如這里 Q(title__icontains=q) | Q(body__icontains=q) 表示標題(title)含有關鍵詞 q 或者正文(body)含有關鍵詞 q ,或邏輯使用 | 符號。如果不用 Q 對象,就只能寫成 title__icontains=q, body__icontains=q,這就變成標題(title)含有關鍵詞 q 且正文(body)含有關鍵詞 q,就達不到我們想要的目的。

4. 視圖:綁定 URL

有了視圖函數后記得把視圖函數映射到相應了 URL,如下。
文件位置:blog/urls.py

urlpatterns = [# 其他 url 配置path('search/', views.search, name='search'), ]

大功告成,在導航欄嘗試輸入一些關鍵詞,看看效果吧!

當然這樣的搜索功能是非常簡略的,難以滿足一些復雜的搜索需求。編寫一個搜索引擎是一個大工程,好在 django-haystack 這款第三方 app 為我們完成了全部工作。使用它我們可以實現更加復雜的搜索功能,比如全文檢索、按搜索相關度排序、關鍵字高亮等等類似于百度搜索的功能,功能十分強大。當然其使用也會復雜一些,下一篇教程將向大家介紹 django-haystack 結合 Elasticsearch 搜索引擎的使用方法。

總結

以上是生活随笔為你收集整理的Diango博客--21.实现简单的全文搜索的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。