Найти - Пользователи
Полная версия: Какой поиск выбрать?
Начало » Django » Какой поиск выбрать?
1
avo9
Задача: Полнотекстовый поиск по нескольким полям модели, в том числе динамическим. Для примера, есть таблица Контакт с несколькими известными полями (телефон, адрес и тд.), плюс пользователь может задавать свои (например профессия), соответственно можно искать по наличию такого поля, и по его значению. Я планировал впихнуть эти поля в одно текстовое, в виде json'а. Вот теперь вопрос, какой поиск выбрать?
Sphinx умеет индексировать json атрибуты, но с реализацией на питоне проблемы: django-sphinx заброшен, в spinxit нет поддержки json-атрибутов (разве что форкать и допиливать), django-sphinxql в альфе.
Haystack + Whoosh привлекает тем что все на Питоне. Но я не нашёл как там искать по json'у.
Haystack + Elasticsearch вообще круто - и json и faceting по нему, но это здоровый java-монстр, или по крайней мере у меня есть такое предубеждение.
Подскажите пожалуйста, что в даном случае выбрать? Или какие есть ещё варианты? Ну или может мне БД по другому реализовать?
Oik741
Может sorl?
avo9
Ну Solr от Elasticsearch не сильно отличается, оба на Lucene.
bismigalis
avo9
Ну или может мне БД по другому реализовать?
EAV?
avo9
Дело в том что у меня база - MySQL, соответственно по перформансу вряд ли это лучшее решение. Плюс я еще использую Django REST Framework, поэтому json-поле подошло бы лучше, кроме того у меня не так много операций с этими атрибутами кроме поиска, так что поддержка ORM не так уж и нужа.
Все же сейчас пробую самый простой вариант EAV - m2m связь, приблизительно так:
class Property(models.Model):
    owner = models.ForeignKey(User)
    name = models.CharField(max_length=100)
class Contact(models.Model):
    owner = models.ForeignKey(User)
    name = models.CharField(max_length=100)
    groups = models.ManyToManyField(Group)
    properties = models.ManyToManyField(Property, through='ContactProperty')
class ContactProperty(models.Model):
    owner = models.ForeignKey(User)
    contact = models.ForeignKey(Contact)
    property = models.ForeignKey(Property)
    value = models.CharField(max_length=255)

Но возможно вернусь к допиливанию spinxit.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB