我需要在我的模型中进行文本搜索并同时使用db查询进行过滤。如何使用db查询过滤干草堆结果
例如:
class MyModel(models.Model):
text = models.TextField()
users = models.ManyToMany(User)
class MyModelIndexIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, model_attr='text')
def get_model(self):
return MyModel
所以,我想通过用户和通过全文搜索一些文本过滤所有为MyModel对象。水木清华这样的:
qs = MyModel.objects.filter(users=request.user)
sqs = MyModelIndex.objects.filter(text=request.GET['q'])
intersection = some_magic_function(qs, sqs)
或
intersection = some_other_magic_function(
qs_kwargs={'users': request.user},
sqs_kwargs={'text': request.GET['q']}
)
当然所需的数据库查询可能会更加复杂。
我看到一些可能的解决方案,所有的重大缺陷:在Django
制作路口:从QS提取ID和SQS过滤器或反之亦然使用它们。问题:性能。我们可以通过使用分页来解决它,并且只为给定的页面和它的前辈做交叉。在这种情况下,我们失去总数(
指数所有M2M相关领域的问题:性能,复制功能(我相信DB会做这样的查询好得多),DB的功能,如注释等
不要使用干草堆(去为MySQL或posgresql内置全文搜索。
我相信我错过了一些东西明显案例似乎是相当普遍的。有一个传统的解决方案?
你需要在你的“十字路口”变量中输入什么数据?是否应该包含MyModel以及MyModelIndex对象?或者你只需要一个或另一个?如果你能解释你试图达成的目标可能会有所帮助,那么就没有上下文了。 –
@TitusP:在我的交集我想要查询集或searchresultset。在我的示例中,我想通过全文搜索按用户和文本过滤所有MyModel对象。 – Nik
你使用哪种干草堆引擎? –