基于Django的博客系統之用HayStack連接elasticsearch增加搜索功能(五)

上一篇:搭建基于Django的博客系統數據庫遷移從Sqlite3到MySQL(四)
下一篇:基于Django的博客系統之增加類別導航欄(六)

功能概述

  1. 添加搜索框用于搜索博客。

需求詳細描述

1. 添加搜索框用于搜索博客

  • 描述: 在博客首頁添加搜索框,用戶可以通過關鍵詞搜索博客文章。
  • 功能要求:
    • 搜索框位置:導航欄或頁面頂部。
    • 支持根據標題和內容進行搜索。
    • 搜索結果顯示匹配的博客列表。
  • 用戶故事:
    • 作為用戶,我希望能夠通過搜索框快速找到感興趣的博客文章。

技術結構

實現一個博客搜索功能,可以同時使用 Elasticsearch 和 MySQL 各自的優勢。以下是如何區分和結合使用這兩種技術的方法:

使用 MySQL 的部分

  1. 數據存儲
    • 存儲博客文章的基本信息,如標題、作者、發布時間、分類等。
    • 存儲用戶信息、評論、標簽等結構化數據。
  2. 基礎查詢和管理
    • 進行常規的 CRUD 操作,如創建、讀取、更新、刪除博客文章。
    • 進行簡單的過濾和排序,如按發布時間、作者、分類等查詢文章。

使用 Elasticsearch 的部分

  1. 全文搜索
    • 存儲和索引博客文章的全文內容,以支持全文搜索功能。
    • 對用戶搜索的關鍵詞進行快速匹配,返回相關的文章列表。
  2. 復雜查詢
    • 支持復雜的查詢需求,如模糊搜索、布爾搜索、按相關性排序等。
    • 支持自動補全、拼寫糾錯等高級搜索功能。

集成 MySQL 和 Elasticsearch

  1. 數據同步
    • 需要將 MySQL 中的博客文章數據同步到 Elasticsearch 中,以確保搜索功能能夠使用最新的數據。
    • 可以使用定時任務或實時數據同步機制來保持兩者數據的一致性。例如,使用工具如 Logstash、Beats 或自定義的同步程序。
  2. 搜索接口設計
    • 提供一個統一的搜索接口,前端用戶提交搜索請求時,后臺從 Elasticsearch 中查詢搜索結果。
    • 查詢到的搜索結果中包含文章的基本信息,從 Elasticsearch 返回文章的 ID,然后從 MySQL 中獲取詳細信息(如作者、評論等)。

實現步驟

要在 Django 博客應用中添加搜索框,以便用戶可以搜索博客內容,可以按照以下步驟進行:

1. 安裝 Django 搜索庫

首先,確保你已經安裝了 Django 搜索庫。一個常用的選擇是 django-haystack 庫,它提供了與多個搜索引擎(如 Elasticsearch、Solr 和 Whoosh 等)集成的功能。

pip install django-haystack

2. 配置搜索引擎

選擇并配置你想要使用的搜索引擎。例如,如果選擇使用 Whoosh 搜索引擎,需要在 settings.py 文件中配置 Haystack 設置:

# settings.pyINSTALLED_APPS = [# 其他應用...'haystack',
]HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine','URL': 'http://localhost:9200/',  # Elasticsearch 服務器的 URL'INDEX_NAME': 'haystack',  # Elasticsearch 索引的名稱},
}HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

3. 創建搜索索引類

為你的博客模型創建一個搜索索引類,告訴 Haystack 如何索引你的數據。假設你有一個名為 Post 的博客模型:

# search_indexes.pyfrom haystack import indexes
from .models import Postclass PostIndex(indexes.SearchIndex, indexes.Indexable):text = indexes.CharField(document=True, use_template=True)def get_model(self):return Post

在這個示例中,我們使用 text 字段來索引博客內容。你可以根據需要添加更多的字段。

4. 創建搜索模板

在你的博客模板文件夾中創建一個模板文件,用于顯示搜索結果。這個模板將根據搜索結果顯示匹配的博客文章。

<!-- templates/search/post_text.txt -->{{ object.title }}
{{ object.content }}

同步索引:運行 Django 的管理命令來創建或更新搜索索引。

python manage.py rebuild_index

5. 更新 URL 配置

將搜索視圖添加到你的 URL 配置中,以便用戶可以訪問搜索頁面并執行搜索。

