2017-09-16 39 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)'或者其他東西......但是誰知道,卻不知道什麼是合理的輸入以及哪些選項可用/實用的後端明智...... –

相關問題