Django 使用Djapian定义结合两个表的索引
我有以下餐厅和评论模式。我正在对餐馆模型的一些字段进行全文搜索,如RestaurantIndexer类中所示。如何进行包含注释的全文搜索(即搜索返回餐厅实例,查询包含在RestaurantIndex或注释实例的注释字段中定义的一个或一些字段中) *********餐厅模式***************Django 使用Djapian定义结合两个表的索引,django,indexing,xapian,Django,Indexing,Xapian,我有以下餐厅和评论模式。我正在对餐馆模型的一些字段进行全文搜索,如RestaurantIndexer类中所示。如何进行包含注释的全文搜索(即搜索返回餐厅实例,查询包含在RestaurantIndex或注释实例的注释字段中定义的一个或一些字段中) *********餐厅模式*************** class Restaurant(models.Model): name = models.CharField(max_length=100) country=models.Fo
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')
*********注释模型***************
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')
*********餐厅索引器***************
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')
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()))
请注意,这只是将所有相关注释对象上的所有注释字段用空格连接起来。不过,应该为索引做些什么。你用什么做索引搜索?谢谢stefan,python再次为我节省了时间!