Мне нужно быстро найти слова для веб-приложения, которое я пишу в Django. Я думал о том, чтобы поместить каждого символа слова в собственное целое поле, индексированное положением.Django DB design to glob words быстро
class Word(models.Model):
word = models.CharField(max_length=5)
length = models.IntegerField()
c0 = models.IntegerField(blank=True, null=True)
c1 = models.IntegerField(blank=True, null=True)
c2 = models.IntegerField(blank=True, null=True)
c3 = models.IntegerField(blank=True, null=True)
c4 = models.IntegerField(blank=True, null=True)
mapping = [c0, c1, c2, c3, c4,]
def save(self):
self.length = len(self.word)
for (idx, char) in enumerate(self.word):
self.mapping[idx] = ord(char)
models.Model.save(self)
Тогда я мог бы делать запросы, как Word.objects.filter(length=4, mapping[2]=ord('A'))
найти все слова длины четыре, которые имеют A в третьем положении.
Я не совсем уверен в дизайне и некоторых механиках, поэтому я думал, что попрошу предложения здесь до того, как я поеду и попытаюсь его реализовать. Я не совсем уверен в синтаксисе для создания запросов.
Итак, я предполагаю, что вопросы будут
- Есть ли у вас какие-либо предложения по дизайну?
- Будет
mapping[2]
работы? - Смогу ли я передать словарь в команду фильтра, чтобы у меня могло быть переменное количество аргументов ключевого слова?
Спасибо!
Можете ли вы рассказать подробнее, сколько слов это и почему вам нужно быстро найти их и как быстро? –
Я оптимизирую программу удовлетворения ограничений обратного отслеживания для генерации кроссвордов. Сейчас у меня около 42 000 уникальных слов и фраз. Они лишены всего, кроме буквенных символов в верхнем регистре и хранятся во всех кепках.Я запускал cProfile по моему алгоритму, и сейчас я трачу большую часть времени на получение кандидатов из словаря (в настоящее время я использую fnmatch в списке слов - что-то быстрое и грязное, чтобы увидеть, правильно ли я понял, до того, как начал оптимизацию) , Чем быстрее я это сделаю, тем лучше. –