亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2019年06月04日 15:48:07   作者:Simon_Zhou  
這篇文章主要介紹了Django集成搜索引擎Elasticserach的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.背景

當(dāng)用戶在搜索框輸入關(guān)鍵字后,我們要為用戶提供相關(guān)的搜索結(jié)果??梢赃x擇使用模糊查詢 like 關(guān)鍵字實(shí)現(xiàn),但是 like 關(guān)鍵字的效率極低。查詢需要在多個(gè)字段中進(jìn)行,使用 like 關(guān)鍵字也不方便,另外分詞的效果也不理想。

全文檢索方案

  • 全文檢索即在指定的任意字段中進(jìn)行檢索查詢。
  • 全文檢索方案需要配合搜索引擎來實(shí)現(xiàn)。

搜索引擎原理

  • 搜索引擎 進(jìn)行全文檢索時(shí),會(huì)對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行一遍預(yù)處理,單獨(dú)建立起一份 索引結(jié)構(gòu)數(shù)據(jù) 。
  • 索引結(jié)構(gòu)數(shù)據(jù) 類似字典的索引檢索頁 ,里面包含了關(guān)鍵詞與詞條的對(duì)應(yīng)關(guān)系,并記錄詞條的位置。
  • 搜索引擎進(jìn)行全文檢索時(shí),將 關(guān)鍵字在索引數(shù)據(jù)中進(jìn)行快速對(duì)比查找,進(jìn)而找到數(shù)據(jù)的真實(shí)存儲(chǔ)位置 。

2.Elasticsearch介紹

實(shí)現(xiàn)全文檢索的搜索引擎,首選的是 Elasticsearch 。

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

分詞說明

搜索引擎在對(duì)數(shù)據(jù)構(gòu)建索引時(shí),需要進(jìn)行分詞處理。

分詞是指將一句話拆解成 多個(gè)單字 或 詞 ,這些字或詞便是這句話的關(guān)鍵詞。

Elasticsearch 不支持對(duì)中文進(jìn)行分詞建立索引,需要配合擴(kuò)展 elasticsearch-analysis-ik 來實(shí)現(xiàn)中文分詞處理。

3.集成Elasticsearch

3.1. Haystack介紹和安裝配置

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

Haystack安裝

$ pip install django-haystack
$ pip install elasticsearch==2.4.1

Haystack注冊(cè)應(yīng)用和路由

在 django 的配置文件中注冊(cè)。

INSTALLED_APPS = [ 'haystack', # 全文檢索注冊(cè)]​

在總路由中新建 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服務(wù)器ip地址,端口號(hào)固定為9200
  'INDEX_NAME': 'serach_mall', # Elasticsearch建立的索引庫的名稱
 },
}

# 當(dāng)添加、修改、刪除數(shù)據(jù)時(shí),自動(dòng)生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 搜索的每頁大小
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 3

HAYSTACK_SIGNAL_PROCESSOR 配置項(xiàng)保證了在Django運(yùn)行起來后,有新的數(shù)據(jù)產(chǎn)生時(shí),Haystack仍然可以讓Elasticsearch實(shí)時(shí)生成新數(shù)據(jù)的索引。

3.2 Haystack建立數(shù)據(jù)索引

1.創(chuàng)建索引類

通過創(chuàng)建索引類,來指明讓搜索引擎對(duì)哪些字段建立索引,也就是可以通過哪些字段的關(guān)鍵字來檢索數(shù)據(jù)。

