Функция поиска CMS с PHP и PDO - PullRequest
0 голосов
/ 29 мая 2011

Я бы хотел внедрить новую функцию поиска в airpapr CMS. Airpapr использует PDO для подключения к БД. Должен ли я сам написать функцию поиска с нуля, или есть какие-то хорошие поисковые системы с открытым исходным кодом, которые можно использовать при настройке БД PHP / PDO? Если рекомендуется писать функцию поиска самостоятельно, есть ли хорошие уроки о том, как написать поисковую систему с помощью PHP / PDO? Сама функция поиска просто должна искать в двух разных строках таблицы.

Ответы [ 2 ]

3 голосов
/ 30 мая 2011

Поиск - это больше, чем функция; это сложнее, чем простое сравнение строк + подсчет вхождений подстрок.

Принимая во внимание выделение совпадающих терминов, основание, сопоставление синонимов, влияние стоп-слов и необходимость индекса поиска, отдельного от вашей базы данных контента, поиск является широкой проблемой, которую лучше всего решать с помощью существующей поисковой системы.

Популярным вариантом является Apache Solr :

Его основные функции включают в себя мощный полнотекстовый поиск, выделение нажатия, граненый поиск, динамическая кластеризация, интеграция с базой данных, богатый документ (например, Word, PDF) обработка и геопространственный поиск. Солр очень масштабируемый, обеспечивающий распределенный поиск и индекс репликации, и это полномочия функции поиска и навигации многие из крупнейших в мире интернет сайты.

Существует библиотека Solr для PHP , с которой можно начать, не говоря уже о целой сети, полной ресурсов, связанных с Solr.

0 голосов
/ 09 августа 2011

Как вы сказали, что вы используете PDO для подключения к базе данных, рекомендуется использовать команды SQL, не относящиеся к конкретным поставщикам, поскольку одной из основных функций PDO является возможность использовать разные СУБД, не меняя при этом никаких изменений. Команда SQL.

Чтобы написать простую, не зависящую от поставщика функцию поиска для использования PDO, вы можете использовать оператор SQL LIKE . Пример SQL-запроса будет выглядеть примерно так:

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern

Обязательно выделите разные поисковые термины, введенные пользователем, и запустите поиск по каждому слову, которое вы хотите найти. Кроме того, при поиске в нескольких столбцах обязательно отфильтруйте дублированные записи.

Другая вещь, на которую следует обратить внимание при использовании PDO, заключается в том, что %, необходимый для оператора LIKE, следует добавлять в данные $sth->execute(), а не в обычную строку SQL. Для получения дополнительной информации см. stackoverflow вопрос.

Вот пример сценария, как может выглядеть простая функция поиска с использованием простого ANSI SQL:

$searchterm = trim($searchterm);
    $searchterm = explode(' ', $searchterm);
    $this->sql = "SELECT ID 
        FROM ".$db_prefix."_base
        WHERE article_content_title_".$lang."
        LIKE :string1
        OR
        article_content_text_".$lang."
        LIKE :string2";
    foreach ($searchterm as $value) {
        $this->sth = $dbh_pdo->prepare($this->sql);
        $this->sth->execute(array(':string1' => "%$value%", ':string2' => "%$value%"));
        $this->sth->setFetchMode(PDO::FETCH_ASSOC);
        while ($this->row = $this->sth->fetch()) {      
            $this->id[] = $this->row['ID'];

        }
    }
    $this->id = array_unique($this->id);
    $this->id = array_merge($this->id);
    for ($i = 0; $i < count($this->id); $i++) {
        if ($i == count($this->id) - 1) {
            $this->searchResultID .= "id = ".$this->id[$i];
        }
        else {
            $this->searchResultID .= "id = ".$this->id[$i]." OR ";
        }
    }

Обратите внимание, что это очень базовая функция поиска, без оценки результатов поиска, в том числе (например, выделение совпадающих терминов, основание, поиск синонимов и т. Д.)

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