您好,登錄后才能下訂單哦!
1.背景
當用戶在搜索框輸入關鍵字后,我們要為用戶提供相關的搜索結果。可以選擇使用模糊查詢 like 關鍵字實現,但是 like 關鍵字的效率極低。查詢需要在多個字段中進行,使用 like 關鍵字也不方便,另外分詞的效果也不理想。
全文檢索方案
搜索引擎原理
2.Elasticsearch介紹
實現全文檢索的搜索引擎,首選的是 Elasticsearch 。
分詞說明
搜索引擎在對數據構建索引時,需要進行分詞處理。
分詞是指將一句話拆解成 多個單字 或 詞 ,這些字或詞便是這句話的關鍵詞。
Elasticsearch 不支持對中文進行分詞建立索引,需要配合擴展 elasticsearch-analysis-ik 來實現中文分詞處理。
3.集成Elasticsearch
3.1. Haystack介紹和安裝配置
Haystack安裝
$ pip install django-haystack $ pip install elasticsearch==2.4.1
Haystack注冊應用和路由
在 django 的配置文件中注冊。
INSTALLED_APPS = [ 'haystack', # 全文檢索注冊]
在總路由中新建 haystack 的路由。
urlpatterns = [url(r'^search/', include('haystack.urls')),]
Haystack配置
在配置文件中配置Haystack為搜索引擎后端
# Haystack HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://192.168.103.158:9200/', # Elasticsearch服務器ip地址,端口號固定為9200 'INDEX_NAME': 'serach_mall', # Elasticsearch建立的索引庫的名稱 }, } # 當添加、修改、刪除數據時,自動生成索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' # 搜索的每頁大小 HAYSTACK_SEARCH_RESULTS_PER_PAGE = 3
HAYSTACK_SIGNAL_PROCESSOR 配置項保證了在Django運行起來后,有新的數據產生時,Haystack仍然可以讓Elasticsearch實時生成新數據的索引。
3.2 Haystack建立數據索引
1.創建索引類
通過創建索引類,來指明讓搜索引擎對哪些字段建立索引,也就是可以通過哪些字段的關鍵字來檢索數據。
本項目中對模型類SKU信息進行全文檢索,所以在 該模型類的應用(goods)中 新建 search_indexes.py 文件,用于存放索引類。索引類必須繼承 haystack.indexes.SearchIndex 與 haystack.indexes.Indexable .
from haystack import indexes from .models import SKU class SKUIndex(indexes.SearchIndex, indexes.Indexable): """SKU索引數據模型類""" text = indexes.CharField(document=True, use_template=True) def get_model(self): """返回建立索引的模型類""" return SKU def index_queryset(self, using=None): """返回要建立索引的數據查詢集""" return self.get_model().objects.filter(is_launched=True)
索引類 SKUIndex 說明:
2.創建text字段索引值模板文件
在項目 templates 目錄中創建 text字段 使用的模板文件
具體在 templates/search/indexes/goods/sku_text.txt 文件中定義,其中 goods 為應用名, sku_text.txt 中的 sku 為模型類小寫。
{{ object.id }} {{ object.name }} {{ object.caption }}
模板文件說明:當將關鍵詞通過text參數名傳遞時
此模板指明SKU的 id 、 name 、 caption 作為 text 字段的索引值來進行關鍵字索引查詢。
3.手動生成初始索引
$ python manage.py rebuild_index
第一次需要生成索引需要執行上述命令,后續會自動生成索引。
3.3 全文檢索測試
準備測試表單
<div class="search_wrap fl"> <form method="get" action="/search/" class="search_con"> <input type="text" class="input_text fl" name="q" placeholder="搜索商品"> <input type="submit" class="input_btn fr" name="" value="搜索"> </form> ... ... </div>
然后在 templates/search/ 目錄下新建 search.html 接收和渲染全文檢索的結果 .
3.4 渲染搜索結果
Haystack返回的數據包括:
<div class="main_wrap clearfix"> <div class=" clearfix"> <ul class="goods_type_list clearfix"> {% for result in page %} <li> {# object取得才是sku對象 #} <a href="/detail/{{ result.object.id }}/" rel="external nofollow" rel="external nofollow" ><img src="{{ result.object.default_image.url }}"></a> <h5><a href="/detail/{{ result.object.id }}/" rel="external nofollow" rel="external nofollow" >{{ result.object.name }}</a></h5> <div class="operate"> <span class="price">¥{{ result.object.price }}</span> <span>{{ result.object.comments }}評價</span> </div> </li> {% else %} <p>沒有找到您要查詢的商品。</p> {% endfor %} </ul> <div class="pagenation"> <div id="pagination" class="page"></div> </div> </div> </div>
這里Elasticsearch替我們把django中的視圖函數寫了。
搜索頁分頁器
<div class="main_wrap clearfix"> <div class=" clearfix"> ...... <div class="pagenation"> <div id="pagination" class="page"></div> </div> </div> </div> <script type="text/javascript"> $(function () { $('#pagination').pagination({ currentPage: {{ page.number }}, totalPage: {{ paginator.num_pages }}, callback:function (current) { window.location.href = '/search/?q={{ query }}&page=' + current; } }) }); </script>
這里使用的 jquery.pagination.js 接收要渲染的數據,當然也可以使用其他框架的分頁器或自定義的來接收。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。