Имам изискването да сравня продуктаиме, което потребителят ще търси с наличните продукти. Имам името на продуктите, съхранени в MySQL db. Събирам всички имена и ги връщам на ниво приложение (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 за отговор № 1Ще ви дам няколко съвета за разработване на функция за търсене в проекта ви:
- употреба Lucene, просто използвайте API или изтеглете изходния код и използвайте алгоритъма за персонализиран резултат.
- Разработване
term weighting
илиstring similarity
алгоритъм в собственото ви приложение, той ще подобри точността на търсенето. (Трябва да потърсите за двете концепции или да погледнете книгата Извличане на информация, това наистина ви помага много.) - Използвайте mysql
SELECT ... FROM ... WHERE field LIKE "%keyword%"
fuzzy search (не забравяйте първо да създадете индекса) и приложете горнотоterm weighting
илиstring similarity
алгоритъм за класиране на резултата от заявката.
0 за отговор № 2
Реших едно и също нещо аз използвах трие (Trie) и съхранява цялата комбинация от низове, които имах в трие след това можете да търсите потребителски вход в trie
Забележка: съхраняването на цялата комбинация не е добър подход. но запазването на всички комбинации в трие ще помогне в търсенето по начина, по който искате, в противен случай ще бъде префикс търсене.
0 за отговор № 3
Не е правилен начин, поставете заявка за търсенето си
например:
SELECT productname FROM product WHERE productname="%samsung%";
винаги получавайте само записи, които са необходими вместо всички записи.
0 за отговор № 4
Думите в потребителския вход са разделени от интервалите, така че ги разделете на srtrings, и след това използвайте string.contains (), най-дългият низ, който да се съпостави първо, който ще ви даде класиране.