1

У меня есть требование сравнить имя продукта, которое пользователь будет искать с доступными продуктами. У меня есть имя продуктов, хранящихся в MySQL db. Я собираю все имена и получаю их на уровне приложения (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? И еще одна вещь, вернув все названия продуктов на уровень приложений (java) из MySQL, это правильный способ сделать это? или я могу сделать это на уровне MySQL? (PS: я не хочу использовать подобный запрос на стороне MySQL, поскольку он будет очень медленным)

+1

hava Вы изучили Строку javadoc? Я вижу это ('String.contains()') [http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#contains (java.lang.CharSequence)] довольно handy – sanbhat

+0

@sanbhat: String.contains() не даст мне рейтинг результатов, которые я ищу. – Arry

+0

Большое спасибо @EnginePai. Кажется, Люцен подходит для моей потребности. – Arry

ответ

1

Дай вам несколько советов по разработке функции поиска в проекте:

  • Использование Lucene, просто использовать API или загрузить исходный код и использовать алгоритм пользовательского вратаря.
  • Разработка алгоритма term weighting или string similarity в вашем собственном приложении, это повысит точность поиска. (Вам нужно искать две концепции или взглянуть на книгу Information Retrieval, это очень поможет вам.)
  • Используйте mysql SELECT ... FROM ... WHERE field LIKE '%keyword%' нечеткий поиск (не забудьте создать индекс в первую очередь) и примените вышеуказанные term weighting или string similarity алгоритм для ранжирования результата запроса.
0

Слова ввода пользователя разделены пробелами, поэтому разделите их на srtrings, а затем используйте string.contains(), самая длинная строка, которая будет соответствовать первой, что даст вам рейтинг.

0

Я решил то же самое я использовал синтаксическое дерево (Trie) и хранить все комбинации строк, которые я имел в синтаксическом дереве , то вы можете искать для входа пользователя в синтаксическом дереве

Примечания: хранить все сочетание в trie не является хорошим подходом. но сохранение всех комбинаций в trie поможет в поиске так, как вы хотите, иначе это будет префиксный поиск.

0

его не правильный путь, поставить запрос для вашего поиска

для например:

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

всегда получите записи только которые необходимы вместо всех записей.

Смежные вопросы