2013-11-25 21 views
1

我有要求比較用戶將搜索的產品名稱與可用產品。我有存儲在MySQL數據庫中的產品名稱。我正在收集所有名稱,並在我的Java服務啓動時將其獲取到應用程序級別(Java)。Java中的字符串比較,我應該使用哪種算法?

現在我的字符串比較的情況是這樣的:

Available product names: 
1) Samsung galaxy s2 
2) Samsung galaxy s3 
3) Samsung galaxy s4 

User input1: galaxy s3 - Then in this scenario my 2nd result should come first as it has 2 matching keywords 'galaxy' and 's3', where other 2 has only 1 matching keyword 'galaxy'. 

User input2: s3 - Then here only 2nd result should come, because the other 2 has no matching key word. 

User input3: samsung - Then here all three results should come. 

任何人都可以請建議的算法將是適宜的在Java中?另外還有一件事,把所有產品名稱都帶到MySQL的應用程序級別(java)是正確的方法嗎?或者我也可以在MySQL級別執行它? (PS:我不想在MySQL端使用類似的查詢,因爲它會很慢)

+1

hava您探索過的字符串javadoc?我看到('String.contains()')[http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#contains(java.lang.CharSequence)]很漂亮得心應手 – sanbhat

+0

@sanbhat:String.contains()不會給我我正在尋找的結果的排名。 – Arry

+0

非常感謝@EnginePai。 Lucene似乎適合我的需要。 – Arry

回答

1

給你一些提示,以開發搜索功能在您的項目:

  • 使用Lucene,只需使用API​​或下載源代碼,並使用自定義算法得分。
  • 在您自己的應用程序中開發term weightingstring similarity算法,它會提高您的搜索準確性。 (你必須搜索一下這兩個概念,或者看看Information Retrieval這本書,這對你真的很有幫助。)
  • 使用mysql SELECT ... FROM ... WHERE field LIKE '%keyword%'模糊搜索(記得先創建索引),並應用上面的term weighting或者string similarity算法來對查詢結果進行排名。
0

用戶輸入中的單詞用空格鍵分隔,因此將它們分成srtrings,然後使用string.contains(),最長的字符串首先匹配,那會給你排名。

0

我解決了同樣的事情 我使用線索(Trie) 和存儲的字符串,我不得不在特里 的所有組合,那麼您可以在特里搜索用戶輸入

注:存儲所有結合在一起並不是一個好方法。但是在trie中存儲所有組合將有助於以您想要的方式進行搜索,否則它將成爲前綴搜索。

0

它不是一個正確的方法,把查詢您的搜索

爲如:

SELECT productname FROM product WHERE productname='%samsung%'; 

總是隻能得到所需要的,而不是所有記錄的記錄。