Сравнение строк в 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 поможет в поиске так, как вы хотите, иначе это будет поиск по префиксу.