2017-02-13 13 views
0

Я работаю над приложением, основанным на django 1.8 и поисковой системе django-haystack 2.4.1. Странная ситуация, потому что, когда я ищу слова "New York" - все в порядке. Если есть странное имя в имени события, например. "Zo-zo on" (с тире) поиск не отображает правильные результаты, только страницы отдельных экземпляров букв, например: "zo ..."Имена с тире не работают в django-haystack

Я сделал rebuild_index.

class EventIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.EdgeNgramField(document=True, use_template=True) 
    id = indexes.CharField(model_attr='id') 
    get_absolute_url = indexes.CharField(model_attr='get_absolute_url') 
    description = indexes.CharField(model_attr='description', null=True) 
    is_past = indexes.CharField(model_attr='is_past', default='false') 
    date_start = indexes.DateTimeField(model_attr='date_start') 

    def get_model(self): 
     return Booking 

    def index_queryset(self, using=None): 
     date_past = now() - timedelta(days=1) 
     return self.get_model().published.filter(date_start__gt=date_past).filter(id=7353) 

    def read_queryset(self, using=None): 
     return self.get_model().all_objects.all() 
+0

Можете ли вы поделиться своей схемой SearchIndex, соответствующей тому же. –

+0

@BipulJain Вы имеете в виду код? – mark

+0

да. У вас должен быть определенный searchIndex search_indexes.py –

ответ

1

ОК на основе вашей схемы индекса поиска. Вы используете EdgeNGramField, который символизирует все, что вы ему даете, в токен размером 2 и более.

Для бывших: если вы нью-йорк будет разметить и убедитесь, что ваш документ соответствует условиям, как пе, новый, год, Йор и йорке. Поля EdgeNGram обычно используются для автоматического отладки, так как во время запроса и индексирования он токенизирует слово в таких формах.

Вы можете изменить свою схему на CharField. Таким образом это будет zo-zo преобразуется в zo zo который будет соответствовать Zo-zo на в вашем указателе.

class EventIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 

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

Создайте отдельное поле, если вы намерены сохранить поле EdgeNGram.

+0

Большое спасибо за ваш ответ. Пожалуйста, расскажите, как я могу использовать CharField и EdgeNGramField в модели? Мне нужен EdgeNGramField. Я попытался с помощью text_1 = indexes.CharField (document = True, use_template = True) ', но у меня может быть только одно поле с' document = True' – mark