gpt4 book ai didi

python - 如何使用数据库查询过滤干草堆结果

转载 作者:太空狗 更新时间:2023-10-29 21:58:07 25 4
gpt4 key购买 nike

我需要在我的模型中进行文本搜索,同时使用数据库查询进行过滤。

例如:

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']}
)

当然,所需的数据库查询可能要复杂得多。

我看到了一些可能的解决方案,但都存在重大缺陷:

  1. 在 django 中创建交集:从 qs 中提取 id 并在 sqs 过滤器中使用它们,反之亦然。问题:性能。我们可以通过使用分页来解决这个问题,并且只对给定的页面和它的前任页面进行交集。在这种情况下,我们失去了总数(

  2. 索引所有 m2m 相关字段。问题:性能、重复功能(我相信数据库会更好地执行此类查询)、注释等数据库功能。

  3. 不要使用 haystack(Go for mysql 或 posgresql 内置的全文搜索。

我想我漏掉了一些明显的东西。案例似乎很常见。有没有常规的解决方案?

最佳答案

在一般情况下,(可能)无法仅使用一个查询来解决您的问题。例如,如果您使用 ElasticSearch 作为搜索后端引擎并使用 MySQL 作为 Django 模型,MySQL 和 ElasticSearch 将无法进行通信以生成单个通用查询。

但是,如果您为 Django 模型和 Haystack 后端引擎使用通用 SQL 数据库,应该有一个解决方法。您必须创建一个自定义 haystack 引擎来解析查询并过滤可用模型。

例如,要修改 SimpleSearchBackend 的行为,您需要做的就是修补 search方法:

class CustomSimpleSearchBackend(haystack.backends.SimpleSearchBackend):

def search(self, query_string, **kwargs):
...
if query_string:
for model in models:
...
if 'users' in kwargs:
qs = qs.filter(users=kwargs['users'])
...

class CustomSimpleEngine(haystack.backends.BaseEngine):
backend = CustomSimpleSearchBackend
query = haystack.backends.simple_backend.SimpleSearchQuery

在 settings.py 中:

HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'myapp.backends.CustomSimpleEngine',
},
}

根据您使用的连接后端,所需的补丁当然会有所不同,但我认为实现起来应该不会太难。

关于python - 如何使用数据库查询过滤干草堆结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38700440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com