簡體   English   中英

如何將Elasticsearch與Django集成

[英]How to integrate elasticsearch with Django

我是elasticsearch新手。 我想將我的MySQL Data存儲到我的Django App elasticsearch中。 但是我不知道從哪里開始。 我看過Haystack教程,已經將數據索引到了elasticsearch但是如何查詢該數據呢?

models.py

import json
from django.db import models
from django.contrib import admin
#------------------------------------------------------------------------------ 


class scrapedData (models.Model):
    """ This a model for scraped data collected by eScraper"""

    productMRP = models.FloatField()                                      # Product MRP
    image_urls = models.TextField()                                       # Images URL's for image pipeline for downloading
    productSite = models.URLField()                                       # Product web-site URL
    productDesc = models.TextField()                                      # Product Description
    image_paths = models.TextField()                                      # Product images path on the local machine
    productImage = models.TextField()                                     # Product image URL's
    productTitle = models.TextField()                                     # Product title
    productPrice = models.FloatField()                                    # Product discounted price
    hasVariants = models.BooleanField()                                   # Product variants like : colors or sizes, True is if product has variants, False otherwise
    productCategory = models.TextField()                                  # Product category
    availability = models.BooleanField()                                  # Product availability ,True if product is in stock, False otherwise
    productSubCategory = models.TextField()                               # Product sub-category
    currency = models.CharField(max_length=3)                             # Product price currency
    productURL = models.URLField(max_length=500)                          # Product page URL
    updatedAt = models.DateTimeField(auto_now=True)                       # Time at which product is updated
    createdAt = models.DateTimeField(auto_now_add=True)                   # Time at which product is created


class scrapedDataAdmin(admin.ModelAdmin):
    """scrapedData admin class"""

    list_display = ('productTitle','productSite','updatedAt','createdAt',
                    'product_URL','product_Image','productMRP','productPrice','currency',
                    'productDesc','productCategory','availability',
                    'hasVariants','productSubCategory','image_paths','image_urls'
                    )

    ordering = ('productSite',)


admin.site.register(scrapedData,scrapedDataAdmin)

seach_indexes.py

from haystack import indexes
from eScraperInterfaceApp.models import scrapedData

#------------------------------------------------------------------------------

class scrapedDataIndex(indexes.SearchIndex, indexes.Indexable):
    """
        This is a index class for scrapedData model 
    """

    productMRP = indexes.CharField()
    productDesc = indexes.CharField()
    productTitle = indexes.CharField()
    productPrice = indexes.CharField()
    productCategory = indexes.CharField()
    productSubCategory = indexes.CharField()
    text = indexes.CharField(document=True, use_template=False) # This field is the primary field for searching within

    def get_model(self):
        """
            This is a haystack method to get model name for the APP 
        """
        return scrapedData

    def index_queryset(self, using=None):        
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter()

然后我使用以下命令將數據索引到elasticsearch中: python manage.py rebuild_index

當我嘗試:

from pprint import pprint 
from haystack.query import SearchQuerySet


all_results = SearchQuerySet().all()
pprint(all_results)

輸出為:

[
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'742')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'747')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'754')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'759')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'761')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'766')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'773')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'778')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'780')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'785')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'792')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'797')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'800')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'805')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'812')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'817')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'824')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'829')>,
    <SearchResult: eScraperInterfaceApp.scrapeddata (pk=u'831')>,
    '...(remaining elements truncated)...'
]

我想使用elasticsearch作為我網站的后端。 因此,我需要根據productDesc,MRP,價格等執行不同類型的查詢。

我怎么做?

由於SearchQuerySet().all()返回結果,因此您似乎已經走了很多路。 現在,您只需要添加一個過濾器即可僅獲取所需的結果。

嘗試這個:

SearchQuerySet().filter(title="AN EXISTING TITLE")

並查看是否獲得該標題的結果。

有關更多信息,請檢查docs: searchqueryset_api

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM