Определение индекса, объединяющего две таблицы с помощью Djapian - PullRequest
0 голосов
/ 26 января 2010

У меня есть следующие модели Ресторан и Комментарий. Я выполняю полнотекстовый поиск по некоторым полям модели Restaurant, как показано ниже в классе RestaurantIndexer. Как выполнить полнотекстовый поиск, включая комментарии (т. Е. Поиск, возвращающий экземпляры Restaurant с запросом, содержащимся в одном или нескольких полях, определенных в RestaurantIndexer или в поле комментариев экземпляров Comment)?

********* модель ресторана ***************

class Restaurant(models.Model):

    name = models.CharField(max_length=100)
    country=models.ForeignKey(Country)
    city=models.ForeignKey(City)
    street=models.CharField(max_length=100)
    street_number=models.PositiveSmallIntegerField()
    postal_code=models.PositiveIntegerField(blank=True,null=True)
    category=models.ManyToManyField(Category, blank=True,ull=True)
    slug = models.SlugField(unique=True)

********* Комментарий модели ***************

class Comment(models.Model):

    user = models.ForeignKey(User)
    restaurant = models.ForeignKey(Restaurant)
    submit_date = models.DateTimeField(blank = True, null = False)
    comment = models.TextField()

********* Ресторанный указатель ***************

class RestaurantIndexer(Indexer):
    tags = [
        ('name','name'),
        ('city','city'),
        ('country','country'),
        ('category', 'category'),
        ('tag','tag')
    ]

#how can I add Comment.comment?

space.add_index(Restaurant, RestaurantIndexer, attach_as='indexer') 

1 Ответ

1 голос
/ 26 января 2010

Djapian поддерживает точечную нотацию для разрешения полей и частей пути тегов в объявлениях индексатора. Он также поддерживает вызовы и использует их результат.

Однако вам это не нужно, поскольку вам просто нужно получить все комментарии для ресторана, вы можете просто сделать:

class RestaurantIndexer(Indexer):
    tags = [
        ('name','name'),
        ('city','city'),
        ('country','country.name'),
        ('category', 'category'),
        ('tag','tag'),
        ('comments', 'all_comments_text'),
    ]

class Restaurant(models.Model):
    # ... fields

    @property # could also be a method, since callables work
    def all_comments_text(self):
        return " ".join(map(lambda x: x.comment, self.comment_set.all()))

Обратите внимание, что это просто объединяет все поля комментариев во всех связанных объектах комментариев с пробелом. Следует сделать для индексации, хотя.

...