1

Тема: Пошук Django+Haystack+Elasticksearch

Привіт!
Доводиться мені зараз прикрутити пошук до сайту. Сайт досить великий, є 5 основних типів даних (по яких треба зробити пошук), всього разом в кількості десь 20-30 (не точно) тис. об'єктів в базі. Вирішив робити з даними технологіями, а не просто Q, так як здаэться вийде дуже велике навантаження з ним.

1. От тут і така ідея: поле одне, але при виведенні результатів розділяти все на вкладки, залежно від типу моделі. Це ок так буде?
Можете запропонувати щось якось інакше?


2. Може мені хтось пояснити наступне: як я зрозумів, пошук штука, що хоче багато ресурсів і щоб ефективно все працювало, треба спочатку зібрати ті дані з об'єктів, в яких в майбутному будемо шукати співпадіння введеного юзером. Це індекси. Правильно?

Що тоді це таке? Haystack документація каже створити такий клас індекс:

class PlaceIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    name = indexes.CharField(model_attr='name')
    user = indexes.CharField(model_attr='user')

    def get_model(self):
        return Place

Там де є use_template значить там має бути txt шаблон, a в шаблоні:

{{ object.name }}
{{ object.user.get_full_name }}
{{ object.features }}

здається, тут ми виводимо саме ту інформацію, яку треба зберегти в індексі. Правильно?

Навіщо тоді оці атрибути в класі індексу:

    name = indexes.CharField(model_attr='name')
    user = indexes.CharField(model_attr='user')

Що вони роблять?


Оце такі 2 питання. Якщо знаєте щось, допоможіть-розкажіть, будь ласка.
Звісно ж, в гуглі я був. Там просто туторіали є скопіювати, вставити...

Вельми вдячний.

2

Re: Пошук Django+Haystack+Elasticksearch

Так і не зрозумів у чому суть питання, особливо першого. Краще задам Вам кілька питань:
1) як наразі зберігаються ваші дані?
2) покажіть приклад вхідних даних і що саме потрібно знати;
3) Ви вже пробували робити якийсь пошук (навіть простий SELECT, 20-30 тисяч записів - це небагато, MySQL простий запит з мільйона рядків може вибрати відносно швидко)?

3

Re: Пошук Django+Haystack+Elasticksearch

Master_Sergius написав:

Так і не зрозумів у чому суть питання, особливо першого. Краще задам Вам кілька питань:
1) як наразі зберігаються ваші дані?
2) покажіть приклад вхідних даних і що саме потрібно знати;
3) Ви вже пробували робити якийсь пошук (навіть простий SELECT, 20-30 тисяч записів - це небагато, MySQL простий запит з мільйона рядків може вибрати відносно швидко)?

1. PostgreSQL
2. Напр. вводимо в поле пошуку "Привіт світ" і треба знайти всі співпадіння в п'ятьох моделях. І тут виникає питання, як відобразити результати? Це ж 5 різних типів, тому перше, що спало, на думку: розбити результати на вкладки (у соціалках таке часто є). Напр. 1. вкладка - всі результати з моделі А,  друга - Б, і тд.

3. Ні.

4

Re: Пошук Django+Haystack+Elasticksearch

Чесно - мені все одно важко зрозуміти в чому проблема. Кілька разів перечитуав, чекав може ще хтось відповість. Можу порадити хіба що діяти, експериментувати, показувати приклади.

5 Востаннє редагувалося Q-bart (26.04.2017 16:49:51)

Re: Пошук Django+Haystack+Elasticksearch

Ну перша проблема: я не знав навіщо поля name user в  класі індексу.

class PlaceIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    name = indexes.CharField(model_attr='name')
    user = indexes.CharField(model_attr='user')

Ще раз почитав документацію - здається, це поля які можна потім використовувати для пошуку в формі. А те що треба індексувати - має бути в шаблоні з поля text.


Друге: в мене було питання, як вивести результати пошуку. Напр. за заданим текстом знайшло 2 користувачі і 4 статті. Як мені іх вивести в html.
Просто в for можна. Але напр. стаття має заголовок, короткий опис, і якусь статистику, а користувач - імя, фото, місце звідки він, та хобі. І це треба було б звести якось до одного вигляду.
Тому придумав розділити всі результати за типами даних в вкладки, як у фб - але не знайшов як((
Тому зробив першим варіантом.


Дякую, що цікавитесь питанням

6

Re: Пошук Django+Haystack+Elasticksearch

1. Точно можу сказати, що індексувати треба не все. Так, індекси пришвидшують пошук, але їх може бути і забагато  - вони пригальмовують вставку, видалення і трохи їдять місце.
2. Вкладки можна зробити через CSS, є навіть готові рішення. В основному суть така, що коли натискаєте на вкладку, то інші ховаються, ця відкривається, вважайте, що просто перемикається атрибут видимості.

7

Re: Пошук Django+Haystack+Elasticksearch

Master_Sergius написав:

2. Вкладки можна зробити через CSS, є навіть готові рішення. В основному суть така, що коли натискаєте на вкладку, то інші ховаються, ця відкривається, вважайте, що просто перемикається атрибут видимості.

Та ні. Звісно, я це знаю. Як розділити самі результати? haystack повертає після пошуку просто я objects_list

8

Re: Пошук Django+Haystack+Elasticksearch

Значить, зробити різні запити на стороні сервера, об'єднати в якусь структуру, типу:

{'users': haystack_object_list1, 'music': haystack_object_list2}

і повертати це уже у вьюшку