# urls.pyfrom django.urls import path
from . import viewsurlpatterns = [# 其他 URL 配置...path('search/', views.SearchView.as_view(), name='search'),
]

6. 創建搜索視圖

創建一個視圖類來處理搜索請求,并將搜索結果呈現給用戶。

from haystack.query import SearchQuerySetdef search_view(request):query = request.GET.get('q', '')results = SearchQuerySet().filter(content=query)return render(request, 'search_results.html', {'results': results})

7. 創建搜索模板

創建一個模板文件,用于顯示搜索結果。在這個模板中,你可以根據需要定制搜索結果的展示方式。

<!-- templates/search.html -->{% for result in page.object_list %}<h3><a href="{{ result.object.get_absolute_url }}">{{ result.object.title }}</a></h3><p>{{ result.object.content }}</p>
{% empty %}<p>No results found.</p>
{% endfor %}{% if is_paginated %}<div class="pagination"><span class="step-links">{% if page.has_previous %}<a href="?q={{ query }}&page=1">&laquo; first</a><a href="?q={{ query }}&page={{ page.previous_page_number }}">previous</a>{% endif %}<span class="current">Page {{ page.number }} of {{ page.paginator.num_pages }}.</span>{% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">next</a><a href="?q={{ query }}&page={{ page.paginator.num_pages }}">last &raquo;</a>{% endif %}</span></div>
{% endif %}

8. 創建搜索表單

最后,創建一個搜索表單,讓用戶輸入搜索關鍵字并提交搜索請求。

<!-- templates/search_form.html --><form action="{% url 'search' %}" method="get"><input type="text" name="q" placeholder="Search..."><button type="submit">Search</button>
</form>

將搜索表單包含在你的博客頁面中的適當位置,用戶就可以使用它來搜索博客內容了。

這就是在 Django 博客應用中添加搜索框的基本步驟。根據你的需求,你可以進一步定制搜索功能,例如添加搜索結果的高亮顯示、自定義搜索表單字段等。

連接elasticsearch

具體參看這篇Windows安裝ElasticSearch版本7.17.0

要連接 Elasticsearch,你需要配置 Django Haystack 的后端為 Elasticsearch 后端。下面是一些步驟:

  1. 安裝 Elasticsearch:首先確保你已經安裝了 Elasticsearch 并且它正在運行。你可以從 Elasticsearch 的官方網站上下載并安裝它。
  2. 安裝 Haystack:確保你已經安裝了 Django Haystack。你可以使用 pip 進行安裝:pip install django-haystack
  3. 安裝 Elasticsearch 后端:你需要安裝與 Elasticsearch 兼容的 Haystack 后端。通常情況下,你需要安裝 elasticsearch-dsl,它是 Elasticsearch 的 Python 客戶端庫。你可以使用 pip 進行安裝:pip install elasticsearch-dsl
  4. 配置 Haystack 設置:在 Django 項目的 settings.py 文件中,配置 Haystack 設置以使用 Elasticsearch 后端。這包括指定 Elasticsearch 的主機和端口等信息。
HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine','URL': 'http://localhost:9200/',  # Elasticsearch 服務器的 URL'INDEX_NAME': 'haystack',  # Elasticsearch 索引的名稱},
}
  1. 建立索引:運行 python manage.py rebuild_index 命令來建立你的模型的搜索索引。這將會在 Elasticsearch 中創建對應的索引。
  2. 運行你的應用程序:現在你的 Django 應用程序應該能夠連接到 Elasticsearch 并使用它來進行全文搜索了。

問題和解決

報錯 from django.utils.datetime_safe import date, datetime ModuleNotFoundError: No module named 'django.utils.datetime_safe'

分析解決:

在 Django 3.2 中,django.utils.datetime_safe 模塊已被移除。這個模塊提供了在處理日期和時間時的安全操作,以防止由于 datetimedate 對象的類型不同而導致的一些問題。

如果你的代碼中依賴了 django.utils.datetime_safe 模塊,你可以嘗試以下替代方法:

  1. 直接使用 datetime 和 date:在絕大多數情況下,直接使用內置的 datetimedate 類應該沒有問題。只要確保在處理日期和時間時,類型的轉換和比較是正確的即可。
  2. 在需要的地方進行轉換:如果你的代碼在某些情況下需要確保 datetimedate 對象的類型一致,你可以手動進行轉換。比如,使用 timezone.now() 獲取當前時間,使用 datetime.strptime() 將字符串轉換為 datetime 對象等。
  3. 更新依賴:如果你使用的是第三方庫,可以嘗試更新這些庫的版本,看看是否有與 Django 3.2 兼容的版本。

