Как да направите FULLTEXT търсене в CMS на CodeIgniter

Напоследък в Habré се появяват все повече и повече публикации, посветени на рамката CodeIgniter, която набира популярност. Това е доста проста и удобна рамка, с която можете бързо да започнете да правите нормални приложения в PHP. Под изрезката е пример за внедряване на FULLTEXT търсене в CMS на CodeIgniter.

1. Подготовка на CodeIgniter.

Изтеглете и разопаковайте разпространението на CodeIgniter в някоя папка на вашия сървър. Ние създаваме база данни, потребител с права на достъп до тази база данни и задаваме настройките за връзка в application/config/database.php. Отворете application/config/config.php и задайте настройката на полето base_url.

2. Настройка на база данни.

Вече сме създали базата данни в първата стъпка, но нямаме таблици. Нека създадем проста таблица, наречена страници.

CREATE TABLE pages ( >int (10) UNSIGNED NOT NULL AUTO_INCREMENT, url text NOT NULL, title text NOT NULL, content text NOT NULL, updated datetime NOT NULL, PRIMARY KEY (id), FULLTEXT KEY content (content) ) ENGINE=MyISAM

* Този изходен код беше подчертан с инструмента за открояване на изходния код.

При използване на FULLTEXT е необходимо да посочим всички полета, по които ще търсим. В тази таблица търсенето ще се извършва само по полето за съдържание. Имайте предвид, че FULLTEXT търсенията работят само с помощта на двигателя MyISAM.

3. Данни от теста

За да тестваме нашата търсачка, трябва да добавим някои тестови данни към таблицата. Реших, че Wikipedia може да бъде добър донор за нашата база данни. Написах малък скрипт, който взема няколко скорошни статии и след това импортира тези статии в базата данни с помощта на експортиране на Wikipedia.4. Търсене в база данниЗа търсенето ще използваме SQLзаявка като:

SELECT * FROM pages WHERE MATCH (content) AGAINST ( 'test' ) > 0

* Този изходен код беше подчертан с инструмента за открояване на изходния код.

Има няколко ограничения, които трябва да имате предвид, когато използвате FULLTEXT търсения.

  • Дължината на заявката трябва да надвишава 3 знака, в противен случай търсенето ще върне празен резултат.
  • Има набор от стоп думи, които MySQL игнорира при търсене ('the', 'however', 'hello'). Ако се опитате да търсите тези думи, резултатът от търсенето ще бъде празен.
  • Предлага се и разширено търсене. Пълните подробности могат да бъдат намерени в документацията на MySQL.

5. CodeIgniter и MVC модел.

Да се ​​върнем към нашата рамка. CodeIgniter предоставя популярния шаблон за проектиране на модел-изглед-контролер (MVC модел-изглед-контролер). Нека ви напомня основните правила:

  • Всички промени и работа с базата данни се извършват от модела
  • Нищо не може да се покаже на потребителя от контролера или модела
  • Само един израз може да бъде в стенограмите на PHP)
Ако нарушите някое от тези правила, струва си да се върнете назад и да преосмислите структурата на вашия проект. Нека започнем да разработваме търсенето от файла на модела. Използвам само един метод, който прави търсене. Може да забележите, че тук се използва "директна SQL заявка", въпреки че CodeIgniter има ActiveRecord, за да улесни заявките. По-долу е кодът за модела, намиращ се в application/models/page_model.php

клас Page_model разширява модела функция Page_model() родител::Модел(); // Прави базата данни достъпна във всички функции $ this ->load->database(); > функция за търсене ($terms) // Изпълнение на заявка и връщане на резултат $sql = "ИЗБЕРЕТЕ url,заглавие ОТ страници КЪДЕ СЪОТВЕТСТВИЕ (съдържание) СРЕЩУ (?) > 0" ; $query = $ this ->db->query($sql, array($terms, $terms)); return $query->result(); > >

* Този изходен код беше подчертан с инструмента за открояване на изходния код.

