最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django使用haystack調(diào)用Elasticsearch實現(xiàn)索引搜索

 更新時間:2019年07月24日 09:48:49   作者:苦瓜爆炒牛肉  
這篇文章主要介紹了django使用haystack調(diào)用Elasticsearch實現(xiàn)索引搜索,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

前言:

在做一個商城項目的時候,需要實現(xiàn)商品搜索功能。

說到搜索,第一時間想到的是數(shù)據(jù)庫的 select * from tb_sku where name like %蘋果手機%

或者django的 SKU.objects.filter(name__contains="蘋果手機")

但是,假如你的數(shù)據(jù)庫有幾千萬條數(shù)據(jù),name字段沒有索引,可能查詢需要十幾分鐘,用戶可能會等你?那為什么不給name字段增加索引?商品表不僅僅是用來查詢,也會經(jīng)常修改數(shù)據(jù),新增刪除數(shù)據(jù)等。建立索引后,做增刪改操作時也會大大占用數(shù)據(jù)庫資源。所以應(yīng)該怎么解決呢?

Elasticsearch!

一個強大的基于Lucene的全文搜索服務(wù)器!維基百科、Stack Overflow、Github都在用。

如果想詳細了解其原理的話,可以參考:Elasticsearch 基礎(chǔ)介紹及索引原理分析

這里只是簡單說一下他的原理。

Elasticsearch原理:

部署好ElasticSearch服務(wù)器后,剛開始需要創(chuàng)建索引,ES索引庫會對數(shù)據(jù)庫中的數(shù)據(jù)進行一遍預處理,單獨建立起一份索引結(jié)構(gòu)數(shù)據(jù)。

理解:

假如你的商品表里有這幾個字段。id,名字,副標題,價格,商品圖片鏈接地址,評論數(shù),是否上架。

一般用戶會根據(jù)名字或者副標題來搜索。此時名字、副標題這個字段就需要建立索引(當然,id也要,人家在mysql那里是主鍵總要給點面子吧)。但是后端返回給前端的數(shù)據(jù),不僅僅是需要名字、副標題啊。你還要價格什么的呢!所以我們還要指定需要的字段,不然直接找個名字或者副標題出來有什么用?

所以剛開始創(chuàng)建索引庫時,ElasticSearch服務(wù)端會根據(jù)我們指定要作為索引的字段(名字、副標題、id)、要返回的字段(價格...),同步一份到ES索引庫里面。為什么要同步到elasticsearch?因為查找快呀。至于為什么ElasticSearch查找這么快,可以參考一下上面鏈接的原理。

注意上面的圖,ElasticSearch是C/S架構(gòu)的軟件。下面說一下,服務(wù)端怎么搭建?

ElasticSearch服務(wù)端的搭建:

在搭建前說下,ElasticSearch建立索引時會分詞。什么是分詞呢?例如“我今天吃了一個漢堡包”。分詞后是“我”、“今天”、“吃了”、“一個”、“漢堡包”。你以為ElasticSearch會這么智能?沒錯,它對英文是這么智能,但是對我們的中文,只會分成“我”、“今”、“天”、“吃”、“了”、“一”、“個”、“漢”、“堡”、“包”。這樣用戶還怎么搜索啊。。。所以我們需要一個在ElasticSearch服務(wù)端集成一個插件,ElasticSearch-ik插件。有了這個插件,真的可以這么智能了。

所以,帶有-ik插件的ElasticSearch服務(wù)端怎么裝呢?

太麻煩了,所以我選擇docker(滑稽.jpg)

(1)加載docker鏡像

sudo docker load -i elasticsearch-ik-2.4.6_docker.tar

(2)修改配置文件

elasticsearc-2.4.6/config/elasticsearch.yml第54行,更改ip地址為本機ip地址:

network.host: xxx.xxx.xxx.xxx

如果docker不是運行在開發(fā)環(huán)境的本機,可以設(shè)為0.0.0.0。表示允許所有ip訪問此服務(wù)器。

(3)運行容器

docker run -d -p 9200:9200 --network=host --name=elasticsearch -v /var/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0

