Как кодировать поисковую систему PHP для поиска в нескольких базах данных sqlite - PullRequest
0 голосов
/ 09 декабря 2011

Я планирую закодировать поисковую систему на PHP, которая позволит моей компании искать текст, содержащийся в нескольких проектах, каждый проект содержится в уникальном файле базы данных sqlite.

Поскольку в определенный момент будетболее 100 проектов (более 100 баз данных sqlite), мне было интересно, какой (если таковые имеются) из следующих вариантов будет более разумным выбором программирования:

  1. Во время начальной загрузки страницы, цикл по всем базам данных ичитать весь контент из каждой базы данных, вставляя весь контент, который мы хотим найти, в объект PHP / массив / что угодно.Затем пользователь вводит поисковую фразу, и мы просто осуществляем поиск по объекту PHP?
  2. После того, как пользователь нажимает «поиск», в каждой базе данных производится поиск по одной за раз, чтобы найти интересующий его контент.

Я действительно не знаю, сколько времени потребуется, чтобы сделать тот или иной вариант, или что является лучшей практикой.Большинство файлов базы данных имеют размер <1 МБ. </p>

Большое спасибо!

Ответы [ 4 ]

1 голос
/ 09 декабря 2011

Я не сделал ничего подобного, но в вашем случае я бы, вероятно, создал бы одну базу данных, которая включала бы содержимое других баз данных, если данные достаточно динамичны, тогда эта опция не будет работать, если вы не запустите сценарий и копировать данные с помощью cronjob, как каждую полночь, еженедельно или как угодно. Кроме того, если базы данных похожи - я имею в виду, что они имеют похожую структуру (что будет иметь смысл из-за поиска), тогда я, вероятно, воспользуюсь предложением выше. Трудно сказать, не зная, насколько сложны базы данных.

1 голос
/ 09 декабря 2011

Прежде всего: не забывайте, что если вы не разрабатываете какое-либо графическое приложение, например, в PHP-GTK, загрузки страниц PHP не сохраняют состояния.Это означает, что если вы выбрали вариант 1, вам нужно было бы где-то кэшировать данные (например, другую БД).В любом случае, я бы не стал хранить это в памяти.

Кроме того, это зависит от того, какие индексы вы настроили.100 текстовых поисков могут быть очень быстрыми, если базы данных имеют полнотекстовые индексы.

Таким образом, циклический просмотр файлов является опцией.Из-за необходимости открывать 100 различных файлов SQLite могут возникнуть некоторые накладные расходы.Также вы не должны забывать закрывать каждый файл после того, как закончите с ним, чтобы уменьшить использование памяти.Вам необходимо убедиться, что все SQlite DB правильно проиндексированы.

Другая возможность - создать локальную DB со всеми данными для поиска и дополнительными метаданными, относящимися к тому, в каком файле sqlite можно найти исходные данные, ипоследняя отметка времени они были проверены.Затем при каждом запросе вы можете проверять метки времени последнего изменения файлов sqlite и копировать любые новые данные в модифицированных БД SQlite в вашу локальную БД, обновлять метку времени и выполнять поиск в вашей локальной БД.Производительность в этом случае будет зависеть от того, как часто обновляются файлы SQlite и как должны синхронизироваться все данные, но я считаю, что в вашем случае этого будет достаточно.

0 голосов
/ 09 декабря 2011

Создайте индекс всех баз данных и регулярно обновляйте его. Поскольку это только для чтения, это не должно иметь большого значения.

Простой индекс слов может быть просто

word[ [document,occurrences], [document,occurrences] ... ]

как, слово «foo» появляется в документе 1, 3 раза, в документе 4, 5 раз.

foo[ [1,3] , [4,5] ]

Это не позволит вам выполнять точный поиск по фразе, но это просто и быстро.

0 голосов
/ 09 декабря 2011

Я бы определенно не читал весь контент, а затем выполнял бы поиск по php, что довольно неэффективно. Было бы гораздо эффективнее создавать действительно эффективные запросы, а затем запускать их во всех базах данных после получения запроса пользователя. Если бы вам удалось уведомить пользователя о состоянии ваших поисков, это было бы довольно полезно. то есть укажите, какую БД вы ищете и сколько осталось

...