【问题标题】:Can't get MySQL fulltext search to work无法让 MySQL 全文搜索工作
【发布时间】:2011-07-07 15:43:14
【问题描述】:

我有一张表格,我希望能够对其进行全文搜索,但我的搜索字词似乎没有得到任何点击。

这是我的表格的样子(我取出了一些我认为不重要的列):

mysql> SHOW TABLE STATUS LIKE 'transcripts';
+-------------+--------+---------+------------+--- ----------------+----------+----------------+
|姓名 |引擎 |版本 |行格式 |整理 |校验和 |创建选项 |
+-------------+--------+---------+------------+--- ----------------+----------+----------------+
|成绩单| MyISAM | 10 |动态 | latin1_swedish_ci |空 | |
+-------------+--------+---------+------------+--- ----------------+----------+----------------+

mysql> DESCRIBE 成绩单;
+-------------+---------+------+-----+---------+- ---------------+
|领域 |类型 |空 |钥匙 |默认 |额外 |
+-------------+---------+------+-----+---------+- ---------------+
|编号 |整数(11) |否 |优先级 |空 |自动增量 |
|内容 |正文 |是 | |空 | |
|原始内容 |正文 |是 |穆尔 |空 | |
|磁带 ID |整数(11) |是 | |空 | |
|状态 |整数(11) |是 | | 0 | |
| created_at |日期时间 |是 | |空 | |
|更新时间 |日期时间 |是 | |空 | |
+-------------+----------+------+-----+---------+- ---------------+

mysql> 从成绩单中显示索引;
+-------------+------------+---------+-- ------------+-------------+------------+----------- --+------------+--------+------+------------+
|表 |非唯一 |键名 | Seq_in_index |列名 |整理 |基数|子部分 |包装 |空 |索引类型 |
+-------------+------------+---------+-- ------------+-------------+------------+----------- --+------------+--------+------+------------+
|成绩单| 0 |初级 | 1 |编号 |一个 | 2 |空 |空 | | BTREE |
|成绩单| 1 |原始内容索引 | 1 |原始内容 |空 |空 |空 |空 |是 |全文 |
+-------------+------------+---------+-- ------------+-------------+------------+----------- --+------------+--------+------+------------+

证明有一行可以找到:

mysql> SELECT id, raw_content FROM transcripts;
+----+-------------+
| id | raw_content |
+----+-------------+
|  1 | foo         |
+----+-------------+

以下是我试图让搜索正常工作的尝试:

mysql> SELECT * FROM transcripts WHERE MATCH(raw_content) AGAINST ('foo');
Empty set (0.00 sec)

mysql> SELECT * FROM transcripts WHERE MATCH(raw_content) AGAINST ('foo' IN BOOLEAN MODE);
Empty set (0.00 sec)

mysql> SELECT id FROM transcripts WHERE MATCH(raw_content) AGAINST ('foo' IN NATURAL LANGUAGE MODE);
Empty set (0.00 sec)

mysql> SELECT * FROM transcripts WHERE MATCH(raw_content) AGAINST ('+foo*' IN BOOLEAN MODE);
Empty set (0.00 sec)

我做错了什么?

【问题讨论】:

  • 默认全文忽略不超过 3 个字符的单词
  • 呸,就是这样@Cfreak。您可以将其发布为答案吗?布尔模式搜索适用于较长的搜索。
  • 请注意,如果您搜索的单词出现在至少 50% 的记录中,那么在没有布尔模式的情况下,它会被忽略。更多信息在这里dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html问候;)

标签: mysql search full-text-search


【解决方案1】:

默认全文忽略不超过 3 个字符的单词

(现在应要求发布为答案:))

【讨论】:

    【解决方案2】:

    还有其他需要考虑的:

    您不仅可以更改默认长度,还可以更改停用词列表。您可能想要更改停用词,因为 MySQL 不会索引 this list of 543 words。 尝试创建自己的停用词列表并更改最小字长。

    第 1 步)创建您自己的停用词列表。您可以添加“a”、“an”和“the”。

    echo "a" > /var/lib/mysql/custom_stopwords.txt
    echo "an" >> /var/lib/mysql/custom_stopwords.txt
    echo "the" >> /var/lib/mysql/custom_stopwords.txt

    第 2 步)将这些选项添加到 /etc/my.cnf

    ft_min_word_len=2
    ft_stopword_file=/var/lib/mysql/custom_stopwords.txt

    第三步)服务mysql重启

    步骤 4) 创建新的 FULLTEXT 索引。重启 mysql 之前任何现有的 FULLTEXT 索引都应该重新索引。

    试试看!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2012-04-06
      • 2013-09-10
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      相关资源
      最近更新 更多