2013-11-22 3 views
0

Я пытаюсь понять, как работает поиск сена.Числа и специальные символы в строке поиска в Haystack + Whoosh

Я хава порядка модели с полем Order.no где номер заказа хранится в виде 'ABC/2013/11/1', 'ABC/2013/11/2' ...

I хотите реализовать автозаполнение в этом поле, используя Haystack с бэкэндом Whoosh (django-haystack 2.1.0, celery-haystack 0.7.2, Whoosh 2.5.5, Django 1.6). Мой search_index.py выглядит следующим образом:

class OrderIndex(CelerySearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    name_auto = indexes.EdgeNgramField(model_attr='name') 

    def get_model(self): 
     return Order 

Когда я пытаюсь

SearchQuerySet().autocomplete(name_auto='ABC/2013') 

Я получаю как ABC/2013/11/1 и ABC/2013/11/2 и это нормально

когда я пытаюсь

SearchQuerySet().autocomplete(name_auto='ABC/2013/11') 

Я все еще Получать как ABC/2013/11/1 и ABC/2013/11/2, и это тоже нормально , но когда я тр у

SearchQuerySet().autocomplete(name_auto='ABC/2013/11/1') 

Я все еще Получать как ABC/2013/11/1 и ABC/2013/11/2 Я не понимаю, почему.

Я также заметил, что когда я изменить формат чисел для всего проекта «1/ABC/2013/10» ... запрос как

SearchQuerySet().autocomplete(name_auto='1/') 

не возвращает никаких результатов и запрос как

SearchQuerySet().autocomplete(name_auto='1/ABC') 

возвращение как «1/ABC/2013/10», так и «2/ABC/2013/10».

Возможно, мне не хватает чего-то, связанного с числами и/или специальными символами в запросах/поисковых строках Haystack. Спасибо за любую помощь.

ответ

0

Причина состоит в двух действиях: во-первых, что «вперед-вниз» («/») является зарезервированным символом в Whoosh, поэтому его игнорируют. Во-вторых, Whoosh также игнорирует условия поиска одиночного символа.

Так ваш запрос,

'ABC/2013/11/1' 

если сняли с косой чертой,

'ABC 2013 11 1' 

, а затем одиночные символы,

'ABC 2013 11' 

Выглядит так же, как если бы вы ищете

'ABC/2013/11' -> 'ABC 2013 11' 

Забавно, что документация кажется мамой об этом странном поведении.