確保你的代碼不再依賴于 django.utils.datetime_safe 模塊后,就可以解決這個錯誤了。切換為elasticsearch連接。報錯如下 raise MissingDependency( haystack.exceptions.MissingDependency: The 'elasticsearch5' backend requires the installation of 'elasticsearch>=5.0.0,<6.0.0'. Please refer to the documentation.

在這里插入圖片描述

修改settings.pyHAYSTACK_CONNECTIONS連接的Elasticsearch版本為8.x,如下:

HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.elasticsearch8_backend.Elasticsearch8SearchEngine','URL': 'http://localhost:9200/','INDEX_NAME': 'myblog',},
}

報錯ModuleNotFoundError: No module named 'haystack.backends.elasticsearch8_backend'

原因:Haystack中沒有提供一個專門用于Elasticsearch 8.x 的后端引擎。使用 haystack.backends.elasticsearch7_backend.Elasticsearch7SearchEngine 就可以支持 Elasticsearch 7.x。

重新安裝elasticsearch版本號為7.17。見這篇文章

卸載不需要的驅動

pip uninstall elasticsearch
pip uninstall elasticsearch-dsl

安裝需要的驅動

 pip install elasticsearch==7.17.0pip install elasticsearch-dsl==7.4.1

再次調用啟動搜索index命令python manage.py rebuild_index

報錯ImportError: cannot import name 'datetime_safe' from 'django.utils'

原因:Django 3.2 中移除了 django.utils.datetime_safe 模塊引起的。Haystack 應該已經更新以適應 Django 3.2。

執行命令下載haystack支持django5.0.7

pip install git+https://github.com/django-haystack/django-haystack.git

再次調用啟動搜索index命令

python manage.py rebuild_index

運行成功。效果如下:

在這里插入圖片描述

調用http://localhost:8000/search/?q=%E6%AF%94%E4%BC%AF后,結果如下:

在這里插入圖片描述

分析原因elasticsearch的index有問題。

tree /F命令獲取全文件夾下的文件格式表。

通過下面命令獲取當前elasticsearch里面的index

Invoke-WebRequest -Uri "http://localhost:9200/_cat/indices?v"

post_text.txt里面添加一段index的指向

<!-- templates/search/indexes/blog/post_text.txt -->

執行index命令python manage.py rebuild_index

執行成功,如下:
在這里插入圖片描述
postman調用apihttp://localhost:9200/myblog結果返回成功:

{"myblog": {"aliases": {},"mappings": {"properties": {"content": {"type": "text","analyzer": "snowball"},"django_ct": {"type": "keyword"},"django_id": {"type": "keyword"},"id": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"text": {"type": "text","analyzer": "snowball"},"title": {"type": "text","analyzer": "snowball"}}},"settings": {"index": {"max_ngram_diff": "2","routing": {"allocation": {"include": {"_tier_preference": "data_content"}}},"number_of_shards": "1","provided_name": "myblog","creation_date": "1716964128114","analysis": {"filter": {"haystack_ngram": {"type": "ngram","min_gram": "3","max_gram": "4"},"haystack_edgengram": {"type": "edge_ngram","min_gram": "2","max_gram": "15"}},"analyzer": {"edgengram_analyzer": {"filter": ["haystack_edgengram","lowercase"],"tokenizer": "standard"},"ngram_analyzer": {"filter": ["haystack_ngram","lowercase"],"tokenizer": "standard"}}},"number_of_replicas": "1","uuid": "1GzZNjZzSmOtmFdLuGWhvw","version": {"created": "7170099"}}}}
}

搜索index

修改搜索視圖以獲取匹配的博客文章 ID,并從 MySQL 中獲取詳細信息:

# blog/views.py
from django.shortcuts import render
from haystack.query import SearchQuerySet
from .models import BlogPost
from .forms import BlogSearchFormdef search(request):form = BlogSearchForm(request.GET)results = []if form.is_valid():# 從 Elasticsearch 獲取匹配的博客文章 IDsqs = form.search()matched_ids = [result.pk for result in sqs]# 從 MySQL 數據庫中獲取詳細信息results = BlogPost.objects.filter(id__in=matched_ids)return render(request, 'search_results.html', {'form': form, 'results': results})

