gpt4 book ai didi

ubuntu 上的 mysql ft_min_word_len 更改不起作用

转载 作者:行者123 更新时间:2023-11-29 05:24:29 26 4
gpt4 key购买 nike

我正在尝试实现完整的测试搜索。为此,我所做的第一件事是将/etc/mysql/my.cnf 上的 ft_min_word_len = 2 的值更改为

[mysqld]
#
# * Basic Settings
#

#
# * IMPORTANT
# If you make changes to these settings and your system uses apparmor, you may
# also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.
#
ft_min_word_len = 2

现在保存并重新启动服务器。我知道,如果我已经在表中有一个带有 FULLTEXT 的索引,我将需要删除索引并重建或修复表。但是我已经将表创建为

create table 
`comments`
( `id` int(11),
`comment` varchar(200),
`iduser` int(11) ,
`date_added` datetime
)
ENGINE=MyISAM;

ALTER TABLE comments
ADD FULLTEXT INDEX comment_index
(comment);

然后在上表中我手动添加了一些注释。

当我尝试搜索某些内容时

SELECT * FROM comments where MATCH (comment) AGAINST ('the') ; // "the" is very common word of length to see my test result

它返回 0 行。

但是,如果我将 AGAINST 设置为 4 个字长,它就会起作用。

我尝试将 ft_ 变量检查为

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) |
+--------------------------+----------------+

有趣的是在 /etc/mysql/my.cnf 我只能看到 ft_min_word_lenft_max_word_len 不存在,更重要的是长度小于 4 的搜索根本不起作用。

这让我发疯了,不确定是否有其他配置覆盖了所有内容并且似乎也无法找到它们。

如有任何帮助,我们将不胜感激。

我开发机上的Mysql版本是

mysql  Ver 14.14 Distrib 5.1.63, for debian-linux-gnu (i686) using readline 6.2  

最佳答案

我能够找到问题并进行修复。

全文搜索设置很好,因为我想用 alt east 2 个词进行搜索,并且我有 ft_min_word_len = 2

现在,在进行更多测试时,我发现它会随机搜索几个 2 个字符的单词并忽略其他单词。

举个例子

CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
);

INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When configured properly, MySQL ...');

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('use');
Empty set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('Use');
Empty set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('you');
Empty set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('the');
Empty set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('vs.');
Empty set (0.00 sec)

但下面的工作

mysql> SELECT * FROM articles
-> WHERE MATCH (title,body) AGAINST ('run');
+----+-------------------+-------------------------------------+
| id | title | body |
+----+-------------------+-------------------------------------+
| 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... |
+----+-------------------+-------------------------------------+

所以它是另外一回事,显然找到了它的 ft_stopword_file,它有一个单词列表,如果对其中一个单词进行任何搜索,它不会执行任何操作。

列表在这里http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html

所以在这种情况下,允许任何长度至少为 2 个字符的单词搜索

  • 将 ft_min_word_len 设置为 2
  • 然后在 mysql 配置文件中,对于 debian/etc/mysql/my.cnf 添加 ft_stopword_file='path/to/stopword_file.txt'
  • 如果需要,我们可以将此文件留空。

还有一件事,一旦我们完成上述设置,我们需要重新启动 mysql,如果我们更改 ft_min_word_len,那么我们需要重建索引或修复表。

关于ubuntu 上的 mysql ft_min_word_len 更改不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21777749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com