2012-02-15 19 views
4

私は映画「Yes、We're Open」に関する情報を含む映画データベースを持っています。mysql ft_stopword_fileを削除しても結果がありません

データベースを検索しているときに「私たちは開いています」という検索で「we're」と「open」という単語が含まれていますが、「yes」ではありませんブール値モードですべての単語が必要な場合でも(クエリが送信される前に「はい、私たちは開いています」は'+yes +we\'re +open'に変換されます)。

これは、「はい」が組み込みのストップワードリストにあるためと考えていました。しかし、ft_stopword_file = ""を設定してmysqlを再起動してから、repair table [tablename] quick私が検索しているテーブルを "yes we we open"の検索結果には表示されません。私は以下のmy.cnfを含んでいます。これはMySQLバージョン5.0.22です。何か案は? ft_stopword_file=""を追加し、

mysql> SHOW VARIABLES LIKE 'ft_%'; 
+--------------------------+----------------+ 
| Variable_name   | Value   | 
+--------------------------+----------------+ 
| ft_boolean_syntax  | + -><()~*:""&| | 
| ft_max_word_len   | 84    | 
| ft_min_word_len   | 2    | 
| ft_query_expansion_limit | 20    | 
| ft_stopword_file   | (built-in)  | 
+--------------------------+----------------+ 
5 rows in set (0.00 sec) 

mysql> SELECT title, MATCH(title,description,genre,country) AGAINST (' +yes +we\'re +open' IN BOOLEAN MODE) as title_description_genre_country_score FROM `films` WHERE MATCH(title,description,genre,country) AGAINST (' +yes +we\'re +open' IN BOOLEAN MODE) AND `hidden` <> '1' ORDER BY `title_description_genre_country_score` DESC ; 
+-----------------+---------------------------------------+ 
| title   | title_description_genre_country_score | 
+-----------------+---------------------------------------+ 
| Yes, We?re Open |          1 | 
| Present/Future |          1 | 
+-----------------+---------------------------------------+ 
2 rows in set (0.00 sec) 

.... [編集]のmy.cnfファイルでストップワード内蔵 -

#1:

[mysqld] 
query-cache-type = 1 
query-cache-size = 8M 
max_allowed_packet=500M 
ft_min_word_len=2 
ft_stopword_file = "" 

[myisamchk] 
ft_min_word_len=2 

set-variable=local-infile=0 
datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
# Default to using old password format for compatibility with mysql 3.x 
# clients (those using the mysqlclient10 compatibility package). 
# old_passwords=1 

skip-bdb 

set-variable = innodb_buffer_pool_size=2M 
set-variable = innodb_additional_mem_pool_size=500K 
set-variable = innodb_log_buffer_size=500K 
set-variable = innodb_thread_concurrency=2 
[mysql.server] 
user=mysql 
basedir=/var/lib 

[mysqld_safe] 
log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid 
skip-bdb 

set-variable = innodb_buffer_pool_size=2M 
set-variable = innodb_additional_mem_pool_size=500K 
set-variable = innodb_log_buffer_size=500K 
set-variable = innodb_thread_concurrency=2 

編集:ここではいくつかのサンプルクエリです。 ....

#2ストップワードファイルなし

mysql> SHOW VARIABLES LIKE 'ft_%'; 
+--------------------------+----------------+ 
| Variable_name   | Value   | 
+--------------------------+----------------+ 
| ft_boolean_syntax  | + -><()~*:""&| | 
| ft_max_word_len   | 84    | 
| ft_min_word_len   | 2    | 
| ft_query_expansion_limit | 20    | 
| ft_stopword_file   |    | 
+--------------------------+----------------+ 
5 rows in set (0.00 sec) 

mysql> REPAIR TABLE `films` QUICK; 
+-------------------------+--------+----------+----------+ 
| Table     | Op  | Msg_type | Msg_text | 
+-------------------------+--------+----------+----------+ 
| db.films    | repair | status | OK  | 
+-------------------------+--------+----------+----------+ 
1 row in set (0.14 sec) 

mysql> SELECT title, MATCH(title,description,genre,country) AGAINST (' +yes +we\'re +open' IN BOOLEAN MODE) as title_description_genre_country_score FROM `films` WHERE MATCH(title,description,genre,country) AGAINST (' +yes +we\'re +open' IN BOOLEAN MODE) AND `hidden` <> '1' ORDER BY `title_description_genre_country_score` DESC ; 
Empty set (0.00 sec) 

EDIT#2:表を作成します。

