中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django集成搜索引擎Elasticserach的方法示例

發布時間:2020-10-26 06:05:27 來源:腳本之家 閱讀:161 作者:Simon_Zhou 欄目:開發技術

1.背景

當用戶在搜索框輸入關鍵字后,我們要為用戶提供相關的搜索結果。可以選擇使用模糊查詢 like 關鍵字實現,但是 like 關鍵字的效率極低。查詢需要在多個字段中進行,使用 like 關鍵字也不方便,另外分詞的效果也不理想。

全文檢索方案

  • 全文檢索即在指定的任意字段中進行檢索查詢。
  • 全文檢索方案需要配合搜索引擎來實現。

搜索引擎原理

  • 搜索引擎 進行全文檢索時,會對數據庫中的數據進行一遍預處理,單獨建立起一份 索引結構數據 。
  • 索引結構數據 類似字典的索引檢索頁 ,里面包含了關鍵詞與詞條的對應關系,并記錄詞條的位置。
  • 搜索引擎進行全文檢索時,將 關鍵字在索引數據中進行快速對比查找,進而找到數據的真實存儲位置 。

2.Elasticsearch介紹

實現全文檢索的搜索引擎,首選的是 Elasticsearch 。

  • Elasticsearch 是用 Java 實現的,開源的搜索引擎。
  • 它可以快速地儲存、搜索和分析海量數據。維基百科、Stack Overflow、Github等都采用它。
  • Elasticsearch 的底層是開源庫Lucene。但是,沒法直接使用 Lucene,必須自己寫代碼去調用它的接口。

分詞說明

搜索引擎在對數據構建索引時,需要進行分詞處理。

分詞是指將一句話拆解成 多個單字 或 詞 ,這些字或詞便是這句話的關鍵詞。

Elasticsearch 不支持對中文進行分詞建立索引,需要配合擴展 elasticsearch-analysis-ik 來實現中文分詞處理。

3.集成Elasticsearch

3.1. Haystack介紹和安裝配置

  • Haystack 是在Django中對接搜索引擎的框架,搭建了用戶和搜索引擎之間的溝通橋梁。
    • 我們在Django中可以通過使用 Haystack 來調用 Elasticsearch 搜索引擎。
  • Haystack 可以在不修改代碼的情況下使用不同的搜索后端(比如 Elasticsearch 、 Whoosh 、 Solr 等等)。

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 說明:

  • 在 SKUIndex 建立的字段,都可以借助 Haystack 由 Elasticsearch 搜索引擎查詢。
  • 其中 text 字段我們聲明為 document=True ,表名該字段是主要進行關鍵字查詢的字段。
  • text 字段的索引值可以由多個數據庫模型類字段組成,具體由哪些模型類字段組成,我們用 use_template=True 表示后續通過模板來指明。

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 全文檢索測試

準備測試表單

  • 請求方法: GET
  • 請求地址: /search/
  • 請求參數: q
<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返回的數據包括:

  • query :搜索關鍵字
  • paginator :分頁paginator對象
  • page :當前頁的page對象(遍歷 page 中的對象,可以得到 result 對象)
  • result.objects : 當前遍歷出來的SKU對象。
<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 接收要渲染的數據,當然也可以使用其他框架的分頁器或自定義的來接收。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

夏邑县| 西乌珠穆沁旗| 黎城县| 烟台市| 揭西县| 亳州市| 广丰县| 收藏| 苍梧县| 翁牛特旗| 威信县| 灯塔市| 麻栗坡县| 金坛市| 达日县| 汾阳市| 绵竹市| 浪卡子县| 河源市| 获嘉县| 灵台县| 尚志市| 罗江县| 正阳县| 当涂县| 都安| 呈贡县| 新津县| 醴陵市| 宜昌市| 读书| 游戏| 西充县| 霍州市| 纳雍县| 黄平县| 张掖市| 神池县| 当涂县| 峨眉山市| 温州市|