RkBlog

Hardware, programming and astronomy tutorials and reviews.

Pełnotekstowe wyszukiwanie

Opis pełnotekstowego wyszukiwania w bazie MySQL za pomocą wbudowanego mechanizmy tabel MyISAM

Baza MySQL posiada coś takiego jak full-text search czyli lepszą wersję szukania od LIKE. Opis można znaleźć tutaj. Zaletą takiego systemu wyszukiwania jest to że zwrócone wiersze mają wartość oznaczającą trafność wiersza do zapytania (jak google - na początku najlepsze trafienia dla szukanej frazy)

Jak to działa i jak to wykorzystać?

Nasz blog ma tabelę kurs_news. By móc korzystać z wyszukiwania pełnotekstowego należy wykonać zapytanie (phpMyAdmin zakładka "SQL" albo $this->db->query() w CI):
ALTER TABLE kurs_news ADD FULLTEXT(news_title, news_text);
Gdzie FULLTEXT(news_title, news_text) określa kolumny, których takie wyszukiwanie ma dotyczyć. W naszym przypadku tytuł i treść newsa.
W kontrolerze blog w metodzie search mamy zapytanie:
$query = $this->db->query("SELECT * FROM ".$this->db->dbprefix."news WHERE news_text LIKE '%".$fraza."%' OR news_title LIKE '%".$fraza."%'");
Które wystarczy zastąpić:
<?php
$query = $this->db->query("SELECT *, MATCH(news_title, news_text) AGAINST ('".$fraza."') AS score FROM ".$this->db->dbprefix."news WHERE MATCH(news_title, news_text) AGAINST ('".$fraza."') ORDER BY score DESC");
Teraz tak:
SELECT * FROM tabela WHERE MATCH(pole, pole) AGAINST ('szukana fraza')
To podstawowa wersja zapytania korzystającego z tego typu wyszukiwania. MATCH(pole, pole) musi zawierać te same pola, które podaliśmy tworząc FULLTEXT. W naszym zapytaniu mamy coś takiego:
SELECT *, MATCH(news_title, news_text) AGAINST ('".$fraza."') AS score
Dodanie elementu MATCH-AGAINST w SELECT umożliwia nam pobranie wartości trafności wyniku (liczba), co wykorzystujemy do posortowania wyników od najlepszego trafienia (malejąco, nalepszy wiersz ma najwyższą notę).
Nasza wyszukiwarka powinna działać i dawać lepsze rezultaty. Najlepiej to widać gdy mamy dużo wpisów o określonej tematyce.

Conieco o logice wyszukiwania pełnotekstowego

- Wyszukiwarka może zwrócić wiersze (zazwyczaj tak robi), które nie zawierają szukanej frazy lecz ich tekst jest "podobny".
- Wyszukiwarka może nie zwrócić żadnych wyników dla mało popularnych fraz (względem tego co jest w bazie)
- Wyszukiwarka zacznie sensownie działać gdy w bazie pojawi się kilkanaście i więcej wpisów (i to nie zupełnie różnych).
RkBlog

14 July 2008;

Comment article