Я ломал голову над этим, поэтому я наконец решил поставить его на Stackoverflow, надеясь, что кто-нибудь сможет мне помочь с этим.
Позвольте мне набросать проблему:
- Самое основное использование функции автозаполнения - это запрос базы данных при каждом нажатии клавиши.
Преимущество этого метода в том, что вы всегда получаете самые последние результаты.
Недостатки в том, что он может быть медленным, и, в принципе, это слишком сложно - обращаться к вашей базе данных при каждом нажатии клавиши. Предположим, что вы хотите автоматически получить таблицу стран, в результате поиска чего-то вроде «америка» будет сгенерировано 7 запросов SELECT в базе данных!
Этот метод для этого не вариант.
- Второй вариант (тот, который я сейчас использую) - это собрать все возможные результаты и сохранить их в виде плоского файла в формате JSON.
Таким образом, в основном то, что у вас будет, это один файл, например country.json, который содержит все страны. Вместо того, чтобы обращаться к базе данных, я просто указываю на файл json для стран, и каждое нажатие клавиши будет просто искать в загруженном файле json.
Этот метод быстрый и использует базу данных. В примере стран это было бы хорошим решением, поскольку контент не очень динамичен и не содержит такого большого количества данных, поэтому плоский файл json будет довольно маленьким, поэтому он будет загружаться быстро.
Но проблема возникает, когда файл json содержит динамические данные и имеет большой набор данных.
Что делать, если вы хотите создать автоматический поиск, содержащий все фильмы и актеров?
Поместить все результаты в один файл json было бы нелепо, поскольку файл, вероятно, был бы слишком большим для загрузки.
Давайте возьмем IMDB (www.imdb.com) в качестве примера. У них есть функция автозаполнения на их сайте. Поиск по названию фильма или актеру молниеносен, и он ищет в сотнях тысяч записей. Углубившись в их метод, я замечаю следующее:
Если вы используете окно отладки Google Chrome (или Filezilla Firefox Firebug):
Посмотрите на вкладке сети для скриптов. Когда вы набираете, например, «звездные войны», вы замечаете, что при вводе каждой буквы загружается отдельный файл json.
сначала это s.json , затем st.json , sta.json и т. д.
Он останавливается на star_w.json
Очевидно, он всегда останавливается на 6-й букве.
Каждый загружаемый файл json содержит 8 результатов, соответствующих буквам. Кажется, есть 36 папок, соответствующих каждой букве алфавита, включая цифры.
Например, ссылка для star_w.json равна http://sg.media -imdb.com / предлагает / s / star_w.json
Мой вопрос: как бы вы построили подобную интеллектуальную систему? У них есть все возможные комбинации из 6 букв в виде файла JSON? Как бы вы сгенерировали файлы?
Также обратите внимание, что он не только смотрит на начало заголовка, чтобы сделать совпадение.
Поэтому, если вы будете искать «войны», вы также найдете «звездные войны» внутри результатов поиска.
Буду признателен за любую помощь в создании подобной системы.
Я думаю, что система очень аккуратная и быстрая, и ее можно использовать для многих целей!
EDIT
Хорошо, все получилось.
Мое решение - это сочетание запросов к базе данных и кэширования результатов в плоских файлах json.
В основном, когда пользователь печатает, например, «звездные войны», при каждом нажатии клавиши я сначала проверяю, есть ли файл json для строки поиска. Если он существует, я просто покажу содержимое файла json. Если файл не существует или если файл старше определенного установленного вами временного ограничения (например, старше 12 часов), вы запрашиваете базу данных и выводите вывод в формате json.
В то же время вы записываете вывод в файл JSON. В следующий раз, когда вы выполните поиск, он будет просто получать содержимое из плоских файлов, а не из БД (пока, конечно, TTL не будет достигнут).Я ограничил длину букв до 6 букв, поэтому, если строка поиска превышает 6 букв, ничего не происходит, вы просто продолжаете просматривать результаты поиска последних найденных результатов, в примере «звездных войн», который будет star_w
С помощью этого метода коллекция кэшированных результатов JSON автоматически заполняется на основе пользовательского ввода.Вы также можете написать скрипт, который зацикливает вашу таблицу и генерирует файлы json ...
Я знаю, что это не идеальное решение, но, по крайней мере, вы можете взять некоторую нагрузку на БД, кэшируя результаты в плоских файлах..