MySQL FULLTEXT Indexing and Searching
MySQL has supported
FULLTEXT indexes since version
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
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 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 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.
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:
- Searches are not case sensitive
- Short words are ignored, the default minimum length is 4 characters. You can change the min and max word length with the variables
- Words called stopwords are ignored, you can specify your own stopwords, but default words include the, have, some - see default stopwords list.
- You can disable stopwords by setting the variable
ft_stopword_fileto an empty string.
- Full Text searching is only supported by the
- If a word is present in more than 50% of the rows it will have a weight of zero. This has advantages on large datasets, but can make testing difficult on small ones.
Do you have any other good tips for fulltext searching and indexing in MySQL?
Like this? Follow me ↯Tweet Follow @pfreitag
MySQL FULLTEXT Indexing and Searching was first published on September 29, 2005.
If you like reading about mysql, fulltext, indexing, search, databases, or sql then you might also like:
- Sphinx - Open Source SQL Full Text Search Engine
- Updated SQL Reserved Words Checker
- SQL to Select a random row from a database table
- Insert Delayed with MySQL
- Multiple Inserts with MySQL
- SQL Reserved Key Words Checker Tool
- Order by NULL Values in MySQL, Postgresql and SQL Server
- Cheat Sheet for SQL Server