如何使用Elasticsearch进行搜索

时间:2017-02-01 13:00:40

标签: python django django-haystack

我使用的是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,则显示所有相关数据。

执行以下步骤: -

  • 安装django-haystack。
  • INSTALLED_APPS settings.py文件中添加了haystack。
  • 修改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>
    

1 个答案:

答案 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