Col*_*een 13 django django-models django-queryset
有没有办法在django queryset过滤器中使用模糊匹配?
我正在寻找Object.objects.filter(fuzzymatch(namevariable)__ gt = .9)的内容.
或者有没有办法在django查询中使用lambda函数或类似的东西,如果是这样,它会影响性能时间多少(假设我在数据库中有一组稳定的~6000个对象要匹配)
(意识到我应该把我的评论放在这个问题中)
我需要比包含更强大的东西,类似于difflib的东西.我基本上试图绕过做一个Object.objects.all(),然后是模糊匹配的列表理解.
(虽然我不一定确定这样做比尝试根据函数进行过滤要慢得多,所以如果你有想法我很乐意听)
另外,即使它不是我想要的,我也会接受某种标记化的反向包含,比如Object.objects.filter(['Virginia','Tech'] __ in = Object.name),像"弗吉尼亚技术学院"将被退回.虽然不区分大小写,但最好是.
小智 11
当您使用ORM时,要理解的是您所做的每件事都会转换为SQL命令,而重要的是基础数据库上的基础查询的性能.例证:
SELECT COUNT (*) ...
Run Code Online (Sandbox Code Playgroud)
那快吗?取决于你的数据库是否存储任何记录来提供这些信息--MySQL/MyISAM,MySQL/InnoDB没有.在英语中 - 这是在MYISAM中的一个查找,在InnoDB中是n.
接下来的事情 - 为了在SQL中有效地进行精确匹配查找,您必须在创建表时告诉它 - 您不能仅仅期望它能够理解.为此,SQL具有INDEX语句 - 在django中,用于db_index=True模型的字段选项.请记住,这会对写入产生额外的性能影响(创建索引),显然需要额外的存储空间(对于数据结构),因此您无法"完成INDEX所有事情".此外,我认为它不会对模糊匹配有所帮助 - 但无论如何它值得注意.
下一个考虑因素 - 我们如何在SQL中进行模糊匹配?显然LIKE,CONTAINS允许在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)
Run Code Online (Sandbox Code Playgroud)
您将向数据库服务器发出两个查询.换句话说,ORM并不总是缓存结果 - 因此您可能只想.all()在内存中进行搜索.阅读有关缓存和查询集的内容.
在最后一页上,您还将看到Q对象 - 对于更复杂的查询非常有用.
那么总结一下:
最后,我首先让你的模糊匹配工作,然后测量,然后调整,然后测量,直到你找出如何提高性能.其中99%我学会了这样做:)
以 postgres 作为数据库,您可以使用 TrigramSimilarity 进行模糊搜索并按不同的权重对结果进行排名。这是文档的链接:
https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/search/#trigram-similarity
全文搜索可以参考https://czep.net/17/full-text-search.html
| 归档时间: |
|
| 查看次数: |
7580 次 |
| 最近记录: |