Сравнение строк в Java, какой алгоритм мне использовать?

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

4 ответа

Решение

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

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

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

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

например:

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

всегда получать только те записи, которые нужны, а не все записи.

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

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

Другие вопросы по тегам