本項(xiàng)目中對(duì)模型類SKU信息進(jìn)行全文檢索,所以在 該模型類的應(yīng)用(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索引數(shù)據(jù)模型類"""
 text = indexes.CharField(document=True, use_template=True)

 def get_model(self):
  """返回建立索引的模型類"""
  return SKU

 def index_queryset(self, using=None):
  """返回要建立索引的數(shù)據(jù)查詢集"""
  return self.get_model().objects.filter(is_launched=True) 

索引類 SKUIndex 說明:

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

2.創(chuàng)建text字段索引值模板文件

在項(xiàng)目 templates 目錄中創(chuàng)建 text字段 使用的模板文件

具體在 templates/search/indexes/goods/sku_text.txt 文件中定義,其中 goods 為應(yīng)用名, sku_text.txt 中的 sku 為模型類小寫。

{{ object.id }}
{{ object.name }}
{{ object.caption }}

模板文件說明:當(dāng)將關(guān)鍵詞通過text參數(shù)名傳遞時(shí)

此模板指明SKU的 id 、 name 、 caption 作為 text 字段的索引值來進(jìn)行關(guān)鍵字索引查詢。

3.手動(dòng)生成初始索引

$ python manage.py rebuild_index

第一次需要生成索引需要執(zhí)行上述命令,后續(xù)會(huì)自動(dòng)生成索引。

3.3 全文檢索測(cè)試

準(zhǔn)備測(cè)試表單

  • 請(qǐng)求方法: GET
  • 請(qǐng)求地址: /search/
  • 請(qǐng)求參數(shù): 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 接收和渲染全文檢索的結(jié)果 .

3.4 渲染搜索結(jié)果

Haystack返回的數(shù)據(jù)包括:

  • query :搜索關(guān)鍵字
  • paginator :分頁paginator對(duì)象
  • page :當(dāng)前頁的page對(duì)象(遍歷 page 中的對(duì)象,可以得到 result 對(duì)象)
  • result.objects : 當(dāng)前遍歷出來的SKU對(duì)象。
<div class="main_wrap clearfix">
 <div class=" clearfix">
  <ul class="goods_type_list clearfix">
   {% for result in page %}
   <li>
    {# object取得才是sku對(duì)象 #}
    <a href="/detail/{{ result.object.id }}/" rel="external nofollow" rel="external nofollow" ><img src="{{ result.object.default_image.url }}"></a>    
    <h4><a href="/detail/{{ result.object.id }}/" rel="external nofollow" rel="external nofollow" >{{ result.object.name }}</a></h4>
    <div class="operate">
     <span class="price">¥{{ result.object.price }}</span>
     <span>{{ result.object.comments }}評(píng)價(jià)</span>
    </div>
   </li>
   {% else %}
    <p>沒有找到您要查詢的商品。</p>
   {% endfor %}
  </ul>
  <div class="pagenation">
   <div id="pagination" class="page"></div>
  </div>
 </div>
</div>

這里Elasticsearch替我們把django中的視圖函數(shù)寫了。

搜索頁分頁器

<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 接收要渲染的數(shù)據(jù),當(dāng)然也可以使用其他框架的分頁器或自定義的來接收。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python流程控制詳細(xì)介紹

    python流程控制詳細(xì)介紹

    這篇文章主要介紹了python流程控制,文章主要根據(jù)python流程控制的相關(guān)資料展開全文內(nèi)容,具有一定的參考解釋,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2021-12-12
  • Python蛇形方陣的實(shí)現(xiàn)

    Python蛇形方陣的實(shí)現(xiàn)

    本文主要介紹了Python蛇形方陣的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 對(duì)Pyhon實(shí)現(xiàn)靜態(tài)變量全局變量的方法詳解

    對(duì)Pyhon實(shí)現(xiàn)靜態(tài)變量全局變量的方法詳解

    今天小編就為大家分享一篇對(duì)Pyhon實(shí)現(xiàn)靜態(tài)變量全局變量的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 基于python traceback實(shí)現(xiàn)異常的獲取與處理

    基于python traceback實(shí)現(xiàn)異常的獲取與處理

    這篇文章主要介紹了基于python traceback實(shí)現(xiàn)異常的獲取與處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • python開發(fā)之str.format()用法實(shí)例分析

    python開發(fā)之str.format()用法實(shí)例分析

    這篇文章主要介紹了python開發(fā)之str.format()用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了str.format()函數(shù)的功能,使用方法與相關(guān)注意事項(xiàng),代碼包含詳盡的注釋說明,需要的朋友可以參考下
    2016-02-02
  • flask實(shí)現(xiàn)驗(yàn)證碼并驗(yàn)證功能

    flask實(shí)現(xiàn)驗(yàn)證碼并驗(yàn)證功能

    Flask是一個(gè)用Python編寫的Web應(yīng)用程序框架,F(xiàn)lask是python的web框架,最大的特征是輕便,讓開發(fā)者自由靈活的兼容要開發(fā)的feature。這篇文章主要介紹了flask實(shí)現(xiàn)驗(yàn)證碼并驗(yàn)證,需要的朋友可以參考下
    2019-12-12
  • TensorFLow用Saver保存和恢復(fù)變量

    TensorFLow用Saver保存和恢復(fù)變量

    這篇文章主要為大家詳細(xì)介紹了TensorFLow用Saver保存和恢復(fù)變量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 使用Python在PowerPoint演示文稿之間復(fù)制樣式

    使用Python在PowerPoint演示文稿之間復(fù)制樣式

    在專業(yè)演示文稿設(shè)計(jì)與制作領(lǐng)域,多場演示間保持一致性至關(guān)重要,在PowerPoint演示文稿之間復(fù)制幻燈片母版成為了一項(xiàng)關(guān)鍵技巧,本文中,我們將探討如何使用Python在不同的PowerPoint演示文稿之間復(fù)制幻燈片母版,提升演示文稿創(chuàng)作流程的效率與美觀度,需要的朋友可以參考下
    2024-05-05
  • python列表去重的5種常見方法實(shí)例

    python列表去重的5種常見方法實(shí)例

    在Python編程過程中經(jīng)常會(huì)遇到列表去重的問題,下面這篇文章主要給大家介紹了python列表去重的5種常見方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Python3 filecmp模塊測(cè)試比較文件原理解析

    Python3 filecmp模塊測(cè)試比較文件原理解析

    這篇文章主要介紹了Python3 filecmp模塊測(cè)試比較文件原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論