2017-09-16 17 views
0

我在Django中有产品数据库。产品名称Eg-(ABCD-E34F)。如果用户搜索'abcd34',我将如何获得ABCD-E34F产品的对象。用django在数据库中搜索字符串。 icontains和iexact查找不符合我的要求

+0

如果你正在寻找一些你必须搜索的东西类似。 'icontains'会很好,如果他们只是搜索'abcd',如果他们想添加额外的,我会打电话给用户错误,因为它不再类似于他们想要的。 –

+1

您可以限制用户按预期进行搜索,也可以猜测用户可能从输入中获得什么,并构建自己的筛选方法... –

+0

然后,您必须编写自己的自定义搜索算法。正如@JonClements所示。 – cezar

回答

0

正如人们所建议的那样,这将需要您考虑构建一些适合您需求的东西。我建议使用模糊匹配,它可以提供与您比较的任何相似性分数。

有一个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) 
+1

只需要注意 - 这会将所有内容从数据库级别移动到应用程序级别,尽管...因此最有可能不会扩展...... OP可能希望应用某种级别的过滤来减少应用程序从中检索的选项DB首先...(在这一点上 - 他们可能会找到合适的解决方案......) –

+1

是的,但是没有办法与ORM模糊匹配吗?如果'icontains'不能削减它,你必须接受性能问题。 –

+1

不是ORM原生的 - 但取决于数据库后端 - 它可能有一个FT索引,它可以使用自定义提取器...甚至我在OPs示例中的第一个想法是将它分成两个块,其长度超过4然后尝试'model.objects.filter(name__icontains = first_half).filter(name__icontains = second_half)'或者其他东西......但是谁知道,却不知道什么是合理的输入以及哪些选项可用/实用的后端明智...... –

相关问题