MySQL FULLTEXT Indexing and Searching

by Pete Freitag

MySQL has supported FULLTEXT indexes since version 3.23.23. VARCHAR and TEXT Columns that have been indexed with FULLTEXT can be used with special SQL statements that perform the full text search in MySQL.

To get started you need to define the FULLTEXT index on some columns. Like other indexes, FULLTEXT indexes can contain multiple columns. Here's how you might add a FULLTEXT index to some table columns:

ALTER TABLE news ADD FULLTEXT(headline, story);

Once you have a FULLTEXT index, you can search it using MATCH and AGAINST statements. For example:

SELECT headline, story FROM news
WHERE MATCH (headline,story) AGAINST ('Hurricane');

The result of this query is automatically sorted by relevancy.

MATCH

The MATCH function is used to specify the column names that identify your FULLTEXT collection. The column list inside the MATCH function must exactly match that of the FULLTEXT index definition, unless your search in boolean mode (see below).

AGAINST

The AGAINST function is where your full text search query goes. Besides the default natural language search mode, you can perform boolean mode searches, and use query expansion.

Boolean Mode Searches

SELECT headline, story FROM news
WHERE MATCH (headline,story)
AGAINST ('+Hurricane -Katrina' IN BOOLEAN MODE);

The above statement would match news stories about hurricanes but not those that mention hurricane katrina.

See the MySQL documentation on Boolean Mode searches for more info.

Query Expansion

The Blind Query Expansion (or automatic relevance feedback) feature can be used to expand the results of the search. This often includes much more noise, and makes for a very fuzzy search.

In most cases you would use this operation if the users query returned just a few results, you try it again WITH QUERY EXPANSION and it will add words that are commonly found with the words in the query.

SELECT headline, story FROM news
WHERE MATCH (headline,story)
AGAINST ('Katrina' WITH QUERY EXPANSION);

The above query might return all news stories about hurricanes, not just ones containing Katrina.

A couple points about Full-Text searching in MySQL:

Do you have any other good tips for fulltext searching and indexing in MySQL?

Comments

www.d06.net

hmmm. thanks...

www.d06.net

hmmm. thanks...

Mihaela Ozhan

Never forget-Arkadas means friendship in Turkish. Arkadas Real Estate Agents will help you find your dream holiday property in Turkey and will also become your friends-ready to help you when you need it. Choose Arkadas Real Estate for hassle-free holiday home ownership for your Kusadasi investment.

Michael Brennan-White

Pete, Thanks for this article. I was going crazy trying to figure out why I could do a search for WalMart but not CVS.

madhu

how can we highlight the search result in php.plsss tel me the code

Michael

Stop this foolishness. Look into Sphinx project, which is orders of magnitude better and faster, with only a bit more pain to set up.

AMIT

hi all, i just want to know whether it is useful to alter the 50% threshold scheme that mysql uses by default ,is it beneficial in any way regarding serach(either by increasing or decreasing its value)or is it good to use default value of 50% only. which is better (altering the file to change 50% value or using default 50 %) thanx and regards

web

This tutorial is simple and straight forword, i plan to use it on my site http://www.spiralteck.com .I wish all tutorials could be this simple.

sainul

I have one error Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\test\search2.php on line 35 my code is <html> <head> <body> <form name="form" action="search2.php" method="get"> <input type="text" name="q" /> <input type="submit" name="Submit" value="Search" /> </form> <?php $var = @$_GET['q'] ; $trimmed = trim($var); $quary = "'%".$trimmed."%'"; $select = "SELECT *, MATCH(news) AGAINST('$trimmed') AS score FROM articles WHERE MATCH(news) AGAINST('$trimmed') ORDER BY score DESC"; $con =mysql_connect("localhost","search","123456"); if(!con) { die ("Database not connected"); } else { mysql_select_db ("omassery", $con); echo $result = mysql_query ($select, $con); } while ($row = mysql_fetch_array ($result)) { echo $row['news']."<br>"; } ?> </body> </html>

Nilesh

Thanks for post this article but i have an issue please explain with complete example with complete search. Indexing what roll play in search and how to use please active it asap am a waiting.

Ram Bahadur Nepal

how would we find related search keywords? For ex: search keyword is 'toyota', it shows results included where it's included "toyota,toyota corolla, toyota handbook" etc. And how would we show a bunch of related search keywords "toyota corolla","toyota handbook" ?

Sunny

Thanks, Helped me indeed !!

Samuel

Thanks heaps, It helped a lot!