(4)測試ElasticSearch是否安裝成功

curl 'http://xxx.xxx.xxx.xxx:9200/' # IP地址是ElasticSearch的IP

如果測試成功,那么ElasticSearch服務(wù)器就已經(jīng)全部搭建完畢啦,而且這個鏡像集中了-ik插件,支持中文分詞。搭建完服務(wù)端后,就要用客戶端了。

使用Haystack對接Elasticsearch客戶端:

如果直接在Django項目直接編寫代碼作為ElasticSearch的客戶端,比較復雜,所以借助第三方包Haystack來對接ELasticSearch的客戶端。而且使用了Haystack后,以后你換其他的全文搜索服務(wù)器時(雖然不太可能換),也不用修改Django項目已經(jīng)寫好的代碼。

(1)安裝Haystack和ElasticSearch客戶端。

pip install drf-haystack # 因為該項目是用DRF寫的前后端分離,所以安裝的是drf-haystack。如果不用DRF的話,安裝的是django-haystack
pip install elasticsearch==2.4.1

(2)配置

1.注冊應(yīng)用

  INSTALLED_APPS = [
    ...
    'haystack',
    ...
  ]

2.在項目的配置文件中配置haystack

  # 配置haystack全文檢索框架
  HAYSTACK_CONNECTIONS = {
    'default': {
      'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
      # 此處為elasticsearch運行的服務(wù)器ip地址,端口號默認為9200
      'URL': 'http://xxx.xxx.xxx.xxx:9200/', 
      # 指定elasticsearch建立的索引庫的名稱
      'INDEX_NAME': 'meiduo', 
    },
  }
  # 當添加、修改、刪除數(shù)據(jù)時,自動更新索引
  HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

(3)創(chuàng)建索引類

創(chuàng)建索引類的目的是指定要保存的字段,ElasticSearch服務(wù)器會把mysql的這些字段的數(shù)據(jù)進行同步。方便查詢出來時進行返回。

# goods(應(yīng)用名)/search_indexes.py  # search_indexes名字不能改,固定
from haystack import indexes
from .models import SKU

class SKUIndex(indexes.SearchIndex, indexes.Indexable):
  """
  SKU索引類
  """  # text表示被查詢的字段,用戶搜索的是這些字段的值,具體被索引的字段寫在另一個文件里。
  text = indexes.CharField(document=True, use_template=True)

  # 保存在索引庫中的字段
  id = indexes.IntegerField(model_attr='id')
  name = indexes.CharField(model_attr='name')
  price = indexes.DecimalField(model_attr='price')
  default_image_url = indexes.CharField(model_attr='default_image_url')
  comments = indexes.IntegerField(model_attr='comments')

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

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

(4)指定被索引的字段

# templates/search/indexes/goods(應(yīng)用名)/sku_text.txt  # 路徑和名字是固定的
{{ object.name }}
{{ object.caption }}
{{ object.id }}

(5)生成索引庫

python manage.py rebuild_index

此時,索引庫成功生成了。接下來就是后端接受用戶存過來的查詢參數(shù),并返回相應(yīng)的字段了。

完善后端:

剛剛寫的SKUIndex可以當做是我們平時寫DRF時的model類,接下來還要寫序列化器,視圖,注冊路由。

(1)Haystack序列化器類

from drf_haystack.serializers import HaystackSerializer

class SKUIndexSerializer(HaystackSerializer):
  """
  SKU索引結(jié)果數(shù)據(jù)序列化器
  """
  class Meta:
    index_classes = [SKUIndex]
    fields = ('text', 'id', 'name', 'price', 'default_image_url', 'comments')

(2)Haystack視圖

from drf_haystack.viewsets import HaystackViewSet

class SKUSearchViewSet(HaystackViewSet):  # HaystackViewSet繼承了RetrieveModelMixin, ListModelMixin, ViewSetMixin, HaystackGenericAPIView,所以可以查一條或多條數(shù)據(jù)
  """
  SKU搜索
  HaystackViewSet: 查一條,查多條
  """
  index_models = [SKU]
  serializer_class = SKUIndexSerializer

