2010-01-26 80 views
0

我有以下餐廳和評論模型。我在Restaurant模型的某些字段上進行全文搜索,如下面的RestaurantIndexer類所示。我該如何做一個全文搜索,包括註釋(即搜索返回Restaurant實例,查詢包含在RestaurantIndexer中或評論實例的註釋字段中定義的一個或一些字段中)?定義與Djapian相結合的兩個表的索引

*********餐廳模型***************

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') 
+0

你對索引搜索有什麼用? – 2010-01-26 11:35:35

+0

xapian,顯然。 – stefanw 2010-01-26 11:57:47

回答

1

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

請注意,這只是連接上的所有相關注釋的所有註釋字段具有空間的物體。儘管如此,應該做索引。

+0

太好了,謝謝! – jul 2010-01-26 21:15:37

+0

謝謝你,斯蒂芬,再次蟒蛇救了我一天! – 2010-11-15 18:08:24