Java中的字符串比较,我应该使用哪种算法?

时间:2013-11-25 06:49:26

标签: java mysql algorithm string-comparison knuth-morris-pratt

我需要将用户将搜索的产品名称与可用产品进行比较。我有存储在MySQL数据库中的产品名称。我正在收集所有名称,并在我的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方面使用类似的查询,因为它会非常慢)

4 个答案:

答案 0 :(得分:1)

为您提供一些在项目中开发搜索功能的提示:

  • 使用Lucene,只需使用API​​或下载源代码并使用自定义分数算法。
  • 在您自己的应用程序中开发term weightingstring similarity算法,它将提高您的搜索准确性。 (你必须搜索这两个概念,或者看一下这本书Information Retrieval,这对你有很大帮助。)
  • 使用mysql SELECT ... FROM ... WHERE field LIKE '%keyword%'模糊搜索(请记住先创建索引),并应用上述term weightingstring similarity算法对查询结果进行排名。

答案 1 :(得分:0)

用户输入中的单词由空格键分隔,因此将它们分成srtrings,然后使用string.contains(),最长的字符串首先匹配,这将给你排名。

答案 2 :(得分:0)

我解决了同样的问题 我用过trie(Trie) 并存储了我在trie中的所有字符串组合 然后你可以在trie中搜索用户输入

注意:将所有组合存储在trie中并不是一个好方法。但是将所有组合存储在trie中将有助于搜索你想要的方式,否则它将是前缀搜索。

答案 3 :(得分:0)

这不是一个正确的方法,为您的搜索提出查询

例如:

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

始终只获取所需记录而不是所有记录。