Pjeroo
@Pjeroo
Веб-разработчик

Как лучше организовать поиск ключевых слов?

Добрый день. Имеется задача выполнения импорта товаров на сайт из xml. Собственно сама выгрузка сделана и все работает, но меня волнует факт, что при поиске ключевых слов получается кубическая сложность (три вложенных цикла), а значит по мере увеличения как базы данных, так и файлов xml будет увеличиваться длительность выгрузки, причем значительно.

Алгоритм выгрузки сейчас таков:
Делаем выборку из бд из таблицы "категории".
Для каждого "правильного" элемента из xml мы берем поле "категория", далее в каждой категории, которая находится в базе данных существует поле "ключевые слова", которые, в свою очередь, разбиваются на элементы. Сравниваем элементы поля "ключевые слова" из бд с полем "категория" из xml. Если нашли - ставим в соответствие нашей выгрузке категорию в бд, иначе отправляем в категорию "Прочее". Приведу упрощенный код:
$validated; // "правильные" элементы из xml
$categories = getCategoriesFromDb; // выборка из таблицы категории 
foreach ($validated as $item) { 
foreach($categories as $category) {
$splitted = explode(',',$category['keywords']) {
foreach($splitted as $element)
// проверка нахождения элемента в поле категория в выгрузке xml
}
}
}


Меня интересует есть ли какой-нибудь более правильный и умный алгоритм для поиска ключевых слов или же в данном случае подходит только брутфорс? Если брутфорс, то есть ли смысл копать в сторону псевдомногопоточности или же многопроцессовости?
  • Вопрос задан
  • 2447 просмотров
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg
Любые ответы на любые вопросы
Правильный алгоритм поиска ключей в строке - Ахо-Корасик. Он должен быть реализован в вашем парсере xml.
Если вы работаете с XML не с помощью XPATH, пора начать это делать.
Ответ написан
Комментировать
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel
Как совершенно верно указал @Армянское Радио, Ахо-Корасик - отличный алгоритм и уже в коробке. Алгоритм однако ищет ВСЕ вхождения ВСЕХ подстрок, что может быть избыточным для задачи. Возможно эффективней построить из ключевых слов какую нибудь разновидность BinarySearchTree, либо просто отсортировать их и воспользоваться какой нибудь разновидностью BinarySearch.(Я не эксперт PHP и не знаю, что у Вас в коробке)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы