2013-06-10 1 views
0

У меня есть следующие модели:Стог __contains не найдя подстроки прошли через GET [ElasticSearch backeng]

class ProductIndex(CelerySearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    number = indexes.CharField() 
    description = indexes.CharField(model_attr='description') 

В моей странице, я выполнить вызов AJAX на функцию, которая должна возвращать мне продукты, которые имеют свои описание, содержащее несколько слов используемых типов. Например, если у меня есть продукт с описанием «Apple Macbook Pro», и пользователь вводит «книгу», я хочу вернуть этот результат.

я выполнить следующее:

q = request.GET['q'] 
results = SearchQuerySet().models(Product).filter(description__contains=q) 

Однако, как я уже сказал, у меня есть, например, продукт с описанием:

Macbook и пользовательские типы book, он не будет работать. Однако Macbook будет работать.

И наконец, если я печатаю q, он возвращает u'book'.

ответ

5

Вы можете использовать indexes.EdgeNgramField вместо indexes.CharField. Это предлагается в документации автозаполнения (http://django-haystack.readthedocs.org/en/v2.0.0/autocomplete.html).

Вам не нужно изменять код запроса.

EDIT:

Чтобы сделать это чувствительно к регистру вы могли бы сделать что-то вроде этого

class ProductIndex(CelerySearchIndex, indexes.Indexable): 
    ... fields here ... 
    def prepare_description(self, object): 
     return object.description.lower() 

и при запросе использования lower() на q

+1

Хорошо это работает! Однако это чувствительно к регистру ... в любом случае обойти это? – abisson

+0

Я отредактировал свой ответ, чтобы показать, как это можно сделать. –

+0

Если вы используете 'lower' в' prepare_ ', и поле является фасетным полем, в интерфейсе фасетов он будет возвращать элементы нижнего регистра, которые выглядят уродливо:/ – Amyth