定义一个将两个表与Djapian组合在一起的索引

时间:2010-01-26 09:20:26

标签: django indexing xapian

我有以下餐厅和评论模型。我正在对餐厅模型的某些字段进行全文搜索,如下面的RestaurantIndexer类所示。如何进行全文搜索,包括评论(即,在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 个答案:

答案 0 :(得分:1)

Djapian支持点表示法来解析Indexer声明中的字段和标记的路径部分。它还支持callables并使用它们的结果。

但是,您不需要任何其他内容,因为您只需要获取餐厅的所有评论,您可以这样做:

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()))

请注意,这只是将所有相关注释对象上的所有注释字段与空格连接起来。但是,应该做索引。