(3)注冊路由

router = DefaultRouter()
router.register('skus/search', views.SKUSearchViewSet, base_name='skus_search')
...
urlpatterns += router.urls

(4)訪問:127.0.0.1:8080/skus/search/?text=Apple

就可以查詢出帶有Apple的數(shù)據(jù)了~

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

相關(guān)文章

  • Python爬取英雄聯(lián)盟MSI直播間彈幕并生成詞云圖

    Python爬取英雄聯(lián)盟MSI直播間彈幕并生成詞云圖

    很開心RNG最近在英雄聯(lián)盟季中賽奪冠了,特地爬取了直播間彈幕并生成詞云圖,大家一起開心一下,看看奪冠時大家都在說什么,需要的朋友可以參考下
    2021-06-06
  • Python?文件處理之open()函數(shù)

    Python?文件處理之open()函數(shù)

    這篇文章主要介紹了Python?文件處理之open()函數(shù),在?Python?中使用文件的關(guān)鍵函數(shù)是?open()?函數(shù),關(guān)于其打開文件的不同方式需要的小伙伴可以參考下面詳細介紹
    2022-03-03
  • 使用python腳本實現(xiàn)查詢火車票工具

    使用python腳本實現(xiàn)查詢火車票工具

    這篇文章主要介紹了使用python腳本實現(xiàn)查詢火車票工具,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Python開發(fā)游戲之井字游戲的實戰(zhàn)步驟

    Python開發(fā)游戲之井字游戲的實戰(zhàn)步驟

    最近正在學習Python,所以最近做了一個關(guān)于Python的實例,下面這篇文章主要給大家介紹了關(guān)于Python開發(fā)游戲之井字游戲的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • Pytorch?和?Tensorflow?v1?兼容的環(huán)境搭建方法

    Pytorch?和?Tensorflow?v1?兼容的環(huán)境搭建方法

    這篇文章主要介紹了搭建Pytorch?和?Tensorflow?v1?兼容的環(huán)境,本文是小編經(jīng)過多次實踐得到的環(huán)境配置教程,給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • python中的 Matplotlib 繪制多子圖時的重疊問題及解決方案

    python中的 Matplotlib 繪制多子圖時的重疊問題及解決方案

    當使用 Matplotlib 繪制多個子圖(subplots)時,如果標簽或標題文字交叉或重疊,遇到這樣的問題如何處理呢,下面小編給大家介紹了python中的 Matplotlib 繪制多子圖時的重疊問題及解決方案,需要的朋友可以參考下
    2024-06-06
  • Python3壓縮和解壓縮實現(xiàn)代碼

    Python3壓縮和解壓縮實現(xiàn)代碼

    這篇文章主要介紹了Python3壓縮和解壓縮實現(xiàn)代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 對python中array.sum(axis=?)的用法介紹

    對python中array.sum(axis=?)的用法介紹

    今天小編就為大家分享一篇對python中array.sum(axis=?)的用法介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python實現(xiàn)圖片識別汽車功能

    python實現(xiàn)圖片識別汽車功能

    這篇文章主要為大家詳細介紹了python實現(xiàn)圖片識別汽車功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 講解Python3中NumPy數(shù)組尋找特定元素下標的兩種方法

    講解Python3中NumPy數(shù)組尋找特定元素下標的兩種方法

    這篇文章主要介紹了講解Python3中NumPy數(shù)組尋找特定元素下標的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08

最新評論

巩义市| 长泰县| 长乐市| 凤冈县| 英山县| 卢湾区| 惠州市| 玉溪市| 呼伦贝尔市| 含山县| 花垣县| 明星| 望奎县| 武冈市| 湘潭市| 原阳县| 邵阳县| 苏州市| 泽州县| 三原县| 泸西县| 惠水县| 清远市| 安溪县| 武强县| 金昌市| 札达县| 尉犁县| 肃宁县| 葫芦岛市| 温宿县| 资阳市| 绥棱县| 武山县| 渭南市| 新乡市| 印江| 修文县| 潼关县| 云龙县| 长汀县|