2017-02-01 87 views
0

我使用python 2.7.11和djnago 1.10.2。我創建了產品模型並在我的數據庫中保存了1000個產品。(postgrelsql)實際上,我使用了Django elasticsearch,但它不起作用。其搜索只基於產品名稱,我需要如果搜索類別,顏色等,然後​​顯示相關的產品。我試了一下例子。如何使用Elasticsearch進行搜索

from haystack import indexes 
from product.models import Product 

class ProductIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    product_name = indexes.CharField(model_attr='product_name') 
    product_colour = indexes.CharField(model_attr='product_colour') 

    def get_model(self): 
     return Product 

    def index_queryset(self, using=None): 
     return self.get_model().objects.all() 

我在Product moedls中創建了ProductColour模型並使用了product_colour foreignkey。如果我搜索product_colour,然後顯示所有相關的數據。

以下一些步驟: -

  • 安裝Django,乾草堆。
  • INSTALLED_APPS settings.py文件中添加乾草堆。
  • 修改settings.py文件。

    HAYSTACK_CONNECTIONS = { 
        'default': { 
         'ENGINE': 'haystack.backends.simple_backend.SimpleEngine', 
        }, 
    } 
    
  • 在urls.py中添加了網址。

    urlpatterns = patterns('', 
        url(r'^/search/?$', MySearchView.as_view(), name='search_view'), 
    ) 
    
  • 產品型號。

    class Product(models.Model): 
        product_name = models.CharField(max_length=100) 
        product_description = models.TextField(default=None, blank=True, null=True) 
        product_colour = models.ManyToManyField(ProductColour, blank=True, default=None) 
        ....... 
        ....... 
        ....... 
    
  • search.html。

    <form method="get" action="."> 
        <table> 
         {{ form.as_table }} 
         <tr> 
          <td>&nbsp;</td> 
          <td> 
           <input type="submit" value="Search"> 
          </td> 
         </tr> 
        </table> 
    </form> 
    
+0

請張貼您的搜索索引模板和您的產品型號的相關部分。 – trixn

+0

@trixn plz檢查它,先生,新的更新。 –

回答

0

我用Django的elasticsearch但它不工作。

根據你的乾草堆設置,你沒有使用Elasticsearch。您正在使用SimpleEngine,它根本不是真正的搜索引擎。要使用Elasticsearch,您的設置必須包含以下內容:

HAYSTACK_CONNECTIONS = { 
    'default': { 
     'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 
     'URL': 'http://127.0.0.1:9200/', 
     'INDEX_NAME': 'haystack', 
    }, 
} 

請注意,乾草堆不是搜索引擎本身。它只是一個在django應用程序中使用多個搜索引擎的工具。你已經installed elasticsearch

目前它不工作,我猜,因爲SimpleEngine無法正確處理您的Many2ManyField

在您的ProductIndex中,您將product_colour定義爲CharField。但是您引用了您的ProductColour模型中的整個相關模型實例。使用MultiValueField做到這一點:

from haystack import indexes 
from product.models import Product 

class ProductIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    product_name = indexes.CharField(model_attr='product_name') 

    # use a MultiValueField for your m2m relation 
    product_colours = indexes.MultiValueField() 

    # define this method that returns all the values for your product_colours index field 
    # it must be called "prepare_{your field name}" 
    def prepare_product_colours(self, object): 
     return [colour.name for color in object.product_colour.all()] 

然後你需要一個模板,其中text字段的內容,將產生as described in the haystack documentation您的搜索索引。

相關問題