2017-02-01 11 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() 

Я создал Модели ProductColour и использовал product_colour foreignkey в продуктовых модах. Если я ищу product_colour, тогда отобразите все выпущенные данные.

После некоторых шагов: -

  • Установите Джанго-стог.
  • Добавлен стог сена в INSTALLED_APPS файл settings.py.
  • Измените файл settings.py.

    HAYSTACK_CONNECTIONS = { 
        'default': { 
         'ENGINE': 'haystack.backends.simple_backend.SimpleEngine', 
        }, 
    } 
    
  • Добавлен url в 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) 
        ....... 
        ....... 
        ....... 
    
  • поиск.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.