gpt4 book ai didi

django - 在Django queryset过滤器中使用模糊匹配

转载 作者:行者123 更新时间:2023-12-03 23:42:06 25 4
gpt4 key购买 nike

有没有办法在Django queryset过滤器中使用模糊匹配?

我正在寻找类似于Object.objects.filter(fuzzymatch(namevariable)__ gt = .9)的东西

还是有办法使用lambda函数,或者在django查询中使用类似方法,如果是的话,它将对性能时间有多大影响(假设我要匹配的数据库中有稳定的〜6000个对象集)

(意识到我可能应该将我的评论放在问题中)

我需要比difflib更强大的东西。我基本上是想避开做一个Object.objects.all()然后是模糊理解的列表理解。

(尽管我不一定要确定这样做会比尝试基于函数进行过滤要慢得多,所以如果您对此有意见,我很乐意倾听)

而且,即使这不是我想要的,我也会对某些标记化的相反容器持开放态度,例如Object.objects.filter(['Virginia','Tech'] __ in = Object.name),例如“弗吉尼亚技术学院”。虽然不区分大小写,但最好。

最佳答案

使用ORM时,要理解的是,您所做的一切都会转换为SQL命令,并且重要的是基础数据库上基础查询的性能。例子:

SELECT COUNT (*) ...


快吗取决于数据库是否存储任何记录以提供该信息- MySQL/MyISAM doesMySQL/InnoDB does not。用英语-这是MYISAM中的一个查询,而InnoDB中是n的查询。

接下来的事情-为了在SQL中高效地进行精确匹配查找,您必须在创建表时告诉它-您不能仅仅期望它能够理解。为此,SQL具有 INDEX语句-在django中,在模型的字段选项中使用 db_index=True。请记住,这会增加写入操作(创建索引)的性能,并且显然需要额外的存储空间(用于数据结构),因此您不能“ INDEX所有内容”。另外,我认为这不会对模糊匹配有所帮助-但还是值得一提。

接下来的考虑-我们如何在SQL中进行模糊匹配?很显然, LIKECONTAINS允许在SQL中执行一定数量的搜索和通配符结果。这些是T-SQL链接-为您的数据库服务器翻译:)您可以通过 Model.objects.get(fieldname__contains=value)实现此目的,这将生成 LIKE SQL或类似的SQL。有许多选项可用于不同的查找。

这对您来说可能足够强大,也可能不够强大-我不确定。

现在,有一个大问题:性能。如果您要进行包含搜索,则很有可能SQL服务器将必须命中数据库中的所有行-别相信我,但我敢打赌-即使在建立索引的情况下。对于6000行,这可能不会花那么长时间。再说一次,如果您是按照每个应用程序的连接次数执行此操作,则可能会导致速度降低。

接下来要了解的ORM:如果这样做:

Model.objects.get(fieldname__contains=value)
Model.objects.get(fieldname__contains=value)


您将向数据库服务器发出两个查询。换句话说,ORM并不总是缓存结果-因此您可能只想执行 .all()并在内存中搜索。请阅读有关 caching and querysets的信息。

在最后一页的后面,您还将看到 Q对象-对于更复杂的查询很有用。

因此,总而言之:


SQL包含一些基本的模糊匹配类参数。
这些是否足够取决于您的需求。
它们的执行方式取决于您的SQL Server-绝对可以衡量它。
是否可以将这些结果缓存在内存中取决于扩展的可能性-再次值得评估一下内存的提交情况-是否可以在实例之间共享以及是否经常使缓存无效(如果可以,则不要做到)。


最终,我将从使模糊匹配开始起作用,然后进行测量,然后进行调整,然后进行测量,直到确定如何提高性能。我学会了做到这一点的99%:)

关于django - 在Django queryset过滤器中使用模糊匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9384942/

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