我使用的是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 foreignkey。如果我搜索product_colour,则显示所有相关数据。
执行以下步骤: -
修改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> </td>
<td>
<input type="submit" value="Search">
</td>
</tr>
</table>
</form>
答案 0 :(得分:0)
我使用了Django elasticsearch,但它没有用。
根据您的haystack设置,您没有使用Elasticsearch。您使用的SimpleEngine
根本就不是真正的搜索引擎。要使用Elasticsearch,您的设置必须包含此内容:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/',
'INDEX_NAME': 'haystack',
},
}
请注意,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。