2009-07-14 1 views
24

MySQLのFULLTEXTインデックスを使用してPHP Webアプリケーションの検索サポートを追加しようとしています。MySQL FULLTEXTが動作しない

私はテストテーブルを作成し(MyISAMタイプを使用し、1つのテキストフィールドa)、サンプルデータを入力しました。今私が正しい場合、次のクエリは両方の行を返す必要があります:

SELECT * FROM test WHERE MATCH(a) AGAINST('databases') 

ただし、それは何も返しません。私は少しの研究を行いました。私が知る限り、テーブルはMyISAMテーブルであり、FULLTEXTインデックスが設定されています。私はプロンプトからphpMyAdminからクエリを実行しようとしましたが、運がありません。私は何かが欠けている?


UPDATE:コーディのソリューションは、私のテストケースで働いていた間、[OK]を、私の実際のテーブルの上に動作していないよう:

CREATE TABLE IF NOT EXISTS `uploads` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` text NOT NULL, 
    `size` int(11) NOT NULL, 
    `type` text NOT NULL, 
    `alias` text NOT NULL, 
    `md5sum` text NOT NULL, 
    `uploaded` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

そして、私が使用しているデータ:

INSERT INTO `uploads` (`id`, `name`, `size`, `type`, `alias`, `md5sum`, `uploaded`) VALUES 
(1, '04 Sickman.mp3', 5261182, 'audio/mp3', '1', 'df2eb6a360fbfa8e0c9893aadc2289de', '2009-07-14 16:08:02'), 
(2, '07 Dirt.mp3', 5056435, 'audio/mp3', '2', 'edcb873a75c94b5d0368681e4bd9ca41', '2009-07-14 16:08:08'), 
(3, 'header_bg2.png', 16765, 'image/png', '3', '5bc5cb5c45c7fa329dc881a8476a2af6', '2009-07-14 16:08:30'), 
(4, 'page_top_right2.png', 5299, 'image/png', '4', '53ea39f826b7c7aeba11060c0d8f4e81', '2009-07-14 16:08:37'), 
(5, 'todo.txt', 392, 'text/plain', '5', '7ee46db77d1b98b145c9a95444d8dc67', '2009-07-14 16:08:46'); 

私は今実行しているクエリは次のとおりです。

SELECT * FROM `uploads` WHERE MATCH(name) AGAINST ('header' IN BOOLEAN MODE) 

行3、header_bg2.pngが返されます。代わりに空の結果セットがもう1つ得られます。ブール検索のための私のオプションは以下の通りです:

mysql> show variables like 'ft_%'; 
+--------------------------+----------------+ 
| Variable_name   | Value   | 
+--------------------------+----------------+ 
| ft_boolean_syntax  | + -><()~*:""&| | 
| ft_max_word_len   | 84    | 
| ft_min_word_len   | 4    | 
| ft_query_expansion_limit | 20    | 
| ft_stopword_file   | (built-in)  | 
+--------------------------+----------------+ 
5 rows in set (0.02 sec) 

「ヘッダは」単語の長さの制限の範囲内であり、私はそれがストップワード(私はリストを取得するかどうかはわかりません)だ疑い。何か案は?

+0

ストップワードの一覧は、https://dev.mysql.com/doc/refman/5で確認できます。5/en/fulltext-stopwords.html、innodb http://dev.mysql.com/doc/refman/5.7/en/innodb-ft-default-stopword-table.htmlまたはSELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORDを実行します。 –

答えて

46

など、より完全な機能を備えたパッケージは、より多くのデータを追加することを検討してください検索するフルテキストに大きく依存しているために起こっている場合。デフォルトでは、テーブル内の行の50%以上にある単語は無視され、「ノイズ」とみなされます。

テーブルの行数が非常に少ないため、この50%の制限を頻繁に使用するのが一般的です(つまり、2つの行がある場合は、すべての行が行の50%以上です)。

+0

+1。答えを探しているうちにしばらく時間を節約しました。 –

+3

50ルールを無視するブールモード(MySQL4.1 +)を使用していない限り。 – TheCarver

+0

+1こちらからも、説明をいただきありがとうございます –

23

MySQLフルテキスト検索には、自然言語モードとブールモードの2つのモードがあります。自然言語モードの制限は、 "行の50%以上に存在する単語は共通であり、一致しないとみなされます。フルテキスト検索は、修飾語が与えられていなければ自然言語検索です。"自然言語がデフォルトモードです。これは、全文のドキュメントに記載されています:

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

ブールモードを使用してクエリを切り替える場合:

SELECT * FROM test WHERE MATCH(a) AGAINST('databases' IN BOOLEAN MODE) 

次に、2つの行が返されます。

ブールモードには独自の制限があります.1つは、関連性の順に行を戻さないということです。全体的に、それは自然言語モードよりも多くの機能と柔軟性を提供するので、おそらくそれを使用することになります。

あなたのアプリケーションを使用すると、Lucene/SolrSphinx

+0

ありがとう、私は50%のルールについては気づいていません:) – Ross

+1

あなたが私に尋ねると、これははるかに良い答えです。 – TheCarver