訪問’http://localhost:8000’輸入搜索growing,訪問’http://localhost:8000/search/?q=growing’,得到結果如下:

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21309.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21309.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21309.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據密集型系統設計】軟件系統的可靠性、可伸縮性、可維護性

文章目錄 一. 數據密集型程序的特點以及遇到的問題二. 可靠性 : 即使出現問題&#xff0c;也能繼續正確工作1 硬件故障2. 軟件錯誤3. 人為錯誤 二. 可伸縮性1. 描述負載與推特的例子2. 描述性能-延遲和響應時間3. 應對負載的方法 四. 可維護性1. 可操作性&#xff1a;人生苦短&…

如何解決Mac系統創建/home目錄提示Read-Only filesystem(補充)?

繼昨日發布的博文之后&#xff0c;有小伙伴私我說&#xff1a; sudo mount -uw /命令報錯&#xff1a;mount_apfs: volume could not be mounted: Permission denied mount: / failed with 66 今天補充一下昨天的文章&#xff0c;昨天的文章我沒有注明是Mac什么系統的&#x…

Chromebook Plus中添加了Gemini?

Chromebook Plus中添加了Gemini&#xff1f; 前言 就在5月29日&#xff0c;谷歌宣布了一項重大更新&#xff0c;將其Gemini人工智能技術集成到Chromebook Plus筆記本電腦中。這項技術此前已應用于谷歌的其他設備。華碩和惠普已經在市場上銷售的Chromebook Plus機型&#xff0c;…

mysql binlog查看指定數據庫

1.mysql binlog查看指定數據庫的方法 MySQL 的 binlog&#xff08;二進制日志&#xff09;主要記錄了數據庫上執行的所有更改數據的 SQL 語句&#xff0c;包括數據的插入、更新和刪除等操作。但直接查看 binlog 并不直觀&#xff0c;因為它是以二進制格式存儲的。為了查看 bin…

電腦缺少dll文件怎么解決,分享幾種靠譜的解決方法

在現代科技高度發達的時代&#xff0c;電腦已經成為我們生活和工作中不可或缺的工具。然而&#xff0c;在使用電腦的過程中&#xff0c;我們可能會遇到一些問題&#xff0c;其中之一就是電腦丟失dll文件。那么&#xff0c;當我們面臨這樣的問題時&#xff0c;應該如何解決呢&am…

云原生架構案例分析_1.某旅行公司云原生改造

隨著云計算的普及與云原生的廣泛應用&#xff0c;越來越多的從業者、決策者清晰地認識到“云原生化將成為企業技術創新的關鍵要素&#xff0c;也是完成企業數字化轉型的最短路徑”。因此&#xff0c;具有前瞻思維的互聯網企業從應用誕生之初就扎根于云端&#xff0c;謹慎穩重的…

BMC壓力測試腳本

說明 對于研發階段而言&#xff0c;需要對BMC執行壓力測試&#xff0c;可以提前發現問題&#xff0c;修復問題&#xff0c;提高產品穩定性。 大體而言&#xff0c;需要做到幾個方面: 1.預先發現是否會造成BMC hang機。2.進程是否會發生重啟&#xff0c;運行異常3.進程是否會…

SpringMVC:轉發和重定向

1. 請求轉發和重定向簡介 參考該鏈接第9點 2. forward 返回下一個資源路徑&#xff0c;請求轉發固定格式&#xff1a;return "forward:資源路徑"如 return "forward:/b" 此時為一次請求返回邏輯視圖名稱 返回邏輯視圖不指定方式時都會默認使用請求轉發in…

【Qt秘籍】[008]-Qt中的connect函數

在Qt框架中&#xff0c;connect函數是一個非常核心的函數&#xff0c;用于實現信號&#xff08;Signals&#xff09;和槽&#xff08;Slots&#xff09;之間的連接&#xff0c;它是Qt信號槽機制的關鍵所在。信號槽機制是一種高級的通信方式&#xff0c;允許對象在狀態改變時通知…

ChatGPT-3

ChatGPT-3是OpenAI開發的先進人工智能聊天機器人程序&#xff0c;它是基于 GPT-3.5 架構的大型語言模型&#xff0c;并通過強化學習進行了訓練。這項技術代表了自然語言處理領域的一個重要里程碑&#xff0c;具有以下顯著特點和功能&#xff1a; 強大的語言理解和生成能力&…

