Поиск XML-каналов по ключевым словам - PullRequest
1 голос
/ 24 августа 2010

Все,

Я создаю сайт, который будет собирать новости из 35 различных RSS-каналов и сохранять их в массиве.Я использую цикл foreach () для поиска в заголовке и описании, чтобы увидеть, содержит ли оно одно из примерно 40 ключевых слов, используя substr () для каждой статьи.Если поиск будет успешным, эта статья будет сохранена в БД и в конечном итоге появится на сайте.

Сценарий выполняется каждые 30 минут.Проблема в том, что это занимает 1-3 минуты в зависимости от того, сколько историй возвращено.Не «ужасно», но в шард-хостинге env я вижу, что это вызывает множество проблем, особенно с ростом сайта и добавлением новых каналов / ключевых слов.ключевых слов, чтобы я мог ускорить «индексацию»?

Спасибо !!

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

Вы можете использовать XPath для прямого поиска в XML ... Что-то вроде:

$dom = new DomDocument();
$dom->loadXml($feedXml);
$xpath = new DomXpath($dom);

$query = '//item[contains(title, "foo")] | //item[contains(description, "foo")]';
$matchingNodes = $xpath->query($query);

Тогда $matchingNodes будет DomNodeList всех соответствующих item узлов. Затем вы можете сохранить их в базе данных ...

Итак, чтобы приспособить это к вашему примеру с реальным миром, вы можете либо создать запрос, чтобы выполнить весь поиск за один раз:

$query = array();
foreach($keywords as $keyword) {
    $query[] = '//item[contains(title, "'.$keyword.'")]';
    $query[] = '//item[contains(description, "'.$keyword.'")]';
}
$query = implode('|', $query);

Или просто повторно запросить для каждого ключевого слова ... Лично я бы построил один гигантский запрос, так как тогда все сопоставления выполняются в скомпилированном C-коде (и, следовательно, должны быть более эффективными, чем циклическое выполнение в php-ленте и агрегирование результатов нет) ...

2 голосов
/ 24 августа 2010

35-40 RSS-каналы - это множество запросов для одного скрипта для обработки и анализа всего сразу. Ваше узкое место - это, скорее всего, запросы, а не разбор. Вы должны разделить проблемы. Есть один сценарий, который запрашивает RSS-канал по одному каждую минуту или около того, и сохранять результаты локально. Затем другой скрипт должен анализировать и сохранять / удалять временные результаты каждые 15-30 минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...