我在Django中有产品数据库。产品名称Eg-(ABCD-E34F)。如果用户搜索'abcd34',我将如何获得ABCD-E34F产品的对象。用django在数据库中搜索字符串。 icontains和iexact查找不符合我的要求
回答
正如人们所建议的那样,这将需要您考虑构建一些适合您需求的东西。我建议使用模糊匹配,它可以提供与您比较的任何相似性分数。
有一个python包显示了一些很好的例子&可能适合您的要求; https://pypi.python.org/pypi/fuzzywuzzy
>>> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
>>> process.extract("new york jets", choices, limit=2)
[('New York Jets', 100), ('New York Giants', 78)]
>>> process.extractOne("cowboys", choices)
("Dallas Cowboys", 90)
>>> process.extractOne("System of a down - Hypnotize - Heroin", songs)
('/music/library/good/System of a Down/2005 - Hypnotize/01 - Attack.mp3', 86)
>>> process.extractOne("System of a down - Hypnotize - Heroin", songs, scorer=fuzz.token_sort_ratio)
("/music/library/good/System of a Down/2005 - Hypnotize/10 - She's Like Heroin.mp3", 61)
只需要注意 - 这会将所有内容从数据库级别移动到应用程序级别,尽管...因此最有可能不会扩展...... OP可能希望应用某种级别的过滤来减少应用程序从中检索的选项DB首先...(在这一点上 - 他们可能会找到合适的解决方案......) –
是的,但是没有办法与ORM模糊匹配吗?如果'icontains'不能削减它,你必须接受性能问题。 –
不是ORM原生的 - 但取决于数据库后端 - 它可能有一个FT索引,它可以使用自定义提取器...甚至我在OPs示例中的第一个想法是将它分成两个块,其长度超过4然后尝试'model.objects.filter(name__icontains = first_half).filter(name__icontains = second_half)'或者其他东西......但是谁知道,却不知道什么是合理的输入以及哪些选项可用/实用的后端明智...... –
- 1. Django查找类型(“iexact”,“icontains”,“month”等)不能在Django nonrel中使用(使用dbindexer)
- 2. 在数据库中搜索字符串
- 3. 在sqlite数据库中搜索字符串的任何组合
- 4. 在数据库列中查找字符串django查询
- 5. 搜索字符串数据库
- 6. 如何在数据库中查找只有一个字符与搜索字符串不同的记录?
- 7. 如何在TFS代码中查找搜索字符串搜索
- 8. django在字符串中搜索字符串
- 9. 基于文本框和字符串在数据库中搜索的查询
- 10. 搜索字符串集合
- 11. 数据包中的字符串搜索
- 12. 与__in查找Django的icontains
- 13. 搜索来查找字符串
- 14. 使用oci_bind_by_name在Oracle数据库中搜索字符串
- 15. 在MySQL数据库中搜索输入字符串中的值
- 16. 在数据库中搜索字符串中的单词
- 17. MATLAB:如何查找数字和字符串混合的数据?
- 18. 查询搜索数据库的文本字符串
- 19. 在MySQL数据库中使用普通字符串查找utf8字符串
- 20. sed命令来搜索字符串和搜索的字符串
- 21. 搜索数据库字符串包含字符
- 22. 搜索字符串中的字符串
- 23. 在完整的MS Access数据库中搜索字符串
- 24. 在Mysql数据库中搜索字符串的速度更快
- 25. 如何在特定的字符串中搜索MySQL数据库
- 26. 查找具有特定要求的字符串的索引?
- 27. 在数据库中搜索用户查询字符串的地址
- 28. PHP:关键字搜索:在字符串中查找子字符串
- 29. 搜索dll集合中的字符串
- 30. PHP:搜索字符串中的巧合
如果你正在寻找一些你必须搜索的东西类似。 'icontains'会很好,如果他们只是搜索'abcd',如果他们想添加额外的,我会打电话给用户错误,因为它不再类似于他们想要的。 –
您可以限制用户按预期进行搜索,也可以猜测用户可能从输入中获得什么,并构建自己的筛选方法... –
然后,您必须编写自己的自定义搜索算法。正如@JonClements所示。 – cezar