在django queryset filter中使用模糊匹配

有没有办法在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,MySQL / InnoDB不支持。 用英语 - 这是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服务器将不得不击中数据库中的所有行 - 不要拿我的话说,但是这将是我的赌注 - 即使在编制索引时也是如此。 对于6000行,这可能不需要那么长时间; 那么再一次,如果你是以每个连接到你的应用程序的方式来做这件事,它可能会造成放缓。

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

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

您将向数据库服务器发出两个查询。 换句话说,ORM并不总是缓存结果 - 所以你可能只想做一个.all()并在内存中搜索。 请阅读缓存和查询集。

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

所以总结一下:

  • SQL包含一些基本的模糊匹配参数。
  • 这些是否足够取决于您的需求。
  • 它们的执行方式取决于你的SQL服务器 - 绝对要测量它
  • 是否可以将这些结果缓存在内存中取决于缩放的可能性 - 再次可能需要衡量内存提交的结果 - 如果可以在实例之间共享以及缓存经常失效(如果是,则不要做它)。
  • 最终,我首先让你的模糊匹配工作,然后测量,然后调整,然后测量,直到你找出如何提高性能。 我学到了99%,完全是这样:)


    如果你需要比包含lookup更强的东西,看看正则表达式查找:https://docs.djangoproject.com/en/1.0/ref/models/querysets/#regex


    以postgres作为数据库,您可以使用TrigramSimilarity进行模糊搜索,并根据不同的权重对结果进行排名。 这里是文档的链接:

    https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/search/#trigram-similarity

    对于全文搜索,你可以参考https://czep.net/17/full-text-search.html

    链接地址: http://www.djcxy.com/p/38661.html

    上一篇: use fuzzy matching in django queryset filter

    下一篇: differentiate null=True, blank=True in django