我使用的是python 2.7.11和djnago 1.10.2。我创建了产品模型,并在数据库中保存了1000种产品。(postgrelsql)实际上,我使用了Django 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外键。如果我搜索product_colour,则显示所有相关数据。
遵循一些步骤:
修改settings.py文件。
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',
},
}
在urls.py中添加了url。
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> </td>
<td>
<input type="submit" value="Search">
</td>
</tr>
</table>
</form>
我使用了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应用程序内部使用多个搜索引擎的工具。您已经安装了elasticsearch吗?
我猜目前无法正常工作,因为SimpleEngine
无法Many2ManyField
正确处理您的问题。
在您中,ProductIndex
您将product_colour定义为CharField。但是您引用了模型中的整个相关模型实例ProductColour
。使用aMultiValueField
来做到这一点:
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
将按照haystack文档中的描述生成字段的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句