avo9
Сен. 26, 2014 22:27:07
Задача: Полнотекстовый поиск по нескольким полям модели, в том числе динамическим. Для примера, есть таблица Контакт с несколькими известными полями (телефон, адрес и тд.), плюс пользователь может задавать свои (например профессия), соответственно можно искать по наличию такого поля, и по его значению. Я планировал впихнуть эти поля в одно текстовое, в виде json'а. Вот теперь вопрос, какой поиск выбрать?
Sphinx умеет индексировать json атрибуты, но с реализацией на питоне проблемы: django-sphinx заброшен, в spinxit нет поддержки json-атрибутов (разве что форкать и допиливать), django-sphinxql в альфе.
Haystack + Whoosh привлекает тем что все на Питоне. Но я не нашёл как там искать по json'у.
Haystack + Elasticsearch вообще круто - и json и faceting по нему, но это здоровый java-монстр, или по крайней мере у меня есть такое предубеждение.
Подскажите пожалуйста, что в даном случае выбрать? Или какие есть ещё варианты? Ну или может мне БД по другому реализовать?
avo9
Окт. 3, 2014 10:20:06
Ну Solr от Elasticsearch не сильно отличается, оба на Lucene.
avo9
Окт. 3, 2014 12:37:32
Дело в том что у меня база - 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.