php $ това- > натоварване- > помощник ('форма'); ? > php echo form_open ($ this- > uri- > uri_string); ? > php echo form_label ( 'Търсене:', 'поле за търсене'); ? > php echo form_input ( масив ( 'име' = > 'q', ' >> 'поле за търсене', 'стойност' = > $search_terms)); ? > php echo form_submit ('търсене', 'Търсене'); ? > php ехо form_close (); ? > php if ( ! is_null ($ results )) : ? > php if ( count ($ results )) : ? > ul > php foreach ($ резултати като $ резултат) : ? > li > a href ="&# 60 ;? php echo $ result- > url; ? > " > php echo $ резултат- > заглавие; ? > a > li > php endforeach ? > ul > php else: ? > p > em > Няма резултати за вашето запитване. em > p > php endif? > php endif? >

* Този изходен код беше подчертан с инструмента за открояване на изходния код.

class Pages extends Controller function search($search_terms = '' ) // Ако формата е изпратена, препишем URL, добавен в реда на заявката // обърнете внимание, че някои символи // могат да бъдат проблеми. if ($ this ->input->post( 'q' )) redirect( '/pages/search/' . $ this ->input->post( 'q' )); > if ($search_terms) // Зареждане на модели и изпълнение на търсене по БД $ this ->load->model( 'page_model' ); $results = $ this ->page_model->search($search_terms); > // Изтегляне на вид файл и извод на екрана $ this ->load->view( 'search_results' , array( 'търсени_термини' => $search_terms, 'results' => @$резултати )); > >

* Този изходен код беше подчертан с инструмента за открояване на изходния код.

* Този изходен код беше подчертан с инструмента за открояване на изходния код.

Сега имаме работещ прототип. Не забравяйте, че вашата база данни трябва да има данни (поне 3 реда). Сега въведете в браузъра си нещо като „http://localhost/index.php/pages/search“, въведете някакъв текст, съдържащ се в базата данни, в лентата за търсене и щракнете върху търсене. Резултатът ще изглежда така:

6. Добавяне на нови функции към нашето търсене.

Първо, нека добавим пагинация за резултатите от търсенето. CodeIgniter използва класа Pagination за показване на пагинация. Ние модифицираме нашия модел, за да показваме страници. За да направим това, трябва да зададем броя на записите, избрани от базата данни, номера на записа, от който да избираме, и също така да получим общия брой записи за тази заявка. Ето какво имаме:

class Page_model extends Model function search($terms, $start = 0, $results_per_page = 0) // Задаване на ограничението на записа за избор //и начална позиция if ($results_per_page > 0) $limit = "LIMIT $start, $results_per_page" ; > друго $лимит = '' ; > // Изпълнение на SQL заявка $sql = "ИЗБЕРЕТЕ url, заглавие, съдържание ОТ страници КЪДЕ СЪОТВЕТСТВИЕ (съдържание) СРЕЩУ (?) > 0 $limit" ; $query = $ this ->db->query($sql, array($terms, $terms)); върни $query->result(); > функция count_search_results($terms) // Изпълнение на SQL за преброяване на общия брой резултати от търсене $sql = "SELECT COUNT(*) AS count FROM pages WHERE MATCH (content) AGAINST (?)" ; $query = $this->db->заявка($sql, масив($terms)); върни $query->row()->count; > >

* Този изходен код беше подчертан с инструмента за открояване на изходния код.

class Pages extends Controller function search($search_terms = '', $start = 0) // Ако формулярът е изпратен, пренапишете URL адреса, като добавите низа на заявката // имайте предвид, че някои // символи може да са проблем. if ($ this ->input->post( 'q' )) redirect( '/pages/search/' . $ this ->input->post( 'q' )); > if ($search_terms) // Определяне на колко резултата //изход на страница $results_per_page = $ this ->config->item( 'results_per_page' ); // Зареждане на модел, търсене, определяне // колко резултати от търсенето $ this ->load->model( 'page_model' ); $results = $ this ->page_model->search($search_terms, $start, $results_per_page); $total_results = $ това ->page_model->count_search_results($search_terms); // Зареждане на страниране $ this ->_setup_pagination( '/pages/search/' . $search_terms . '/' , $total_results, $results_per_page); // Определете какви резултати да изведете $first_result = $start + 1; $последен_резултат = min($start + $results_per_page, $total_results); > // Зареждане на изглед и показване на резултати $ this ->load->view( 'search_results' , array( 'search_terms' => $search_terms, 'first_result' => @$first_result, 'last_result' => @$last_result, 'total_results' = > @ $total_results, 'results' => @$results )); > function _setup_pagination($url, $total_results, $results_per_page) // Не забравяйте да заредите пагинацията $ this ->load->library( 'pagination' ); $uri_segment = count(explode( '/' ,$url)); // Инициализация на страничната навигация и инсталация // необходимите параметри $ this ->pagination->initialize(array( 'base_url' => site_url($url), 'uri_segment' => $uri_segment, 'total_rows' => $total_results, 'per_page' => $results_per_page )); > >

* Този изходен код беше подчертан с инструмента за открояване на изходния код.

* Този изходен код беше подчертан с инструмента за открояване на изходния код.

php $ това- > натоварване- > помощник (масив ('форма', 'търсене')); ? > php echo form_open ($ this- > uri- > uri_string); ? > php echo form_label ( 'Търсене:', 'поле за търсене'); ? > php echo form_input ( масив ( 'име' = > 'q', ' >> 'поле за търсене', 'стойност' = > $search_terms)); ? > php echo form_submit ('търсене', 'Търсене'); ? > php ехо form_close (); ? > php if ( ! is_null ($ results )) : ? > php if ( count ($ results )) : ? > p > Показани са резултати от търсенето за 'php echo $search_terms; ? > ' (php echo $ first_result ; ? > – php echo $ last_result ; ? > of php echo $ total_results ; ? > ): p > ul > php foreach ($ резултати като $ резултат) : ? > li > a href ="&# 60 ;? php echo $ result- > url; ? > " > php echo search_highlight ($ резултат- > заглавие, $търсени_термини); ? > a > br /> php echo search_extract ($ резултат- > съдържание, $търсени_термини); ? > li > php endforeach ? > ul > php echo $ this- > пагинация- > create_links(); ? > php else: ? > p > em > Няма резултати за вашето запитване. em > p > php endif? > php endif? >

* Този изходен код беше подчертан с инструмента за открояване на изходния код.

И така нови резултати от търсенето:

7. Още вкусен чипс.

CodeIgniter предоставя възможност за показване на тестови данни и различна допълнителна информация. Например, ето как можете да проведете тест за модел:

// Маркирайте началото на търсенето $ this ->benchmark->mark( 'search_start' ); // Заредете модела, извършете търсенето и установете общия // брой резултати $ this ->load->model( 'page_model' ); $results = $ this ->page_model->search($search_terms, $start, $results_per_page); $total_results = $ това ->page_model->count_search_results($search_terms); // Маркирайте края на търсенето $ this ->benchmark->mark( 'search_end' );

* Този изходен код беше подчертан с инструмента за открояване на изходния код.