首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将搜索与弹性搜索结合使用

如何将搜索与弹性搜索结合使用
EN

Stack Overflow用户
提问于 2017-02-01 13:00:39
回答 1查看 115关注 0票数 0

我使用python 2.7.11和djnago 1.10.2。我创建了产品模型,并在数据库中保存了1000个产品。(Postgrelsql)实际上,我使用Django elasticsearch,但它不起作用。它的搜索仅基于产品名称,如果搜索类别、颜色等,我要求显示相关产品。我试过例子。

代码语言:javascript
复制
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模型,并在产品moedls中使用了product_colour外键。如果我搜索product_colour,然后显示所有发布的数据。

以下几个步骤:-

  • 安装django-干草堆。
  • INSTALLED_APPS settings.py文件中添加了干草。
  • 修改settings.py文件。 {“默认”:{“引擎”:'haystack.backends.simple_backend.SimpleEngine',},}
  • 在urls.py中添加url。 urlpatterns =模式(‘’,url(r'^/search/?$',MySearchView.as_view(),name='search_view'),
  • 产品模型 类积(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。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-02 07:07:23

我使用Django elasticsearch,但它不起作用。

根据您的干草堆设置,您没有使用Elasticsearch。您正在使用的SimpleEngine,这根本不是真正的搜索引擎。要使用Elasticsearch,您的设置必须包含以下内容:

代码语言:javascript
复制
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://127.0.0.1:9200/',
        'INDEX_NAME': 'haystack',
    },
}

请注意,干草不是搜索引擎本身。它只是一个在django应用程序中使用多个搜索引擎的工具。你已经已安装的弹性搜索了吗?

目前,我猜它不能工作,因为SimpleEngine不能正确地处理您的Many2ManyField

在您的ProductIndex中,您将product_colour定义为CharField。但是您从ProductColour模型中引用了整个相关的模型实例。使用MultiValueField执行以下操作:

代码语言:javascript
复制
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字段的内容将生成如干草堆文档中所述

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41980467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档