代碼隨想三刷數組篇

代碼隨想三刷數組篇1 704. 二分查找題目代碼27. 移除元素題目代碼977.有序數組的平方題目代碼209.長度最小的子數組題目代碼59.螺旋矩陣II題目代碼704. 二分查找 題目

牛客網刷題 | BC114 圣誕樹 (不理解)

目前主要分為三個專欄&#xff0c;后續還會添加&#xff1a; 專欄如下&#xff1a; C語言刷題解析 C語言系列文章 我的成長經歷 感謝閱讀&#xff01; 初來乍到&#xff0c;如有錯誤請指出&#xff0c;感謝&#xff01; 這道題沒搞懂 也沒找到視…

Nginx源碼編譯安裝

Nginx NginxNginx的特點Nginx的使用場景Nginx 有哪些進程 使用源碼編譯安裝Nginx準備工作安裝依賴包編譯安裝Nginx檢查、啟動、重啟、停止 nginx服務配置 Nginx 系統服務方法一&#xff1a;方法二&#xff1a; 訪問Nginx頁面 升級Nginx準備工作編譯安裝新版本Nginx驗證 Nginx N…

【HarmonyOS】Stage 模型 - UIAbility 的啟動模式

Stage 模型這樣的應用&#xff0c;它在啟動的時候會先準備 Ability Stage 舞臺&#xff0c;接著呢&#xff0c;就可以基于它去創建 UIAbility 的實例&#xff0c;并去啟動它。 UIAbility 組件啟動模式 有四種&#xff1a; singletonstandardmultitonspecified 修改模塊的 mod…

SSMP整合案例第五步 在前端頁面上拿到service層調數據庫里的數據后列表

在前端頁面上列表 我們首先看看前端頁面 我們已經把數據傳入前端控制臺 再看看我們的代碼是怎么寫的 我們展示 數據來自圖dataList 在這里 我們要把數據填進去 就能展示在前端頁面上 用的是前端數據雙向綁定 axios發送異步請求 函數 //鉤子函數&#xff0c;VUE對象初始化…

【四大組件】-- 活動 Activity

目錄 活動活動是什么活動的相關操作手動創建活動活動中使用Toast活動中使用Menu銷毀一個活動 使用Intent實現活動間啟動顯示啟動隱式啟動 活動間數據傳遞活動的生命周期返回棧活動的狀態活動的生存期 活動的啟動流程活動的回收和重建如何在活動銷毀前保存狀態 活動的啟動模式st…

設計模式(十四)行為型模式---訪問者模式(visitor)

文章目錄 訪問者模式簡介分派的分類什么是雙分派&#xff1f;結構UML圖具體實現UML圖代碼實現 優缺點 訪問者模式簡介 訪問者模式&#xff08;visitor pattern&#xff09;是封裝一些作用于某種數據結構中的元素的操作&#xff0c;它可以在不改變這個數據結構&#xff08;實現…

紅隊內網攻防滲透:內網滲透之windows內網權限提升技術:手工篇

紅隊內網攻防滲透 1. 內網權限提升技術1.1 windows內網權限提升技術--手工篇1.1.1 Web到Win-系統提權-人工操作1.1.1.1 信息收集1.1.1.2 補丁篩選1.1.1.3 EXP獲取執行1.1.2 Web到Win-系統提權-土豆家族1.1.2.1 Test in:Windows 10/11(1809/21H2)1.1.2.2 Test in:Windows Se…

全新市場階段,Partisia BlockChain 將向 RWA、DeFi 等領域布局

Partisia Blockchain 是一個全新范式的 Layer1&#xff0c;該鏈通過 MPC 方案來構建鏈上隱私方案&#xff0c;同時該鏈通過系列獨特且創新的設計&#xff0c;旨在進一步解決目前 Web3 中所面臨的不可能三角問題&#xff0c;包括安全性、互操作性和可擴展性&#xff0c;為更多的…

NTFS磁盤格式讀寫工具:Tuxera NTFS 2021 for Mac

Tuxera NTFS 是一款用于 macOS 系統的 NTFS 文件系統驅動程序。NTFS 是 Windows 系統中常用的文件系統&#xff0c;而 macOS 默認只支持讀取 NTFS 格式的磁盤&#xff0c;不能進行寫入操作。因此&#xff0c;如果你需要在 macOS 上進行 NTFS 磁盤的寫入操作&#xff0c;就需要安…