mysql> SHOW CREATE TABLE db.films\G; 
*************************** 1. row *************************** 
Table: films 
Create Table: CREATE TABLE `films` (
    `id` varchar(8) NOT NULL default '', 
    `title` varchar(255) default NULL, 
    `hidden` tinyint(1) default '0', 
    `featured` tinyint(1) default NULL, 
    `type` varchar(255) default NULL, 
    `subtype` varchar(255) default NULL, 
    `summary` text, 
    `description` text, 
    `image_url` varchar(255) default NULL, 
    `trailer_url` varchar(255) default NULL, 
    `slug` varchar(255) default NULL, 
    `category` varchar(255) default NULL, 
    `parent` varchar(255) default NULL, 
    `related` varchar(255) default NULL, 
    `sponsor` varchar(255) default NULL, 
    `genre` varchar(255) default NULL, 
    `country` varchar(255) default NULL, 
    `copresenters` varchar(255) default NULL, 
    `original_title` varchar(255) default NULL, 
    `director` varchar(255) default NULL, 
    `executive_producer` varchar(255) default NULL, 
    `producer` varchar(255) default NULL, 
    `cinematographer` varchar(255) default NULL, 
    `writer` varchar(255) default NULL, 
    `editor` varchar(255) default NULL, 
    `sound` varchar(255) default NULL, 
    `cast` varchar(255) default NULL, 
    `language` varchar(255) default NULL, 
    `trt` varchar(255) default NULL, 
    `year` varchar(255) default NULL, 
    `subtitles` varchar(255) default NULL, 
    `format` varchar(255) default NULL, 
    `color` varchar(255) default NULL, 
    `premiere_status` varchar(255) default NULL, 
    PRIMARY KEY (`id`), 
    KEY `id` (`id`), 
    KEY `type` (`type`), 
    KEY `subtype` (`subtype`), 
    KEY `slug` (`slug`), 
    KEY `category` (`category`), 
    KEY `parent` (`parent`), 
    KEY `hidden` (`hidden`), 
    KEY `featured` (`featured`), 
    KEY `copresenters` (`copresenters`), 
    KEY `original_title` (`original_title`), 
    KEY `director` (`director`), 
    KEY `executive_producer` (`executive_producer`), 
    KEY `producer` (`producer`), 
    KEY `cinematographer` (`cinematographer`), 
    KEY `writer` (`writer`), 
    KEY `editor` (`editor`), 
    KEY `sound` (`sound`), 
    KEY `cast` (`cast`), 
    KEY `language` (`language`), 
    KEY `trt` (`trt`), 
    KEY `year` (`year`), 
    KEY `subtitles` (`subtitles`), 
    KEY `format` (`format`), 
    KEY `color` (`color`), 
    KEY `premiere_status` (`premiere_status`), 
    FULLTEXT KEY `title` (`title`), 
    FULLTEXT KEY `summary` (`summary`), 
    FULLTEXT KEY `description` (`description`), 
    FULLTEXT KEY `genre` (`genre`), 
    FULLTEXT KEY `country` (`country`), 
    FULLTEXT KEY `title,description` (`title`,`description`), 
    FULLTEXT KEY `title,description,genre,country` (`title`,`description`,`genre`,`country`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 
+1

問題を示すクエリ(および結果)を追加してください。 – wallyk

+1

"SHOW VARIABLES LIKE 'ft_%';"を実行します。現在の設定を取得します。 –

+0

@wallyk上記のクエリと結果をいくつか追加しました。詳細が必要な場合はお知らせください。 – jessica

答えて

2

空の文字列( '')にstopwords.txt変数を設定するには、すべてのstopword filtering無効にします。 (あなたが必要としない言葉を削除してください...)

あなたが作成したフルテキスト検索のインデックスは、新しいものから削除して作成する必要があります。

この変数またはストップワードファイルの内容を変更した後は、FULLTEXTインデックスを再構築する必要があります。

次に、REPAIR TABLE tbl_name QUICKを使用します。

+0

自分のサイトの検索の大部分が正確な映画のタイトルであるため、ストップワードは必要ありません。元の質問を見ると、ストップワードファイルを変更するたびにREPAIR TABLE tbl_name QUICKを実行したことがわかります。 – jessica

+0

新しい索引を破棄して作成しましたか?フルテキスト検索? REPAIR TABLEを再度確認してください。 –

0

InnoDBがテーブルの修復をサポートしていません(あなたがクイック修復のテーブルtbl_nameを行うときにノートを見ることができます。)

それはREADが低下する可能性がありますが、私はdoundしている唯一の解決策は、MyISAMテーブルにエンジンを変更することですまたは書き込み性能。 MySQLではフルテキストストップワードを無効にする方法

のmy.iniテキストファイル(MySQLの)中:

ft_stopword_file = "" or link an empty file "empty_stopwords.txt" 
ft_min_word_len = 2 

//あなたの最小の長さを設定しますが、短い言葉(3,2ことに注意してください)は、特に全文インデックス付き列フィールドが大きい場合は、クエリ時間を劇的に増加させます。

ファイルを保存して、サーバーを再起動します。

次のステップは、このクエリを使用してインデックスを修復する必要があります:あなたのテーブルはInnoDBストレージエンジンを使用している場合

REPAIR TABLE tbl_name QUICK. 

しかし、これは動作しません。あなたはMyISAMテーブルにそれを変更する必要があります:

ALTER TABLE t1 ENGINE = MyISAM; 

だから、もう一度:

1. Edit my.ini file and save 
2. Restart your server (this cannot be done dynamically) 
3. Change the table engine (if needed) ALTER TABLE tbl_name ENGINE = MyISAM; 
4. Perform repair      REPAIR TABLE tbl_name QUICK. 

はInnoDBテーブルとMyISAMのは、その速度差を持っていることに注意してください。 1つは速く、もう1つは速く書いてください(インターネットでもっと詳しく読む)

関連する問題