2

我是新手elasticsearch。我想将我的存储MySQL Dataelasticsearch我的Django App. 但我不知道从哪里开始。我查看了 Haystack 教程,并将数据编入索引,elasticsearch但如何查询该数据?

模型.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)

搜索索引.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、price 等执行不同类型的查询。

我怎么做?

4

1 回答 1

0

由于SearchQuerySet().all()正在返回结果,因此您似乎已经完成了大部分工作。现在您只需要添加一个过滤器即可仅获得您想要的结果。

尝试这个:

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

看看你是否得到那个标题的结果。

有关更多信息,请查看文档:searchqueryset_api

于 2014-02-13T01:29:59.810 回答