Алгоритм поиска всех возможных результатов с помощью текстового поиска - PullRequest
1 голос
/ 23 ноября 2010

В настоящее время я делаю веб-сканер для сканирования всех возможных персонажей на сайте видеоигр (Final Fantasy XIV Lodestone).

Мой интерфейс для этого - поиск по сайту. http://lodestone.finalfantasyxiv.com/rc/search/characterForm

Если поиск находит более 1000 символов, он возвращает только первые 1000. Текстовый поиск тоже не понимает *,? или _.

Если при поиске буквы a я получаю все символы, в именах которых есть a, а не все символы, начинающиеся с буквы.

Полагаю, я мог бы выполнить поиск всех комбинаций символов aa, ab, ba и т. Д. Но это не гарантирует мне:

  • Я никогда не получу более 1000 результатов
  • Кажется, это не очень эффективно, так как многие символы появляются несколько раз и должны быть отфильтрованы.

Я ищу алгоритм построения поискового текста.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2010

Считается ли практической проблемой, вы спрашивали у Square Enix какой-то доступ к API или дамп базы данных?Они могут предпочесть, чтобы вы просмотрели их результаты поиска.

С чисто теоретической точки зрения не ясно, что любая стратегия поиска преуспеет в поиске всех результатов.Предположим, что есть персонаж по имени «Ар», как бы вы его нашли?Если вы ищете «ar», результаты доходят только до Ak—.Если вы ищете «а» или «г», ситуация еще хуже.Любой другой поиск не может найти этот символ.(На практике вы можете найти «Ар», угадав его мир и / или основной навык, но в теории в этом мире может быть столько персонажей с этим навыком, что это останется неэффективным.)

0 голосов
/ 23 ноября 2010

Главный вопрос здесь - что вы планируете делать со всеми этими персонажами?Какова цель вашей программы?Оставляя это в стороне, вы можете искать одну букву и фильтровать как по основному навыку, так и по миру (используя двойной цикл).Крайне маловероятно, что у вас когда-либо будет более 1000 попаданий для любой согласной.Если вы хотите найти имя, начинающееся с гласного, то используйте bigraph vowel-other_letter в цикле, который перебирает other_letter от A до Z.

Дополнительная оптимизация - попытаться угадать, с какой страницы начнется список с нужной буквой,Если у вас есть общее количество страниц (TNOP), тогда ваш список начнется где-то рядом со страницей TNOP * LETTER / 27, где LETTER - это порядок буквы в алфавите.

...